私は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.h
とicd_dispatch.c
の条件付きコンパイルのマイナーな変更は、関連する関数を省略して依存関係を取り除くことができます(Linuxビルドではすでに行われているように)、実際には以前のようにサポートされているようです - プリプロセッサシンボルcl_khr_d3d10_sharing
と関連するヘッダが含まれている場合にはすでに定義されていますが、関連するコードの塊を条件付きでコンパイルするためには使用されていません。
最初の場所でDirectX10とDirectX11の機能を省略するように指示しています(実際には解決策ではありませんが、ヘッダファイルをいくつかコメントしたところです)。しかし、もう一つの問題があります...
ファイルicd_windows.c
は、Windows API関数InitOnceExecuteOnce
- MSDN docs hereを使用しています。 mingw-w64はこの機能をサポートしていないと思っています。つまり、Kernel32.dll
のdefファイルはそれを示していますが、関数や関連する識別子はINIT_ONCE
、INIT_ONCE_STATIC_INIT
、PINIT_ONCE
ではありません。
MSDNドキュメントのIMOではこれについては説明していません。それは必須ではありません(Vista以前には存在しませんでした)、DLLの安全な初期化(おそらくマルチスレッド環境で)と関係しています。
残念ながら、私はそれが何をしているのか分からない場合、私はそれが存在しないための回避策を実装できません。
明らかに、このWindows APIはOpenCLに固有のものではないため、これは他の人が他のプロジェクトで実行していた問題です。これには標準的な回避策がありますか?
それでも失敗した場合、特に「同期ワンタイム初期化」によって何が意味されているのか説明できますか?申し訳ありませんが、私はマルチスレッドの経験はあまりありません。一度の初期化は、同期と非同期に関係なく、2番目のスレッドが最初に再初期化したくないので、とにかく非同期に行うのと同期することは何もありません。
他のスレッドが初期化を呼び出そうとすると、既に実行中の初期化が完了するのを待ってから失敗するか、初期化をやり直さずに成功する可能性があります。私はOpenCLのタグが適切であったことを確認できなかった
は、それが間違っていた場合は、申し訳ありませんので、文脈のそれを含めることを決めました。
[このMSDNページ](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363808(v = vs.85).aspx)の質問を投稿するとすぐに私の盲点のおっとっと。より良い答えが現れなければ、それに基づいて1つを追加します。 – Steve314
API関数と識別子を自分で宣言してみませんか? –
@HarryJohnston - 識別子を定義する方法(タイプはどのようなものであるべきか)を知りません。KhronosやMinGWにいくつかの変更を加える価値があるかもしれないと推測しています。法的問題私が現在持っていないMicrosoftのヘッダーやMSDNのどこかにある定義をコピーするだけです(彼らがどこかにいると仮定して)。しかしそれはまだ選択肢です。 – Steve314