2012-07-03 80 views
8

我正在開發一個需要在Nvidia和AMD圖形卡上使用FFT的項目。我最初尋找一個可以在兩者上工作的庫(認爲這將是OpenCL的方式),但我沒有任何運氣。Nvidia和AMD硬件上的OpenCL FFT?

有人向我建議,我將不得不使用每個供應商的FFT實現並編寫一個選擇基於該平臺做什麼的包裝。我發現AMD的實現非常容易,但實際上我正在使用Nvidia卡(這對於我的特定應用來說是更重要的)。

我能找到的唯一的Nvidia實現是CUFFT。有誰知道我如何實際使用OpenCL的CUFFT庫?我能想到的唯一方法是在OpenCL代碼旁邊添加一些CUDA代碼。我讀過我不能將OpenCL緩衝區用作CUDA指針(Trying to mix in OpenCL with CUDA in NVIDIA's SDK template)。相反,在運行OpenCL內核之後,我是否必須將緩衝區複製回主機,然後使用CUDA內存傳輸例程將它們複製回GPU?我不太喜歡這種方法,因爲它似乎涉及毫無意義的內存傳輸,如果我只能使用OpenCL的CUFFT,我會更喜歡它。

+0

ViennaCL現在包含一個「實驗性」FFT實現。至少對於電力2轉換它應該合理地執行。 – talonmies

回答

6

NVIDIA尚未做任何支持OpenCL庫的工作,如FFT。它也沒有向其CUDA庫提供源代碼,因此無法使用OpenCL運行這些源代碼。

AMD的FFT庫是您最好的選擇,並且可以在任何其他OpenCL兼容設備(包括NVIDIA的GPU)上運行。 ArrayFire OpenCL利用AMD的FFT庫,我已經在我們實驗室的英特爾,NVIDIA和AMD設備上運行。

1

除了Ben的AMD建議之外,您還可以調查Apple FFT示例代碼。但是,它們的代碼僅在GPU設備上運行,因爲它會檢查爲其提供的命令隊列創建的設備類型。

0

SHOC benchmark on github還包含我已經在nvidia GPU 650M,intel gpu和intel CPU上進行FFT測試的代碼。在Windows上,創建一個項目並設置包含和鏈接路徑需要幾分鐘,但這很簡單。在intel gpu上運行需要設置命令行選項或小代碼修改,因爲intel gpu是設備1而不是設備0,這是shoc基準測試套件中的默認設置。

我沒有驗證輸出的正確性,只是它編譯並運行完成。