为了一致性,这里主要讨论双SLI。使用过去的DirectX(和OpenGL)API,VRAM可以在图形卡之间进行镜像。使用Dual-SLI,可以通过一张显卡渲染一帧,而另一张显卡渲染另一帧。还有一个渲染选项,其中一张显卡可以渲染屏幕的一部分。不幸的是,关于VRAM堆栈如何工作的技术信息似乎很少。图形卡或DirectX 12可以使用哪些可能的技术来实现此目的?

#1 楼

在DX12中,没有像在DX11中那样由隐式驱动程序实现的SLI。相反,多个GPU作为单个DX12设备中的单独“节点”公开给应用程序,并且每个VRAM资源都位于创建时指定的单个节点上。像DX11 SLI中一样,没有对两个GPU的资源隐式镜像。应用开发人员可以根据需要实现模式,例如在GPU之间交替帧,或在GPU之间拆分帧。例如,要实现交替的帧,应用程序必须在两个GPU上分配所有缓冲区,纹理,渲染目标等,并同时填充它们。然后,在渲染框架时,它将使用其所有资源的本地副本为当前GPU生成命令列表。应用程序需要负责任何GPU间的传输(例如,对于时间影响)。 />

评论


$ \ begingroup $
感谢您的出色回答!那么是否可以仅将纹理或几何数据分配给单个卡片?该链接似乎表明可以进行分布式计算,这是有道理的,但是对于如何或是否可以拆分几何或纹理,我仍然感到困惑。
$ \ endgroup $
–aces
16-2-19的2:12

$ \ begingroup $
@aces是的,您可以仅将几何或纹理分配给单个卡-您只需在一个节点上创建这些资源即可。每次创建资源时,都指定要放置在哪个节点上,因此可以完全控制哪些GPU获取哪些资源的副本。
$ \ endgroup $
–内森·里德(Nathan Reed)
16 Feb 19'2:20



$ \ begingroup $
这很有意义,但是在游戏中可行吗?我认为如果以某种方式这样做,则必须同步所有片段。
$ \ endgroup $
–aces
16-2-19的2:22

$ \ begingroup $
@aces“同步所有片段”吗?你让我迷路了:)
$ \ endgroup $
–内森·里德(Nathan Reed)
16-2-19的2:22

$ \ begingroup $
@aces好的,是的。如果您以某种方式跨GPU分配渲染,则必须在以后以某种方式将结果放回一起。因此,在您的示例中,渲染后,您可以将颜色和深度缓冲区从GPU2复制回GPU1,并使用GPU1将两个帧合成在一起。那会花费一些额外的时间,而这会占用您通过首先分发渲染而节省的时间,因此根据情况的不同,可能不一定会赢得总体表现。
$ \ endgroup $
–内森·里德(Nathan Reed)
16-2-19在2:33