2011-10-13 83 views
6

我目前正在爲非常異類的一組計算機開發一個OpenCL應用程序(使用JavaCL進行具體說明)。爲了最大限度地提高性能,我想要使用GPU,否則我想回到CPU並使用SIMD指令。我的計劃是使用向量類型實現OpenCL代碼,因爲我的理解是,這允許CPU對嚮導進行向量化並使用SIMD指令。OpenCL發行版

但是我的問題是關於使用哪種OpenCL實現。例如。如果電腦有Nvidia GPU,我認爲最好使用Nvidia的庫,但如果沒有GPU可用,我想使用Intel的庫來使用SIMD指令。

我該如何做到這一點?這是自動處理還是必須包含所有庫和實現一些邏輯來選擇正確的?感覺這是一個比我面臨的問題更多的人。

更新 測試不同的OpenCL的驅動程序後,這是我的經驗,到目前爲止:

  • 英特爾:墜毀JVM時JavaCL試圖調用它。重新啓動後,它不會使JVM崩潰,但它也不會返回任何可用的設備(我正在使用Intel I7-CPU)。當我離線編譯 OpenCL代碼時,它似乎可以執行一些 自動向量化,所以Intel的編譯器看起來相當不錯。

  • Nvidia的:拒絕安裝他們通過WHQL驅動程序,因爲它聲稱我沒有Nvidia的卡(即計算機有一塊GeForce GT 330M)。當我試圖在不同的計算機上嘗試它時,我設法創建了一個內核,但在第一次執行時崩潰了驅動程序 (屏幕閃爍了一段時間,Windows 7說它必須重新啓動驅動程序 ) 。第二次執行導致藍屏 死亡。

  • AMD/ATI:拒絕安裝32位SDK(我嘗試過,因爲我將使用32位JVM),但64位SDK運行良好。這是我設法執行代碼的唯一 驅動程序(在重啓 之後,因爲在編譯時它首先給出了一個隱含的錯誤消息)。 但是,它似乎無法做任何隱式矢量化 ,並且由於我沒有任何ATI GPU,因此與Java實現相比,我沒有得到任何性能 增加。如果我使用矢量類型,我可能會看到一些改進。

TL; DR無司機似乎準備用於商業用途。我可能更好的創建JNI模塊與編譯爲使用SSE指令的C代碼。

回答

4

先了解主機&設備:http://www.streamcomputing.eu/blog/2011-07-14/basic-concept-hosts-and-devices/

基本上你可以做你描述的正是:檢查是否有一定的驅動程序可用,如果沒有,請嘗試下一個。你首先選擇什麼取決於你自己的偏好。我會選擇最適合我測試內核的設備。在JavaCL中,您可以使用JavaCL.createBestContext和CLPlatform來選擇最快的設備。getBestDevice,請檢查主機代碼:http://ochafik.com/blog/?p=501

知道NVidia不支持通過其驅動程序的CPU;只有AMD和英特爾這樣做。同樣針對多個設備(比如說2個GPU和一個CPU)會更難一些。

2

沒有提供你想要的API。但是,您可以執行以下操作:

我建議您迭代clGetPlatformIDs並查詢每個設備的設備數量(clGetDeviceIDs)和設備類型; 並選擇兩種類型的平臺。 然後在u'r代碼中構建一張地圖,該地圖爲每種類型映射支持它的平臺列表,並以某種方式進行排序。 最後,只需獲取列表中對應於CL_DEVICE_TYPE_CPU的第一項和對應於CL_DEVICE_TYPE_GPU的第一項。 如果兩個返回結果相同(platform_cpu == platform_gpu),則選擇其中一個並將其用於兩者。

如果有一個平臺支持這兩個平臺,您將得到匹配,因爲你有訂單清單。那麼你也可以在單一平臺上進行負載平衡,比如英特爾所擁有的平臺。