オフロード処理のトレース

GPU に計算をオフロードするプログラムが開始される場合、プログラムの実行に関連する多くのコンポーネントが動作します。マシン非依存のコードをマシン依存のコードにコンパイルし、データとバイナリーをデバイスにコピーして、結果を戻す必要があります。ここでは、oneAPI デバッグツールで説明したツールを使用して、すべてのアクティビティーをトレースする方法を示します。

カーネル設定時間

オフロードコードをデバイスで実行する前に、マシン非依存のカーネルをターゲットデバイス向けにコンパイルしてコードをデバイスにコピーする必要があります。このカーネルのセットアップ時間が考慮されていないと、ベンチマークを複雑にしたり歪めたりする可能性があります。ジャストインタイム・コンパイルは、オフロード・アプリケーションのデバッグに遅延を引き起こすことがあります。

OpenMP* オフロードプログラムでは、LIBOMPTARGET_PLUGIN_PROFILE=T[,usec] を設定すると、オフロードコード “ModuleBuild” のビルドに必要な時間が報告されます。これをプログラムの実行時間全体と比較します。

SYCL* オフロードプログラムでは、カーネルのセットアップ時間を判断するのはさらに困難になります。

  • レベルゼロまたは OpenCL* がバックエンドである場合、onetrace や ze_tracer よって返されるデバイスのタイミングとタイムラインから、カーネルのセットアップ時間を求めることができます。

  • OpenCL* がバックエンドである場合、OpenCL* アプリケーションのインターセプト・レイヤーを使用して同様の情報を取得するときに、BuildLoggingKernelInfoLoggingCallLoggingCallLoggingElapsedTimeKernelInfoLoggingHostPerformanceTimingHostPerformanceTimeLoggingChromeCallLogging、または CallLoggingElapsedTime フラグを設定して情報を取得できる場合があります。onetrace や cl_tracer よって返されるデバイスのタイミングおよびタイムラインから、カーネルのセットアップ時間を求めることもできます。

この方法により、LIBOMPTARGET_PLUGIN_PROFILE=T によって返される情報を補足できます。

インテル® VTune™ プロファイラーがカーネルのセットアップ時間を解析する方法の詳細については、Linux* カーネル解析を有効にするを参照してください。

バッファーの作成、サイズ、およびコピーの監視

バッファーが作成された時期、作成されたバッファーの数、およびそれらが再利用されるか、また常に作成および破棄されるかを知ることは、オフロード・アプリケーションのパフォーマンスを最適化する上で重要です。しかし、OpenMP* や SYCL* などの高レベル・プログラミング言語を使用する場合、それらは必ずしも明確でない可能性がありユーザーからバッファーの管理は隠匿されます。

高レベルでは、プログラムの実行時に LIBOMPTARGET_DEBUG および SYCL_UR_TRACE 環境変数を使用して、バッファーに関連するアクティビティーを追跡できます。LIBOMPTARGET_DEBUG は、SYCL_UR_TRACE よりも多くの情報を提供します (作成されたバッファーアドレスとサイズをレポート)。SYCL_UR_TRACE は、API 呼び出しをレポートするだけであり、バッファーアドレスやサイズに関する情報は含まれません。

低レベルでレベルゼロや OpenCL* バックエンドを使用する場合、onetrace や ze_tracer の呼び出しログモードは、引数を含むすべての API 呼び出しに関する情報を提供します。例えば、バッファー作成呼び出し (zeMemAllocDevice など) で、デバイスとの間で渡される結果バッファーのサイズを取得できるため役立つことがあります。onetrace と ze_tracer は、デバイス・タイムライン・モードですべてのゼロレベルデバイス間とのアクティビティー (メモリー転送を含む) をダンプできます。アクティビティーごとに、追加 (コマンドリストへ)、送信 (キューへ)、開始と終了時間を取得できます。

OpenCL* がバックエンドの場合、OpenCL* アプリケーションのインターセプト・レイヤーを使用する際に、CallLoggingCallLoggingElapsedTime、および ChromeCallLogging フラグを設定して同様の情報を取得できます。onetrace や ze_tracer の呼び出しログモードは、引数を含むすべての OpenCL* API 呼び出しに関する情報を提供します。上記と同様に、onetrace と ze_tracer を使用すると、デバイス・タイムライン・モードですべての OpenCL* デバイス間とのアクティビティー (メモリー転送を含む) をダンプすることができます。

合計転送時間

合計データ転送時間をカーネル実行時間と比較することは、接続されているデバイスへの計算のオフロードが有益であるか判断することが重要になることがあります。

OpenMP* オフロードプログラムでは、LIBOMPTARGET_PLUGIN_PROFILE=T[,usec] を設定すると、ビルド ("DataAlloc")、オフロードデバイスの読み取り ("DataRead")、および書き込み ("DataWrite") に必要な時間がレポートされます (ただし合計として)。

SYCL* を使用する C++ プログラムのデータ転送時間を判断するのはさらに困難になります。

  • レベルゼロまたは OpenCL* がバックエンドである場合、onetrace や ze_tracer よって返されるデバイスのタイミングとタイムラインから、合計データ転送時間を求められます。

  • OpenCL* がバックエンドである場合、onetrace または cl_tracer を使用できます。また、OpenCL* アプリケーションのインターセプト・レイヤーを使用するときに、BuildLoggingKernelInfoLoggingCallLoggingCallLoggingElapsedTimeKernelInfoLogging, HostPerformanceTimingHostPerformanceTimeLoggingChromeCallLogging、または CallLoggingElapsedTime フラグを設定して情報を取得することもできます。

インテル® VTune™ プロファイラーによる転送セットアップ時間の解析方法の詳細については、インテル® VTune™ プロファイラー・ユーザーガイドの以下のセクションを参照してください: GPU オフロード解析GPU 計算/メディア・ホットスポット・ビューホットスポット・レポート

カーネル実行時間

OpenMP* オフロードプログラムでは、LIBOMPTARGET_PLUGIN_PROFILE=T[,usec] を設定すると、オフロードされたすべてのカーネル (“Kernel#…”) の合計実行時間が報告されます。

SYCL* を使用するオフロードカーネル向け:

  • レベルゼロ または OpenCL* バックエンドでは、onetrace や ze_tracer のデバイス・タイミング・モードを使用してすべてのカーネルのデバイスでの実行時間を取得できます。

  • OpenCL* がバックエンドである場合、onetrace または cl_tracer を使用できます。また、OpenCL* アプリケーションのインターセプト・レイヤーを使用するときに、CallLoggingElapsedTimeDevicePerformanceTimingDevicePerformanceTimeKernelInfoTrackingDevicePerformanceTimeLWSTrackingDevicePerformanceTimeGWSTrackingChromePerformanceTimingChromePerformanceTimingInStages フラグを設定するで情報を取得できる場合があります。

インテル® VTune™ プロファイラーがカーネルの実行時間を解析する方法の詳細については、アクセラレーター解析グループを参照してください。

デバイスカーネルが呼び出されてスレッドが生成される場合

状況によってには、オフロードカーネルが作成され、実行を開始するかなり前にデバイスへ転送されることがあります(通常は、カーネルの実行に必要なすべてのデータと制御が転送された後にのみ)。

インテル® ディストリビューションの GDB* を使用してデバイスカーネルにブレークポイントを設定できます。そして、カーネル引数の照会、スレッドの生成と破棄の監視、コード内の現在のスレッドの位置とリスト表示 ("info thread" を使用) などが行えます。