2016-08-27 6 views
1

私はmingw-g64でOpenCL ICD Loaderをビルドしようとしています。代わりにmingw-w64を使用しても問題はありません。私はVisual Studioを使用しません - 私はそれを嫌いではない、私は無料のバージョンがあることを知っている、それは私が使っているものではない。mingw(またはmingw-w64)gccのInitOnceExecuteOnceの不足を回避するには?

OpenCL ICDローダーはmingw gccでビルドされません。主な理由は、DirectX 10とDirectX 11のサポートが不足しているためです。しかし、すべてのICDローダーは、ディスパッチテーブル(おそらくOpenCLドライバからロードするもの)を取得し、そのディスパッチテーブルを介して呼び出す関数を提供します。 icd_dispatch.hicd_dispatch.cの条件付きコンパイルのマイナーな変更は、関連する関数を省略して依存関係を取り除くことができます(Linuxビルドではすでに行われているように)、実際には以前のようにサポートされているようです - プリプロセッサシンボルcl_khr_d3d10_sharingと関連するヘッダが含まれている場合にはすでに定義されていますが、関連するコードの塊を条件付きでコンパイルするためには使用されていません。

最初の場所でDirectX10とDirectX11の機能を省略するように指示しています(実際には解決策ではありませんが、ヘッダファイルをいくつかコメントしたところです)。しかし、もう一つの問題があります...

ファイルicd_windows.cは、Windows API関数InitOnceExecuteOnce - MSDN docs hereを使用しています。 mingw-w64はこの機能をサポートしていないと思っています。つまり、Kernel32.dllのdefファイルはそれを示していますが、関数や関連する識別子はINIT_ONCEINIT_ONCE_STATIC_INITPINIT_ONCEではありません。

MSDNドキュメントのIMOではこれについては説明していません。それは必須ではありません(Vista以前には存在しませんでした)、DLLの安全な初期化(おそらくマルチスレッド環境で)と関係しています。

残念ながら、私はそれが何をしているのか分からない場合、私はそれが存在しないための回避策を実装できません。

明らかに、このWindows APIはOpenCLに固有のものではないため、これは他の人が他のプロジェクトで実行していた問題です。これには標準的な回避策がありますか?

それでも失敗した場合、特に「同期ワンタイム初期化」によって何が意味されているのか説明できますか?申し訳ありませんが、私はマルチスレッドの経験はあまりありません。一度の初期化は、同期と非同期に関係なく、2番目のスレッドが最初に再初期化したくないので、とにかく非同期に行うのと同期することは何もありません。

他のスレッドが初期化を呼び出そうとすると、既に実行中の初期化が完了するのを待ってから失敗するか、初期化をやり直さずに成功する可能性があります。私はOpenCLのタグが適切であったことを確認できなかった


は、それが間違っていた場合は、申し訳ありませんので、文脈のそれを含めることを決めました。

+0

[このMSDNページ](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363808(v = vs.85).aspx)の質問を投稿するとすぐに私の盲点のおっとっと。より良い答えが現れなければ、それに基づいて1つを追加します。 – Steve314

+1

API関数と識別子を自分で宣言してみませんか? –

+0

@HarryJohnston - 識別子を定義する方法(タイプはどのようなものであるべきか)を知りません。KhronosやMinGWにいくつかの変更を加える価値があるかもしれないと推測しています。法的問題私が現在持っていないMicrosoftのヘッダーやMSDNのどこかにある定義をコピーするだけです(彼らがどこかにいると仮定して)。しかしそれはまだ選択肢です。 – Steve314

答えて

1

同じ問題が発生しました。あなたはすべての#include前に、icd_windows.cの先頭に次の行を追加する必要があります。

#define _WIN32_WINNT 0x0600 

これはInitOnceExecuteOnce宣言が行方不明に役立ちます。私はCMakeListも修正しなければならなかった。txtは、libOpenCLのリンクを担当するSHAREDSTATICの22行目に置き換えました。私は、ビルドサブディレクトリにlibOpenCL.aを得たこれら二つのことをやった後

add_library (OpenCL STATIC ${OPENCL_ICD_LOADER_SOURCES}) 

:リンカは、LDのlibが見つからない不満ので、私はこれをしました。他のエラーでコンパイルが継続して失敗しましたが、これを無視しました。私はlibを作成し、使用可能なすべてのプラットフォーム、デバイス、およびその詳細をリストする簡単なOpenCLアプリケーションを構築するのに成功しました。

+0

私は本当にこのATMをチェックする立場にはないので+1しますが、少なくとも、まだ受け入れていません。申し訳ありませんが、しばらく時間がかかるかもしれません。 – Steve314

+0

問題はありません:)私はまた、WindowsにインストールされているOpenCL.dllと直接アプリケーションをリンクできることも発見しました。 '/ cygdrive/c/Windows/System32/OpenCL.dll'を' -l' )をリンカーの別の引数として使用します。 –

関連する問題