5

200万のフロートは大したことではないようです。1GBのGPURAMは8MBだけです。時々それ以上、時にはそれ以上を問題なく割り当てることができます。clEnqueueReadBufferを実行すると、CL_OUT_OF_RESOURCESが発生しますが、これは奇妙に思えます。トラブルが実際にどこから始まったのかを嗅ぎ分けることはできますか?OpenCLはclEnqueueReadBufferでこのように失敗するべきではありませんか?データを正しく割り当てたときのはずですか?エラーコードだけでなく、より詳細な情報を取得する方法はありますか?OpenCLがCL_OUT_OF_RESOURCESを宣言したときに、どれだけのVRAMが割り当てられたかを確認できれば素晴らしいと思います。

4

4 に答える 4

8

私はあなたが抱えていたのと同じ問題を抱えていました(修正するのに丸一日かかりました)。同じ問題を抱えている人はきっとこれに遭遇するでしょう。だから私はこの古い質問に投稿しています。

おそらく、カーネルの最大ワークグループサイズをチェックしていません。

これがあなたのやり方です:

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に関連していました。
間違いでごめんなさい。
これが他の人にも役立つことを願っています。

于 2012-12-15T22:54:23.213 に答える
5

別のソースから:

--clFinish()を呼び出すと、計算のエラーステータスが取得されます(データを読み取ろうとしたときにエラーステータスが取得されるのではありません)。
-「リソース不足」エラーは、(NVidia)カードがディスプレイとしても使用されている場合、5秒のタイムアウトによっても発生する可能性があります
-カーネルにポインタエラーがある場合にも表示される可能性があります。

フォローアップでは、最初にCPUでカーネルを実行して、範囲外のメモリアクセスを行わないようにすることをお勧めします。

于 2010-10-21T22:00:26.153 に答える
3

使用可能なすべてのメモリを必ずしも単一の取得要求に提供できるわけではありません。ヒープの断片化1、2、3を読んで、成功する可能性のある最大の割り当てがメモリの最大の連続ブロックに対するものである理由と、メモリを使用した結果としてブロックが小さな断片に分割される方法について詳しく学びます

リソースが使い果たされているわけではありません...あなたの要求を満たすのに十分な大きさの単一のピースを見つけることができません...

于 2010-10-21T15:06:22.910 に答える
1

カーネルの範囲外のアクセスは、通常はサイレントです(カーネルのキューイング呼び出しでエラーが発生しないため)。

ただし、後でclEnqueueReadBuffer()を使用してカーネル結果を読み取ろうとした場合。このエラーが表示されます。カーネルの実行中に問題が発生したことを示しています。

カーネルコードで範囲外の読み取り/書き込みがないか確認してください。

于 2013-08-27T09:26:16.080 に答える