オフロードのパフォーマンスを最適化
オフロード・パフォーマンスの最適化は、3 つの作業に要約できます:
デバイス上のカーネルの実行時間を最大化しつつ、デバイス間とのデータ転送回数とサイズを最小化します。
可能であれば、デバイス上の計算とデバイスとのデータ転送をオーバーラップさせます。
デバイス上のカーネルのパフォーマンスを最大化します。
OpenMP* オフロードと SYCL*, の両方でデータ転送を明示的に制御することができますが、これを自動的に行うこともできます。また、ホストとオフロードデバイスはほとんど非同期に動作するため、データ転送を制御しようとしても転送が期待通りに行われず、予想よりも時間を要することがあります。デバイスとホストの両方でアクセスされるデータが統合共有メモリー (USM) に格納されている場合、パフォーマンスに影響する透過的な別のレイヤーでデータ転送が行われる可能性があります。
リソース:
バッファー転送時間と実行時間
オフロードデバイス間とのデータ転送には比較的コストがかかり、ユーザー空間でのメモリー割り当て、システムコール、およびハードウェア・コントローラーとのインターフェイスが必要になります。統合共有メモリー (USM) は、ホストまたはオフロードデバイスのいずれかのメモリーの更新を同期するバックグラウンド・プロセスによるコストがかかります。さらに、オフロードデバイス上のカーネルは、実行に必要なすべての入力および出力バッファーがセットアップされて利用可能になるまで待機する必要があります。
1 回のデータ転送でオフロードデバイスとやり取りする情報量に関わりなく、このオーバーヘッドのコストはほぼ同じです。そのため、1 回に 1 つずつではなく、10 回分の転送をまとめて行う方がはるかに高効率です。いずれにしても、すべてのデータ転送にはコストが生じるため、転送の総数を最小限にすることが重要です。例えば、複数のカーネルまたは同じカーネルの複数の呼び出しで必要とする定数がある場合、それらをカーネルを呼び出すたびに送信するのではなく、1 度オフロードデバイスに転送して再利用するようにします。最後に、単一の大量のデータ転送には、単一の少量のデータ転送よりも時間がかかります。
送信されるバッファーの数とサイズは式の一部にすぎません。データがオフロードデバイスに到達したら、カーネルが実行される時間を検討します。オフロードデバイスへのデータ転送よりも実行時間が短い場合、同一操作をホストで実行する時間が、カーネルの実行とデータ転送の合計時間よりも長くない限り、オフロードのメリットはありません。
最後に、あるカーネルの実行と次のカーネルの実行の間に、オフロードデバイスがアイドル状態になっている時間を調査します。長い待機時間は、データ転送やホスト上のアルゴリズムの特性が原因である可能性があります。前者は、データ転送とカーネル実行のオーバーラップを試す価値があります。
ホストでのコード実行、オフロードデバイスでのコード実行、およびデータ転送の関係は複雑です。これらの順番と時間は、単純なコードであっても直感的に理解できるものではありません。すべてのアクティビティーを視覚的に理解し、その情報を参考にしてオフロードコードを最適化するには、次のようなツールが必要になります。
インテル® VTune™ プロファイラー
インテル VTune プロファイラーは、ホスト上の詳しいパフォーマンス情報を提供するだけでなく、接続された GPU のパフォーマンスに関する詳細情報も提供できます。GPU 向けの設定に関する情報は、インテル® VTune™ プロファイラー・ユーザーガイドをご覧ください。
インテル® VTune™ プロファイラーの GPU オフロードビューには、それぞれのカーネル間とのデータ転送に費やされた時間など、GPU 上のホットスポットに関するサマリーが表示されます。GPU 計算/メディア・ホットスポット・ビューでは、動的命令カウントを使用して GPU カーネルのパフォーマンスのマイクロ解析など、GPU カーネルで何が起こっているか詳しく調査することができます。これらのプロファイル・モードでは、データ転送と計算が時間経過でどのように変化するか観察したり、カーネルを効率良く実行するのに十分なワークがあるか判断したり、カーネルが GPU メモリー階層をどのように利用するか調べたりできます。
これらの解析タイプの詳細については、インテル® VTune™ プロファイラー・ユーザーガイドを参照してください。.インテル® VTune™ プロファイラーを使用した GPU の最適化に関する詳細は、インテル® VTune™ プロファイラーでインテル® GPU 向けのアプリケーションの最適化 (英語) をご覧ください。
カーネルの実行時間を計測するには、インテル® VTune™ プロファイラーも使用できます。次のコマンドは、軽量プロファイルの結果を示します:
収集
レベルゼロ・バックエンド:
vtune -collect-with runss -knob enable-gpu-level-zero=true -finalization-mode=none -app-working-dir <app_working_dir> <app>OpenCL* バックエンド:
vtune -collect-with runss -knob collect-programming-api=true -finalization-mode=none -r <result_dir_name> -app-working-dir <app_working_dir> <app>
レポート:
vtune --report hotspots --group-by=source-computing-task --sort-desc="Total Time" -r <result_dir_name>
インテル® Advisor
インテル® Advisor は、計算を GPU にオフロードするパフォーマンスを向上するのに役立つ 2 つの機能を提供します。
オフロードのモデル化は、ホストの OpenMP* プログラムを調査して、GPU へのオフロードに適したコード領域を示します。また、さまざまな異なるターゲット向けに GPU をモデル化できるため、ターゲットに適したオフロードコード領域を特定できます。オフロード・アドバイザーは、オフロードのパフォーマンスを制限する可能性がある要因に関する詳細情報を提供します。
GPU ルーフライン解析は、 GPU で実行されるアプリケーションを監視し、各カーネルが GPU のメモリー・サブシステムと計算ユニットをどの程度効率良く使用しているか視覚的に示します。これにより、カーネルが GPU にどれくらい最適化されているか知ることができます。
すでにオフロードを実装するアプリケーションでこのモードを使用するには、CPU 上の OpenCL* デバイスを解析ターゲットにする環境を設定する必要があります。手順はインテル® Advisor ユーザーズガイド をご覧ください。
オフロードのモデル化では、GPU を使用するようにアプリケーションを変更する必要はありません。ホストコードで完全に機能します。
リソース:
オフロード API 呼び出しのタイムライン
インテル® VTune™ プロファイラーを使用して、データが GPU にコピーされるタイミング、およびカーネルが実行されるタイミングを調査したくない (またはできない) 場合、onetrace、ze_tracer、cl_tracer と OpenCL* アプリケーションのインターセプト・レイヤーでもこの情報を監視する方法が用意されています (ただし視覚的なランタイム情報が必要な場合、出力を視覚化するスクリプトを用意する必要があります)。詳細については、oneAPI デバッグツール、トレースとオフロードの手順、およびオフロード処理のデバッグをご覧ください。