我应该如何设计GLSL着色器以在crossfire / SLI上运行

时间:2012-10-25 15:21:41

标签: c++ glsl shader gpgpu sli

如果我正在用glsl编写可视化工具,我怎么能保证它会利用更多的gpu?开箱即用它只适用于一个,软件的哪些步骤/设计将允许像素着色器在多个卡上并行运行?

2 个答案:

答案 0 :(得分:3)

GLSL需要零步骤。 SLI / crossfire驱动程序负责为您分配GPU上的工作负载。同样适用于nVidia环绕声和AMD Eyefinity:就着色器而言,它只是一个更大的渲染目标。

请参阅nVidia的这些幻灯片:SLI in OpenGL,特别是幻灯片“干扰SLI的事情”。

您希望确保正确设置渲染循环(即调用SwapBuffers),并且至少对AFR模式SLI进行双缓冲。

答案 1 :(得分:3)

根据Jarrod的回答中的评论看起来你遇到的'问题'是AFR模式(交替帧渲染)与SFR模式(分割帧渲染),这是一个驱动模式设置问题。

在AFR模式下,驱动程序将每个整帧发送到单个GPU,并将备用帧发送到另一个GPU。这非常适合游戏和动画,您最感兴趣的是最大化帧速率并且不关心帧延迟。通过这种方式使用GPU可以轻松地为SLI提供2倍fps的加速。但是,如果您只绘制一个帧(就像您的评论中的情况一样),它只会使用一个GPU。

在SFR模式下,驱动程序将分割每个帧并渲染每个GPU上每个帧的一部分。此模式的问题是两个GPU都需要为每个帧进行所有设置,因此您不会获得2倍的加速。实际上,唯一可以加速的是片段着色器(因为每个GPU将运行一半的片段),所以如果只有50%的(单GPU)渲染时间是片段着色器,那么你只能得到(at)最好的)加速33%。由于拆分可能不平衡(因此一个GPU最终会得到大部分碎片),您可能会得到更少的收益。

由于SFR通常较慢,AFR往往是默认值。您可以通过控制面板控制AFR与SFR。