概述
Equalizer是一個基於OpenGL的並行渲染系統架構,其開發人員來自於瑞士的蘇黎世大學,目前最新的版本是0.3,估計近期就會發布0.4版本了。
簡 單來說,Equalizer希望構造一套基於OpenGL的圖形渲染架構,不同於渲染引擎,它通過提供對渲染環境和流程的控制,用於將串列電腦上啟動並執行 圖形應用快速的擴充到諸如多視窗、多顯卡(如SLI)、叢集系統等環境中,從而充分利用系統的並行渲染能力獲得更高的處理速度。相對於比較傳統的由 Stanford大學設計實現的Chromium 及其前身WireGL,Equalizer通過在應用程式層實現渲染的並行化,避免由於在OpenGL指令層實現並行所帶來的巨大的網路頻寬要求,因此Equalizer的效率要遠遠高於Chromium。關於Equalizer項目的建立目標及其理論可以參考相關的網站[1],
下載與安裝
這裡以Equalizer中的樣本eqPly為對象,講述如何在叢集系統內正常的部署Equalizer應用。
首先需要在www.equalizergraphics.com網 站上下載當前穩定版本源碼,或通過SVN擷取當前最新的開發版本.我的系統是windowsXP SP2,所以下載完成後在visual studio 2005下即可正常編譯,這裡需要注意的是,即時更新的開發版本常常會存在一些設定或檔案不全的問題,因此建議開始的時候還是先下載穩定版實驗.編譯會產 生幾個主要的二進位檔案,包括eqserver.exe, eqserver.dll, eqPly.exe等,編譯好的檔案輸出到/build/win32/debug下.
由於需要在命令列中執行各種指令,因此我將編譯輸出的exe與dll檔案都拷貝到自己建的d:/eqbin目錄下,然後將example/configs目錄拷貝到d:/eqbin中,該檔案夾中的eqc檔案是伺服器程式用於進行系統配置的指令檔。
Equalizer 是通過SSH實現在叢集系統內部進行遠端管理的,在windows系統構成的叢集中則依靠cygwin中的openssh實現,因此需要在叢集系統的各個 節點部署SSH,其中作為Equalizer伺服器的電腦需要配置為ssh用戶端,其它用於渲染的節點都要安裝ssh伺服器,並保證從eqalizer 伺服器可通過同一個使用者登陸所有的渲染節點電腦。關於如何在windows系統內安裝ssh,可以參考[3] 。
啟動伺服器
一切準備工作完成後,首先來啟動equalizer伺服器,在命令列視窗中進入d:/eqbin目錄,然後輸入如下指令:
eqServer configs/2-window.2d.eqc
這裡採用的配置方案為通過螢幕空間劃分將計算負載分配給兩個本地視窗,在渲染完成後將兩個視窗的畫面進行二維合成,獲得最終的畫面,也就是sort-first並行架構。
啟動用戶端
啟動另外一個命令列視窗,進入d:/eqbin目錄,然後輸入如下指令:
eqply
這時會彈出兩個視窗,共同完成一個正方形的渲染,其中一個視窗在渲染的同時接受另一個視窗的渲染結果,在與自身渲染結果一同顯示,從而得到完整的畫面。
eqply可以通過命令列參數-m及其指定的檔案載入模型檔案,並在情境中進行渲染,目前它支援ply檔案格式,相關的資料及模型請參考[4] 。這裡假設有一個ply格式的模型檔案位於d:/eqbin目錄下,檔案名稱為boat-25.ply,可輸入如下指令:
eqply -m boat-25.ply
可以看到在彈出的兩個視窗內分別渲染了情境的一半,其中一個視窗將兩個部分的畫面合成為同一幅畫面。
sort-last的效果
關掉eqPly(ESC)與eqServer(Ctrl+C),重新在命令列中運行
eqServer configs/2-window.2d.eqc
然後在新的命令列視窗中運行
eqPly -m rockerArm.ply
可以實現由兩個視窗構造的sort-last並行渲染系統,即兩個視窗分別渲染一部分幾何圖元,然後將其中一個視窗的顏色緩衝和深度緩衝發送到另一個視窗,由該視窗進行最終像素的深度檢測與填充。渲染的畫面如所示:
現在來試試叢集內的運行情況
同樣的首先要運行伺服器,不同的是需要採用另一個設定檔2-node.2d.eqc
這裡要注意,在2-node.2d.eqc中,關於節點node的配置項需要設定將要運行渲染任務的計算名稱或IP地址
叢集設定
伺服器啟動後,同樣的在另一個命令列視窗中運行
eqply -m boat-25.ply
此時根據eqply中的設定,首先在本地運行應 用節點任務,然後通過ssh管道將要啟動並執行指令(eqply -m boat-25.ply)發送給設定檔中指定的渲染節點電腦,由後者執行該指令。此時應當在伺服器電腦與另一台設定為渲染節點的電腦上分別有一個 視窗負責渲染,只是在伺服器電腦的視窗內包含了由渲染節點傳輸過來的渲染好的另一半畫面。
其他
這裡需要說明的是,由於Equalizer在叢集應用中所發送的ssh指令,規定在遠端以同樣的路徑運行應用程式及搜尋資料檔案,因此需要將要執行的應用與相關的資料檔案放置在相同的路徑下。
關於Equalizer的效能,近期eqPly的模型採用kd-tree進行管理與遍曆,並通過VBO載入資料與繪製,因此無論是效能還是畫面質 量相比於v0.3版本時有了很大改善,特別是在release編譯版本下,由於關掉了很多的提示資訊輸出,速度就更快了。在我的Geforce 7950GTX上前面的兩個單機啟動並執行例子都可以達到300幀以上,而這兩個Ply模型分別為8萬和12萬個三角形面。
至於在叢集系統上的效能,瓶頸主要在於合成階段,即映像的幀緩衝拷貝與傳輸造成的阻塞與延遲,在我的測試中,在包含映像合成的時候,畫面播放速率不到10幀,而如果關閉映像合成(幀同步仍然有效),兩個節點的畫面播放速率都恢複到幾百幀每秒。
映像合成可以通過將2-node.2d.eqc檔案中包含“outputframe”與“inputframe”的行刪除即可。
參考文獻
1.http://www.equalizergraphics.com
2.http://chromium.sourceforge.net
3.http://blog.csdn.net/rickArkin/archive/2007/09/19/1792057.aspx ,"在windows下安裝SSH"
4.http://graphics.stanford.edu/data/3Dscanrep/