一部の OpenCL 計算のパフォーマンスを改善しようとしているときに、clEnqueueWriteBuffer 呼び出しと、直後の clEnqueueNDRangeKernel (前のデータ転送に依存) で OpenCL ランタイムのプロファイリング機能を使用しました。
clEnqueueWriteBuffer(cmdq, cl_buf, CL_FALSE, 0, size, data, 0, NULL, &write_ev);
clEnqueueNDRangeKernel(cmdq, ker_with_cl_buf_as_input_param, 2, NULL,
work_sze, local_sze, 1, &write_ev, &ker_ev);
これが clGetEventProfilingInfo によって返されるものです (最初の時間を差し引いて、マイクロ秒に変換しました) :
QUEUED SUBMIT START END END-START
write_ev 0 113.952 120.448 211.136 90.688
ker_ev 130.016 132.608 217.280 515.200 297.920
私の質問は次のとおりです。
- メモリ転送が開始または送信される前に clEnqueueWriteBuffer が戻らないのはなぜですか?
- さらに重要なのは、送金が実際に送信されるまでになぜそんなに時間がかかるのですか???
メモリ転送をすぐに開始できれば、22% のパフォーマンスが得られるように思えます。実際に転送を行う前に、clEnqueueWriteBuffer は別のホスト メモリ領域にデータをコピーしますか?
追加情報:
Tesla M2090 GPU で cuda 4.1 フレームワークを使用しています。
バッファーは、以下を使用して以前に作成されます。
cl_buf = clCreateBuffer(my_context, CL_MEM_READ_ONLY, size, NULL, NULL);
編集: clEnqueueReadBuffer はそのような動作を示しません。