現在很多計算機已經配有多塊顯卡, 顯卡驅動程序可以讓多塊顯卡協同工作, 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模式下, 只有主卡可以接顯示器, 別的卡顯示器無輸出, 當然,在主卡上仍然可以使用多顯示器.