我目前正在爲非常異類的一組計算機開發一個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代碼。