1

BFSを使用して、グラフ内の各ノードから他のノードへの最短パスを見つけるopenCLコードを書いています。(これが私がやっていることの詳細です: BFSによる最短パス、CUDAからopenCLへのコードの移植

clEnqueueNDRangeKernelに渡すデータを分割する方法は次のとおりです

size_t global_size, local_size;
local_size=1024;
global_size=ceil(e_count/(float)local_size)*local_size;
cl_event sync1;
err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, 
    &global_size, &local_size, 0, NULL, &sync1); //wait for this to finish (to synchronize);

err = clWaitForEvents(1, &sync1)

このコードは、エッジの数 <= 50000 でうまく機能します (同等の CPU バージョンよりもかなり遅くなります)。エッジの数を増やすと、プログラムが終了し、エラー -58 が発生しました ( clEnqueueNDRangeKernel の後)

NVIDIA Geforce 630M を使用しています。

何が起こったのか、問題を解決するにはどうすればよいですか?

よろしくお願いします

4

1 に答える 1

3

エラー -58 は CL_INVALID_EVENT ( cl.h でわかるように)であり、 clEnqueueNDRangeKernel によって返されず、 clWaitForEventsによってのみ返されます。したがって、おそらく後者の関数のエラーのみをチェックしています。実際のエラーを見つけるには、戻り値clEnqueueNDRangeKernelを、それが返すさまざまなステータス定数と照合する必要があります。実際、すべてのホスト OpenCL 関数に対してこれを行う必要があります。そうしないと、発生しているエラーの種類を正確に判断することが非常に難しくなります。

この特定のケースでは、CL_OUT_OF_RESOURCES (カーネルのローカル メモリまたはプライベート メモリが不足している) などのメモリ関連のエラーがあるに違いありません。

お役に立てれば。

于 2012-12-31T19:52:39.113 に答える