Blinue / Magpie

An all-purpose window upscaler for Windows 10/11.
GNU General Public License v3.0
8.19k stars 459 forks source link

希望可以加入多gpu运算功能 #909

Closed Sheep9341 closed 1 month ago

Sheep9341 commented 1 month ago

Expected behavior 预期的功能

对于超分辨率的高性能需求, 希望可以探索「多gpu协同」功能的可能性。 例如加入为每个缩放效果分配gpu的选项, 或者分配先后调用顺序。 这样对于(特别是Galgame)玩家而言, 就可以充分利用到多个gpu的性能。

以1280x720的画面为例子: 先让核显跑较简单的Anime4K_Upscale_S > Bicubic, 再让独显跑较复杂的Anime4K_Upscale_Denoice_UL等等。 利用多GPU分担部分负载,实现渣机更高超分辨率配置。

同时,考虑到某些玩家是远端游戏、 笔记本没有独显直连、 使用无输出接口的矿卡(例如p106)、 笔记本外接显卡回传输内屏显示 等等不从独显输出画面的情况, 期望可以自由选择gpu输出顺序, 以便做到可选让核显输出画面。

由于缺乏相关知识,我提出的想法可能不切实际或者难以实现, 但仍然想知道实现的可能性,如有不便敬请原谅

Alternative behavior (optional) 近似的功能(可选)

No response

Blinue commented 1 month ago

多 GPU 支持在 #549 讨论过。这里再深入讨论一下:

如何使用多个 GPU

  1. 能否让多个 GPU 分别渲染不同的效果?

不可行,问题在于效果是串行执行的,前一个效果的输出作为后一个效果的输入,因此即使让不同的效果在不同的 GPU 上渲染,同步问题也会强迫 GPU 串行执行。

  1. 对于有多个通道的效果,能否让不同的 GPU 分别渲染不同的通道?

这取决于通道的组织方式。有些效果的通道是串行的,出于和 1 同样的理由,多 GPU 没有意义。有些基于机器学习的效果确实可以部分并行执行。

  1. 渲染效果和渲染光标/游戏内叠加层能否在不同的 GPU 上执行?

理论上可行。

如何实现多 GPU 协同

实现上考虑,D3D11 不支持在 GPU 间共享纹理,必须以内存作为中介,因此 GPU 同步相当慢,甚至抹平并行渲染得到的性能提升;考虑到能并行的粒度很小(因为只有部分通道可以并行执行),同步会经常发生,可能反而会导致性能下降。

D3D12 对多 GPU 的支持更好,但它的开发难度很高。

结论

出于以下理由,无法实现多 GPU 支持:

  1. Magpie 的架构里能并行执行的部分很少
  2. D3D11 中多 GPU 同步代价很大,会抹平并行渲染得到的性能提升

虽然 Magpie 无法提供多 GPU 支持,使用 Sli/Crossfire 是可行的,但这两个技术好像不再支持消费级显卡了。