問題タブ [opencl-c]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
58 参照

c - OpenCL: clBuildProgram がログなしで失敗する

私が達成しようとしていること:
OpenCL でいくつかのものをレンダリングし、それを OpenGL フレームバッファーに書き込もうとしています (Renderbuffers などを介して取得できる唯一のフレームバッファーであるため、使用できる他のものを喜んで受け入れます-あなたglsl シェーダーを使用するように指示しても役に立ちません)

問題:
タイトルにあるように、OpenCL 関数clBuildProgramがエラー -11 (CL_ BUILD_ PROGRAM_ FAILURE) で失敗します。これは問題にはなりませんが、CL コンパイラからのログは空です。ログ コードを再確認しましたが、問題ないはずです。あなたが自分自身を見ることができるように、私はそれを下に投稿しました.

私が修正しようとしたこと:

  • もちろん、グーグル
  • Khronos Groups のドキュメントを読む
  • デバイスが「cl_khr_gl_sharing」拡張機能をサポートしているかどうかを確認しています (これは から返された文字列に含まれていますclGetDeviceInfo(device_id, CL_DEVICE_EXTENSIONS, retSize, extensions, &retSize);)
  • シェーダー/カーネルの変更:
  • ロギングコードが実際に機能するかどうかを確認するために、いくつかの意図的なエラーを作成しました(機能しています)
  • そして、シェーダー/カーネルを縮小して、シェーダー内のいくつかのものが正常に機能しないかどうかを確認します (私が読んだように、いくつかの欠落が cl のコンパイラーをクラッシュさせる可能性があることを読んだ)

私が見つけたもの:
私が試した最後のポイントから、私は気づいた、write_imageuiread_imageuiopencl 関数は、コンパイラが私のコードをコンパイルするのに失敗します (これが、「cl_khr_gl_sharing」拡張子をチェックした理由です)

さらに:
私のオペレーティングシステムはWindows 10で、使用しているCコンパイラはGCCです(ホストプログラムは正常にコンパイルされるため、それがどのように役立つかわかりませんが、それでもなおです)

いくつかのコード:
シェーダー/カーネル (問題を再現するために可能な限り縮小されています。あなたにもお願いします。呼び出しの最後の 2 行は、opencl コンパイラーが機能しない原因だと思います。他のものはそこにあります。これは、実際に何かを処理できるシェーダーです。

必要なすべての初期化処理を実行する縮小された呼び出しコード (C) (注: ログ バッファは動的に変更可能です):

出力に興味があるかもしれません (最後の 2 行はカーネルがビルドされていないことが原因です。ただし、プログラムはソースから作成できます - コードを見てください):

他の誰かが同様の問題を抱えていましたか?私はそれについて何をすべきですか?cl Kernel/Shader のヘッダーが含まれている可能性がありますが、これを含める必要がありますか? 私の clBuildProgram 呼び出しが間違っている可能性がありますか? (誰かがデバイスを渡さなかったと読んだので、コードに何か他のものが欠けている可能性があります)

詳細が必要な場合は、お知らせください。提供できるようにします (他に必要なものは今のところ思いつきません)。

お時間をいただきありがとうございます。

編集:
仕様によると、デバイスはCL_ DEVICE_ IMAGE_ SUPPORT拡張機能をサポートする必要があります。

これを使用して確認しました:

どの出力:

別名。CL_TRUE

編集 2:
カーネルで OpenCL 拡張機能を有効にする必要があることが判明しました: https://www.khronos.org/registry/OpenCL/sdk/2.2/docs/man/html/EXTENSION.htmlの最初の行に
追加#pragma OPENCL EXTENSION all : enableカーネル/シェーダーは同じ問題を引き起こします

編集 3:
カーネル イメージ パラメーターから __read_write フラグを削除するか、それを別のもの (__read_only など) に置き換えると、clBuildProgram が返されない (または非常に長い時間のように返される) ため、OpenCL コンパイラがクラッシュするか無限にループします。

0 投票する
0 に答える
14 参照

opencl - Opencl clGetDeviceIDs(platform, CL_DEVICE_TYPE_CPU, 0, NULL, &num_devices) が -1 を返す

Intel OpenCL SDK を使用しています。先月、システムに存在する CPU で opencl コードを実行しようとしたとき、clGetDeviceIDs(platform, CL_DEVICE_TYPE_CPU , 0, NULL, &num_devices) によって動作しました..そして、検出されたプラットフォームの総数は 2です.1つは Intel GPU ですマクロCL_DEVICE_TYPE_CPUを変更するだけで、Intel GPUとCPUの両方でコードを実行できました。しかし、同じシステムでプラットフォームとデバイスを検出しようとすると、CPU が検出されません。利用可能なプラットフォームをIntel GPUの 1 として表示します。そのため、clGetDeviceIDs(platform, CL_DEVICE_TYPE_CPU, 0, NULL,&num_devices); 呼び出されると -1 (CL_DEVICE_NOT_FOUND) が返され、プログラムは終了します。

Intel CPU を使用できるのに、同じシステムで CPU が検出されないのはなぜですか。しかし、GPU はマクロ CL_DEVICE_TYPE_GPU で正しく検出されています。ありがとう。