200万のフロートは大したことではないようです。1GBのGPURAMは8MBだけです。時々それ以上、時にはそれ以上を問題なく割り当てることができます。clEnqueueReadBufferを実行すると、CL_OUT_OF_RESOURCESが発生しますが、これは奇妙に思えます。トラブルが実際にどこから始まったのかを嗅ぎ分けることはできますか?OpenCLはclEnqueueReadBufferでこのように失敗するべきではありませんか?データを正しく割り当てたときのはずですか?エラーコードだけでなく、より詳細な情報を取得する方法はありますか?OpenCLがCL_OUT_OF_RESOURCESを宣言したときに、どれだけのVRAMが割り当てられたかを確認できれば素晴らしいと思います。
4 に答える
私はあなたが抱えていたのと同じ問題を抱えていました(修正するのに丸一日かかりました)。同じ問題を抱えている人はきっとこれに遭遇するでしょう。だから私はこの古い質問に投稿しています。
おそらく、カーネルの最大ワークグループサイズをチェックしていません。
これがあなたのやり方です:
size_t kernel_work_group_size;
clGetKernelWorkGroupInfo(kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(size_t), &kernel_work_group_size, NULL);
私のデバイス(2x NVIDIAGTX460およびInteli7CPU)は1024の最大ワークグループサイズをサポートしていますが、パストレーシングカーネルを通過すると、上記のコードは約500を返します。1024のワークグループサイズを使用した場合、明らかに失敗し、CL_OUT_OF_RESOURCESエラーが発生しました。
カーネルが複雑になるほど、カーネルの最大ワークグループサイズは小さくなります(または、少なくとも私が経験したことです)。
編集:
「clEnqueueNDRangeKernel」ではなく「clEnqueueReadBuffer」と言っていることに気づきました...
私の答えはclEnqueueNDRangeKernelに関連していました。
間違いでごめんなさい。
これが他の人にも役立つことを願っています。
別のソースから:
--clFinish()を呼び出すと、計算のエラーステータスが取得されます(データを読み取ろうとしたときにエラーステータスが取得されるのではありません)。
-「リソース不足」エラーは、(NVidia)カードがディスプレイとしても使用されている場合、5秒のタイムアウトによっても発生する可能性があります
-カーネルにポインタエラーがある場合にも表示される可能性があります。
フォローアップでは、最初にCPUでカーネルを実行して、範囲外のメモリアクセスを行わないようにすることをお勧めします。
カーネルの範囲外のアクセスは、通常はサイレントです(カーネルのキューイング呼び出しでエラーが発生しないため)。
ただし、後でclEnqueueReadBuffer()を使用してカーネル結果を読み取ろうとした場合。このエラーが表示されます。カーネルの実行中に問題が発生したことを示しています。
カーネルコードで範囲外の読み取り/書き込みがないか確認してください。