4

「nvprof」の結果の「GPU アクティビティ」と「API 呼び出し」の違いは何ですか?

なぜ同じ関数に時間差があるのか​​わかりません。たとえば、[CUDA memcpy DtoH] と cuMemcpyDtoH です。

そのため、適切な時期がわかりません。測定値を書かなければなりませんが、どれを使用すればよいかわかりません。

ここに画像の説明を入力

4

1 に答える 1

5

アクティビティは、特定のタスクに対する GPU の実際の使用量です。

アクティビティはカーネルを実行している場合もあれば、GPU ハードウェアを使用してホストからデバイスに、またはその逆にデータを転送している場合もあります。

このような「アクティビティ」の継続時間は、通常の継続時間の意味です。このアクティビティが GPU の使用を開始したのはいつで、GPU の使用を停止したのはいつですか。

API 呼び出しは、CUDA ドライバーまたはランタイム ライブラリに対してコード (またはコードによって行われる他の CUDA API 呼び出し) によって行われる呼び出しです。

両者はもちろん関連しています。ある種の API 呼び出しで開始することにより、GPU でアクティビティを実行します。これは、データのコピーとカーネルの実行に当てはまります。

ただし、「期間」または報告された時間に違いがある場合があります。たとえば、カーネルを起動すると、カーネルが「すぐに」実行を開始しない多くの理由 (同じストリームでまだ完了していない以前のアクティビティなど) が考えられます。カーネルの「起動」は、カーネルの実際の実行時間よりもはるかに長い時間、API の観点から未解決である可能性があります。

これは、API 使用の他の多くの側面にも当てはまります。たとえばcudaDeviceSynchronize()、デバイスで何が起こっているか (アクティビティ) に応じて、非常に長い時間または非常に短い時間が必要に見える場合があります。

NVIDIA ビジュアル プロファイラー (nvvp) でタイムラインを調べると、これら 2 つのカテゴリのレポートの違いをよりよく理解できる場合があります。

例としてあなたの特定のケースを使用しましょう。これはドライバー API に関連付けられたアプリのようです。カーネルが起動し、カーネルの起動直後に D->H memcpy 操作が行われているようです:

multifrag_query_hoisted_kernels (kernel launch - about 479ms)
cuMemcpyDtoH  (data copy D->H, about 20us)

そのような状況では、CUDA カーネルの起動は非同期であるため、ホスト コードはカーネルを起動し、次のコード行に進みます。cuMemcpyDtoHこれが呼び出しであり、これがブロッキングコールです。これは、前の CUDA アクティビティが完了するまで、呼び出しによって CPU スレッドがそこで待機することを意味します。

プロファイラーのアクティビティ部分は、カーネル期間が約 479 ミリ秒であり、コピー期間が約 20 秒 (はるかに短い) であることを示しています。活動期間の観点から、これらは適切な時間です。ただし、ホスト CPU スレッドから見ると、ホスト CPU スレッドがカーネルを「起動」するのに必要な時間は 479 ミリ秒よりもはるかに短く、ホスト CPU スレッドが呼び出しを完了しcuMemcpyDtoHて次の行に進むのに必要な時間です。以前に発行されたカーネルが完了するまで、そのライブラリ呼び出しで待機する必要があったため、コードの実行時間は 20us をはるかに超えていました。これらはどちらも、CUDA カーネル起動の非同期性と、.NET の「ブロッキング」または同期性によるものですcuMemcpyDtoH

于 2019-04-08T13:18:52.817 に答える