ヘテロジニアス・アーキテクチャーのプログラミングに OpenMP* オフロードを使用する

インテル® Parallel Studio XE

この記事は、The Parallel Universe Magazine 41 号に掲載されている「Using OpenMP Offload for Programming Heterogeneous Architectures」の日本語参考訳です。


parallel_v41_02

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 節を使用してスレッドチームを生成します。チームとスレッドの数は指定しません。これらは実行時に選択されます。THREADSTEAMS に似ています。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 ホットスポット

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

タイトルとURLをコピーしました