2011-09-12 59 views
11

我試圖讓OpenCLRaw綁定到一個點,我可以在Windows上使用它們。我已經在github上分配了OpenCLRaw repo,所以我可以根據需要進行修改。我的分支在這裏: https://github.com/dagit/OpenCLRaw無法鏈接在Windows上的OpenCL與GHC

我一直主要在我的「FunPtr」分支上工作。

我遇到的問題是這樣的:我安裝了AMD的OpenCL SDK,將他們的Visual Studio特定的.lib文件轉換爲gcc可以處理的文件(.a文件),但ghc似乎無法鏈接它。我得到了我在OpenCL API中使用的所有未定義符號。

我能夠構建一個「微不足道」的C程序,並使用我生成的.a文件和來自mingw的gcc(而不是從Haskell安裝)鏈接它。我正在使用Haskell平臺的最新Windows發行版。

這些是我用於產生某文件中的步驟: http://forums.amd.com/forum/messageview.cfm?catid=390&threadid=138890

我用在示例腳本(例如,gendef和dlltool)的命令。我試圖儘可能使用32位的一切,因爲我知道GHC會希望一切都是32位的,所以我不認爲它是32位和64位的問題。

有誰知道在ghc下調用gcc而不是從mingw獲得的gcc有什麼不同嗎?

我也玩過ghc命令行(我用cabal-dev --verbose = 3來檢查命令行),我仍然無法將它按摩到工作狀態。

任何幫助,將不勝感激!

+0

如果我使用pexports而不是gendef,那麼它將刪除函數名稱後面的所有@。這允許GHC使用庫文件進行鏈接,但現在a)gcc無法與該文件鏈接,以及b)當我調用clGetPlatfromIDs時,我的小程序段錯誤。 –

+0

我不在Windows上測試它,但我注意到OpenCLRaw有幾個類型的錯誤,我瘋狂自己一個opencl綁定,適用於我,https://github.com/zhensydow/opencl – Zhen

+0

@ Zhen,你有任何計劃把你的綁定在Hackage上?我尋找的第一個地方是hackage,接着是谷歌搜索。你的圖書館看起來像是對Jeff的改進。這是一種遺憾,它不會顯示在hackage和谷歌上。 –

回答

3

OpenCL使用stdcall慣例,但OpenCLRaw使用ccall。這會產生幾個問題。最主要的是鏈接器想要函數名稱符號以@NN結尾,其中NN取決於函數。

事實證明,產生libOpenCL.a正確的方法如下(從MinGW的外殼):

cp /c/Windows/System32/OpenCL.dll . 
gendef OpenCL.dll 
dlltool -l libOpenCL.a -d OpenCL.def -k -A 

這將產生libOpenCL.a是GHC能正確使用鏈接,但只如果OpenCLRaw被修改爲使用stdcall而不是ccall。

現在我明白了這個問題,我可以修復OpenCLRaw綁定,在Windows上做正確的事情。

當我使用pexports而不是gendef時,我能夠從符號名稱中刪除@NN,但是隨後生成的程序開始出現段錯誤。這是因爲找到了符號,但調用約定不正確,可能導致堆棧損壞。

對我來說,主要的教訓是你的FFI綁定必須符合你的C庫的調用約定。