2011-09-12 4 views
11

OpenCLRawバインディングをWindows上で使用できる場所に取得しようとしています。私はgithub上でOpenCLRawレポをフォークしたので、必要に応じて変更を加えることができます。私の枝はここにあります: https://github.com/dagit/OpenCLRawOpenCLをGHCでWindowsにリンクできません

私は "FunPtr"ブランチから大部分は取り組んでいます。

私はAMDのOpenCL SDKをインストールし、Visual Studio固有の.libファイルをgccが処理できるファイル(.aファイル)に変換しましたが、ghcはリンクできないようです。私は、OpenCL APIで使用するすべてのものについて未定義のシンボルを取得します。

"簡単な" Cプログラムをビルドし、生成した.aファイルとmingwのgcc(Haskellのインストールではない)を使ってリンクすることができました。私はHaskellプラットフォームの最新のWindowsリリースを使用しています。 Iは、例えば、スクリプト(例えば、gendef及びDLLTOOL)のコマンドを使用 http://forums.amd.com/forum/messageview.cfm?catid=390&threadid=138890

これらは私が.Aファイルを生成するために使用されるステップです。 GHCはすべてが32ビットであることを知っているので、私はできる限り32ビットすべてを使用しようとしました。だから、32ビットと64ビットの問題ではないと思います。

私はmingwから入手したgccではなく、gccの下でgccを呼び出す方法が異なるかどうかは知りませんか?

私はghcコマンドライン(私はコマンドラインを検査するためにcabal-dev --verbose = 3を使用しました)と一緒に遊んできましたが、私はまだそれを動作状態にマッサージすることができません。

助けていただけたら幸いです!

+0

gendefの代わりにpexportを使用すると、関数名の後に@sがすべて削除されます。これにより、GHCはライブラリファイルをリンクに使用できますが、a)gccはそのファイルとのリンクに失敗します。b)clGetPlatfromIDsを呼び出すと、簡単なプログラムのsegfaultsになります。 –

+0

私はWindowsでテストしませんが、OpenCLRawにはいくつかの種類のバグがあります。私はopenclバインドを自分のために使っています。https://github.com/zhensydow/opencl – Zhen

+0

@Zhen、あなたには何か計画がありますか?あなたの拘束力をHackageに置く?私がhaskellのものを探している最初の場所はhackageで、次にgoogleの検索が続きます。あなたの図書館はJeff'sの改良版のようです。それはハックとGoogleに表示されませんが残念です。 –

答えて

3

OpenCLはstdcallの規則を使用しますが、OpenCLRawccallを使用しています。これにはいくつかの問題があります。主なものは、リンカがNNが関数に依存する@NNで終わる関数名シンボルを望んでいることです。結局のところ

は、libOpenCL.aを生成するための正しい方法は、(mingwのシェルから)、次のとおりです。

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

このGHCが正しくだけで、リンクに使用できることをlibOpenCL.aを生成します。 OpenCLRawがccallの代わりにstdcallを使用するように変更されている場合

私は問題を理解したので、OpenCLRawバインディングを修正してWindows上で正しいことを行うことができます。

gendefの代わりにpexportsを使用したとき、シンボル名から@NNを削除することができましたが、結果のプログラムがsegfaultを開始しました。これは、シンボルが見つかりましたが、呼び出し規約が間違っていて、スタックが破損している可能性があるためです。

私の主な教訓は、FFIバインディングがCライブラリの呼び出し規約と一致しなければならないということです。

関連する問題