0

10私は OpenCL (C++ インターフェイス) を試していましたが、気づかずに、 の代わりに に等しいバッファー サイズを使用して 10 個の整数用のバッファーを作成しました10 * sizeof(int)が、コードは明らかに問題なく実行されます。

これは、フラグ付きのバッファを作成したことで、境界メモリ外へのアクセスが可能になったため可能性があると考えCL_MEM_USE_HOST_PTRられます (確かではありませんが)。

したがって、私の質問は次のとおりです。特定の領域を超えるアクセスが報告されるように、OpenCL で境界外エラー チェックを強制することは可能ですか?

4

3 に答える 3

2

他のポスターが既に示しているように、境界外チェックは現在 OpenCL ドライバーでサポートされていません。WebCL Validator のようなツールはこの分野で有望ですが、過去に私を助けてくれた既存のツールに基づいた別の道について言及したいと思います。標準の C++ コンパイラに依存してカーネルをコンパイルする FreeOCL CPU ドライバー (ソースからソースへの変換ステップの後) を使用することにより、最終的なプログラムのようなツールを使用して、次valgrindような典型的なvalgrindエラー メッセージを取得できます。

==5863== Thread 6:
==5863== Invalid write of size 1
==5863==    at 0xD61FA5D: __FCL_kernel_krnl_route_pkt (filehFymmN:27)

/tmp/filehFymmNその後、カーネルの C++ バージョン (例の 27 行目) を直接参照して、問題のある操作が発生した場所を見つけることができます。

于 2013-10-29T03:36:02.380 に答える
2

WebCL Validator を試してみてください: https://github.com/KhronosGroup/webcl-validator

これは、境界外メモリ アクセスの実行時チェックを使用して OpenCL カーネル ソース コードを計測するコマンド ライン ツールです。まだ進行中の作業ですので、フィードバックをいただければ幸いです。

于 2013-10-28T22:10:30.320 に答える
1

短い答え:いいえ。

長い回答: ATI と NVIDIA はメモリの範囲外へのアクセスに対して非常に寛容ですが、Intel はクラッシュします (AMD CPU はテストしていません)。

n、n + 1、および n - 1 にアクセスする異方性フィルターのようなものについては、グローバル オフセットを使用して範囲外のメモリへのアクセスを回避するか、ifステートメントを使用してカーネルをチェックインする必要があります。Global Offset は便利ですが、NVIDIA はサポートしていないので、それはあります。

残念ながら、リンク先の OpenCL.dll で魔法が行われているため、ホスト コードで try / catch を使用しても機能しないようです。

注: これは約 4 か月前の SDK とコードであり、その後変更されているかどうかはわかりません。

于 2013-10-28T17:01:23.637 に答える