3

一部の 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

私の質問は次のとおりです。

  1. メモリ転送が開始または送信される前に clEnqueueWriteBuffer が戻らないのはなぜですか?
  2. さらに重要なのは、送金が実際に送信されるまでになぜそんなに時間がかかるのですか???

メモリ転送をすぐに開始できれば、22% のパフォーマンスが得られるように思えます。実際に転送を行う前に、clEnqueueWriteBuffer は別のホスト メモリ領域にデータをコピーしますか?

追加情報:

Tesla M2090 GPU で cuda 4.1 フレームワークを使用しています。

バッファーは、以下を使用して以前に作成されます。

cl_buf = clCreateBuffer(my_context, CL_MEM_READ_ONLY, size, NULL, NULL);

編集: clEnqueueReadBuffer はそのような動作を示しません。

4

2 に答える 2

3

NVidia OpenCL Best Practices Guideのセクション 3.1.1 で説明されているように、固定メモリの使用を試みることができます。

ページング可能なメモリが使用されている場合にコピーが実行されるかどうかは言及されていませんが、発生する可能性があります。

于 2012-10-10T17:51:56.583 に答える
2

書き込みでは、非同期コピーを開始する前にいくつかのチェックを行う必要があります。このチェックには、パラメーターの有効なバッファー タイプ、バッファーのミスアライメント、書き込み対象のバッファーの割り当てなどが含まれます。

clEnqueueWriteBuffer 関数では、データの生のコピーだけが非同期ですが、準備はそうではありません。

于 2012-10-02T07:20:45.577 に答える