この記事は、The Parallel Universe Magazine 41 号に掲載されている「Using OpenMP Offload for Programming Heterogeneous Architectures」の日本語参考訳です。
OpenMP* は、バージョン 4.0 からアクセラレーター・オフロードをサポートしています。ベータ版インテル® oneAPI ベース・ツールキット (英語) は、インテル® C/C++ および Fortran コンパイラーで OpenMP* オフロードをサポートします。この記事は、OpenMP* オフロード・ディレクティブの使い方を示します。OpenMP* のいくつかのプラグマを説明し、プログラムのコンパイル方法を示し、サンプル・アプリケーションを使用して OpenMP* のアクセラレーター・オフロード向けに必要なコード変更について述べます。また、インテル® VTune™ プロファイラーとインテル® Advisor を使用して、パフォーマンスのホットスポットを見つけ、コードを最適化する方法を紹介します。
OpenMP* オフロード・ディレクティブ
OpenMP* の declare target
ディレクティブは、アクセラレーター・デバイス上の関数、サブルーチン、または変数をマップしてアクセス可能にします。target map
ディレクティブは、デバイス環境にデータをマップして、デバイス上でオフロードコードを実行します。map
節のマップタイプは、ホストとデバイス間のデータマップを指定します。
to:x
は、デバイス上でデータを読み取り専用にします。from:x
は、デバイス上でデータを書き込み専用にします。tofrom:x
は、ホストとデバイスの両方でデータを読み書きできるようにします。
図 1 のコードは、次の 4 種類のオフロードを実行する SAXPY の例です。
DEFAULT
TEAMS
THREADS
TEAM_THREADS
それぞれ異なる OpenMP* ディレクティブを使用します。DEFAULT
は、基本の OpenMP* オフロード・ディレクティブを使用します。TEAMS
は、num_teams
節を使用してスレッドチームを生成します。チームとスレッドの数は指定しません。これらは実行時に選択されます。THREADS
は TEAMS
に似ています。thread_limit
節でチームごとのスレッド数を指定します。TEAM_THREADS
は、チームの数とチームごとのスレッド数の両方を指定します。
図 1. 4 種類の OpenMP* オフロードを使用する SAXPY コードの例
SAXPY のそれぞれのオフロードは、メインプログラム内で通常のルーチンとして呼び出すことができます。DEFAULT
は次のようにコンパイルできます。
-fiopenmp
オプションは、LLVM で OpenMP* の変換を有効にします。-fopenmp-targets=spir64
オプションは、GPU デバイス向けに x86 + SPIR64 ファットバイナリーを生成するようコンパイラーに指示します (コンパイルプロセスの詳細は、「ベータ版インテル® C++ コンパイラーおよびベータ版インテル® Fortran コンパイラー向けの GPU への OpenMP* オフロード導入」の「C++ および Fortran の PVC ディレクティブのサポート強化」または『インテル® oneAPI プログラミング・ガイド』の「プログラミング・インターフェイス」 > 「コンパイルモデル」を参照)。
ほかの種類のオフロードをコンパイルするには、-D
オプションを使用します (例えば、TEAMS
の場合は -DTEAMS
を使用します)。次のようにプログラムを実行します。
ケーススタディー: 量子色力学
このセクションでは、OpenMP* オフロードプラグマを MILC アプリケーション (英語) に追加します。ここでは、インテル® Iris® Pro グラフィックス 580 (Gen9) GPU が統合されたインテル® Core™ i7-6770HQ CPU 2.60GHz を搭載した NUC マシンを使用します。Gen9 は 72 個の実行ユニット (EU) を備えており、3 つのスライス、スライスごとに 3 つのサブスライス、サブスライスごとに 8 つの EU があります。L3 キャッシュのサイズは 3 * 512KB = 1.5MB で、LLC のサイズは 8MB (CPU コアと共有) です。すべての MILC 実行は wx12t12.in 入力ファイルを使用します。
ここでは、OpenMP* オフロードを有効にすることに注目します。最初に、インテル® Advisor を使用してコードをプロファイルし、パフォーマンスのホットスポットを見つけます。表 1 は、ホスト CPU 上の上位 4 つのホットスポットです。これらのコード領域は Gen9 へのオフロード候補です。それぞれのホットスポットに TEAM_THREADS の OpenMMP* プラグマを追加します。追加後のコードを図 2 から 5 に示します。
表 1. ベータ版インテル® Advisor のオフロード・アドバイザーで検出された上位の MILC ホットスポット
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。