13

Mingw と Nvidia SDK を使用して OpenCL をコンパイルすることは可能ですか?

公式にサポートされていないことは承知していますが、それは意味がありません。ライブラリは静的にリンクされたライブラリとして提供されていませんか? どんなコンパイラでもコンパイルされ、正常にリンクされたら、何が問題になるのでしょうか?

コードをコンパイルして、Nvidia の SDK で提供される OpenCL ライブラリに正常にリンクすることができましたが、実行可能ファイルはclGetPlatformIDsコード内の最初の OpenCL 呼び出しである Segmentation Fault をスローします。

ここに私のコンパイルコマンドがあります

x86_64-w64-mingw32-g++ -std=c++11 File.cpp \
-L"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\x64" \
-I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include" \
-gcoff -lOpenCL -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 \
-lshell32 -lole32 -loleaut32 \
-luuid -lodbc32 -lodbccp32 -luser32 -lgdi32 -lmingwex -m64 \
-DWIN32 -D_DEBUG -D_CONSOLE

これらのライブラリは、サンプル OpenCL コードの .sln ファイルから取得したものであることに注意してください。

これらのライブラリのさまざまな組み合わせを試しましたが、何も機能しないようです。

また、Mingw を使用してコンパイルし、別のものを使用してリンクする方法はありますか? 他に何があるかわかりません。

4

2 に答える 2

15

これは、MinGW reimp および dlltool ユーティリティを使用して、「OpenCL.dll」DLL 用のインポート ライブラリ「libOpenCL.a」を作成することで実現できました。私たちが従った手順は次のとおりです。

  • ステップ 1: mingw-utils がインストールされていることを確認します (reimp および dlltool 用)。そうでない場合は、MinGW プロンプトで次のように入力します。

    mingw-get インストール mingw-utils

  • ステップ 2: 次に、次のコマンドを入力します。

    OpenCL.lib を書き換える

これにより、OpenCL.def および libOpenCL.a ファイルが生成されます。結果が「無効または破損したインポート ライブラリ」の行に沿ったものである場合は、別の手順 2 が機能するはずです。

新しく作成された libOpenCL.a に対してリンクできるようになりました。それでも不足しているシンボルが表示される場合は、それらを .def ファイルに追加して、dlltool コマンドを繰り返します。

参考までに、次の投稿にある情報のおかげで、これをすべて機能させることができました。

  1. http://oscarbg.blogspot.com/2009/12/opencl-with-mingw.html
  2. http://www.mingw.org/wiki/CreateImportLibraries (リンクは 2 つしか貼り付けられません)
于 2013-08-29T16:55:00.713 に答える
3

OpenCL ライブラリは、OpenCL.dll の単なるスタブです。したがって、動的ローディング手法を使用することをお勧めします。それは単にあなたの問題をすべて解決します。それとも、OpenCL の nVIDIA 調整が本当に必要ですか?

実行時に安全であるだけでなく、リンカーも定義も何も必要ないため、コンパイルも簡単です。プロジェクトに単純な cpp/hpp ファイルを追加するだけです。

使用するのに非常に適しているのはCLEWです。ただし、C++ ラッパーが壊れているため、そのライブラリには完全には同意しません。そのため、微調整が必​​要になる場合があります。また、問題が発生する可能性があるため、通常は「atex」コードを無効にします。

于 2013-08-30T10:22:53.287 に答える