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

この記事は、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 ホットスポット

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

関連記事

  • Parallel Universe マガジンParallel Universe マガジン Parallel Universe へようこそ。 米国インテル社が四半期に一度オンラインで公開しているオンラインマガジンです。インテルの技術者によるテクノロジーの解説や、最新ツールの紹介など、並列化に関する記事を毎号掲載しています。第1号からのバックナンバーを PDF 形式で用意しました、ぜひご覧ください。 12 […]
  • 書評: 『The OpenMP Common Core』書評: 『The OpenMP Common Core』 この記事は、The Parallel Universe Magazine 40 号に掲載されている「Book Review: The OpenMP Common Core - Making OpenMP Simple Again」の日本語参考訳です。 OpenMP* […]
  • インテル Parallel Universe 40 号日本語版の公開インテル Parallel Universe 40 号日本語版の公開 インテル Parallel Universe マガジンの最新号が公開されました。 Parallel Universe マガジンは 3 号を除くすべての号が日本語訳されています。初期の号は 20 ページ前後の比較的小規模な読み物でしたが、最近では 100 […]
  • インテル Parallel Universe 30 号日本語版の公開インテル Parallel Universe 30 号日本語版の公開 インテル Parallel Universe マガジンの最新号が公開されました。 この号の注目記事、「インテル® Advisor のフローグラフ・アナライザーで自動運転コードのパフォーマンスを向上」では、インテル® Parallel Studio XE のプレビュー機能であるフローグラフ・アナライザー (FGA) […]
  • インテルの最新の並列化ツールによる明示的なベクトル化インテルの最新の並列化ツールによる明示的なベクトル化 この記事は、インテル® デベロッパー・ゾーンに掲載されている「Vectorization Gets Explicit with Intel’s Updated Parallel Tool」 […]