1

長い計算を行う pyopencl プログラムがあります (1 回の実行で約 3 ~ 5 時間)。いくつかのカーネルをサイクルで 1 つずつ開始しています。だから私はこのようなものを持っています:

prepare_kernels_and_data()

for i in range(big_number): # in my case big_number is 400000
  load_data_to_device(i)    # ~0.0002s
  run_kernel1(i)            # ~0.0086s
  run_kernel2(i)            # ~0.00028s
  store_data_from_device(i) # ~0.0002s

時間を測定したところ、次のようになりました。

  1. システム時間は 4:30 時間です (Linuxtimeコマンドで測定)
  2. 純粋な opencl イベントベースのタイミングは 3:30 時間 (ロード + 計算 + ストア)

知りたい:

  1. OpenCL プログラムの最小オーバーヘッドはどれくらいですか? 私の場合は35%くらいです
  2. イベントベースのタイミングを信頼する必要がありますか?
  3. プロファイリングを有効にすると、プログラム全体の実行時間がかなり長くなりますか?

オーバーヘッドがプログラムに依存することは知っていますし、Python は純粋な C や CPP ほど高速ではないことも知っています。しかし、重い計算をすべて OpenCL カーネルに移行すると、5 ~ 7% しか失うことがないと信じています。間違っている場合は修正してください。

PS AMD OpenCL、AMD GPU

4

1 に答える 1

1

OCL 時間をどのように測定しますか? 次のようなものだけを使用します。

my_event.profile.end - my_event.profile.start

その場合は、次のような別のメトリックを取得することもできます。

my_event.profile.start - my_event.profile.queued

このメトリクスは、実行前のユーザー アプリケーションとランタイムで費やされた時間を測定するため、オーバーヘッドが発生します。このメトリックは、セクション 4.4.1のAMD プログラミング ガイドで提案されています。
また、コマンドをバッチで送信できることを説明するプロファイリングに関する警告が表示されるため、

バッチ レポートとしてサブミットされたコマンドは、同様の開始時刻と同じ終了時刻を報告します。

思い出すと、NVIDIA はコマンドをストリーミングします。ただし、いずれにせよ、それを使用してオーバーヘッドを削減できます。たとえば、次の代わりに:

Cl_prog.kernel1(…).wait()
Cl_prog.kernel2(…).wait()

次のようなことができます:

Event1 =   Cl_prog.kernel1(…)
Event2 = Cl_prog.kernel2(…)
Event1.wait()
Event2.wait()

等々。
しかし、私は脱線します。ここであなたの質問に具体的に答えるために、私が上で述べたのと同じセクションから得たいくつかの入力があります(AMDからのものですが、NVIDIAでもほぼ同じはずです):

  1. 「CPU デバイスの場合、カーネルの起動時間は高速 (数十マイクロ秒) ですが、ディスクリート GPU デバイスの場合、数百マイクロ秒になることがあります」

  2. 上記の引用を参照してください

  3. 「コマンド キューでプロファイリングを有効にすると、すべての clEnqueue 呼び出しに約 10 μs から 40 μs のオーバーヘッドが追加されます」。
于 2013-07-02T08:30:18.247 に答える