现在很多计算机已经配有多块显卡, 显卡驱动程序可以让多块显卡协同工作, NV管这种模式叫做SLI, ATI则叫做CrossFire模式. 采用这种模式渲染速度理论上可以翻倍.  这里以ATI的两块相同卡子组成CrossFire为例, 看下如何让我们的程序可以工作在多显卡模式上. 

     首先显卡工作在CrossFire的工作模式时,两块显卡的数据是复制的,数据内容是一样的.  假如每块显卡的本地显存是2G, 那么在CrossFire模式下,可用显存仍然是2G, 工作时,有一块为主卡,其余的是副卡,渲染工作的划分有好几种,现在主流的方法是按帧交替渲染( Alternate Frame Rendering ),  具体工作时,显卡驱动程序将CPU传来的每帧绘制命令按奇偶数发往不同的显卡.这样一块显卡渲染奇数帧,一块显卡渲染偶数帧.就实现了双卡同时工作. 而且这样做两块卡的负载也比较平衡.

 

需要注意在这种工作模式下,你的程序需要工作在全屏模式下, 也就是程序要独占显示设备.

     另外一个需要注意的问题是在这种工作模式下,由于两块显卡要保存相同的数据, 因此当其中一块显卡的数据作了修改时,另外一块显卡必须同步修改,否则渲染结果会不正确. 显卡驱动有自已的一套策略来判断两块显卡的数据是否一致, 其中在程序由窗口模式时转换到全屏模式时,显卡驱动会对两块显卡的数据做一次同步操作.

但是如果在运行时动态修改了某块显卡的数据, 显卡驱动可能不能正确的进行另块显卡的数据同步. 因此在更新显卡数据时,我们需要有几块显卡,就连续更新几帧数据,比如两块显卡,我们原先用一帧进行UpdateResource,现在我们要连续两帧都要对同一资源进行更新.

 

另外我们的渲染引擎的设计要注意一些问题, 比如有些渲染需要利用前面的帧的渲染结果的等,

这里有一些会产生问题的地方:

1) Drawing to Vertex / Index Buffers
2) The use of Stream Out
3) CopyResource()
4) CopySubresourceRegion()
5) GenerateMips()
6) ResolveSubresource()

 

 

最后是本文的参考资料来自http://ati.amd.com/developer 的

<< Harnessing the Performance of CrossFireXTM >> , 有兴趣的人可以仔细看下.

 

另外在CrossFire模式下, 只有主卡可以接显示器, 别的卡显示器无输出, 当然,在主卡上仍然可以使用多显示器.

 

 

 

 

 

 

 

posted on 2012-09-19 16:33  操作系统  阅读(3980)  评论(0编辑  收藏  举报