オフロード処理のトレース
GPU に計算をオフロードするプログラムが開始される場合、プログラムの実行に関連する多くのコンポーネントが動作します。マシン非依存のコードをマシン依存のコードにコンパイルし、データとバイナリーをデバイスにコピーして、結果を戻す必要があります。ここでは、oneAPI デバッグツールで説明したツールを使用して、すべてのアクティビティーをトレースする方法を示します。
カーネル設定時間
オフロードコードをデバイスで実行する前に、マシン非依存のカーネルをターゲットデバイス向けにコンパイルしてコードをデバイスにコピーする必要があります。このカーネルのセットアップ時間が考慮されていないと、ベンチマークを複雑にしたり歪めたりする可能性があります。ジャストインタイム・コンパイルは、オフロード・アプリケーションのデバッグに遅延を引き起こすことがあります。
OpenMP* オフロードプログラムでは、LIBOMPTARGET_PLUGIN_PROFILE=T[,usec] を設定すると、オフロードコード “ModuleBuild” のビルドに必要な時間が報告されます。これをプログラムの実行時間全体と比較します。
SYCL* オフロードプログラムでは、カーネルのセットアップ時間を判断するのはさらに困難になります。
レベルゼロまたは OpenCL* がバックエンドである場合、onetrace や ze_tracer よって返されるデバイスのタイミングとタイムラインから、カーネルのセットアップ時間を求めることができます。
OpenCL* がバックエンドである場合、OpenCL* アプリケーションのインターセプト・レイヤーを使用して同様の情報を取得するときに、
BuildLogging、KernelInfoLogging、CallLogging、CallLoggingElapsedTime、KernelInfoLogging、HostPerformanceTiming、HostPerformanceTimeLogging、ChromeCallLogging、または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* アプリケーションのインターセプト・レイヤーを使用する際に、CallLogging、CallLoggingElapsedTime、および 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* アプリケーションのインターセプト・レイヤーを使用するときに、
BuildLogging、KernelInfoLogging、CallLogging、CallLoggingElapsedTime、KernelInfoLogging,HostPerformanceTiming、HostPerformanceTimeLogging、ChromeCallLogging、またはCallLoggingElapsedTimeフラグを設定して情報を取得することもできます。
インテル® VTune™ プロファイラーによる転送セットアップ時間の解析方法の詳細については、インテル® VTune™ プロファイラー・ユーザーガイドの以下のセクションを参照してください: GPU オフロード解析、GPU 計算/メディア・ホットスポット・ビュー、ホットスポット・レポート
カーネル実行時間
OpenMP* オフロードプログラムでは、LIBOMPTARGET_PLUGIN_PROFILE=T[,usec] を設定すると、オフロードされたすべてのカーネル (“Kernel#…”) の合計実行時間が報告されます。
SYCL* を使用するオフロードカーネル向け:
レベルゼロ または OpenCL* バックエンドでは、onetrace や ze_tracer のデバイス・タイミング・モードを使用してすべてのカーネルのデバイスでの実行時間を取得できます。
OpenCL* がバックエンドである場合、onetrace または cl_tracer を使用できます。また、OpenCL* アプリケーションのインターセプト・レイヤーを使用するときに、
CallLoggingElapsedTime、DevicePerformanceTiming、DevicePerformanceTimeKernelInfoTracking、DevicePerformanceTimeLWSTracking、DevicePerformanceTimeGWSTracking、ChromePerformanceTiming、ChromePerformanceTimingInStagesフラグを設定するで情報を取得できる場合があります。
インテル® VTune™ プロファイラーがカーネルの実行時間を解析する方法の詳細については、アクセラレーター解析グループを参照してください。
デバイスカーネルが呼び出されてスレッドが生成される場合
状況によってには、オフロードカーネルが作成され、実行を開始するかなり前にデバイスへ転送されることがあります(通常は、カーネルの実行に必要なすべてのデータと制御が転送された後にのみ)。
インテル® ディストリビューションの GDB* を使用してデバイスカーネルにブレークポイントを設定できます。そして、カーネル引数の照会、スレッドの生成と破棄の監視、コード内の現在のスレッドの位置とリスト表示 ("info thread" を使用) などが行えます。