この記事は、The Parallel Universe Magazine 56 号に掲載されている「The Migration of OpenACC* API to OpenMP* API」の日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。
はじめに
OpenACC* と OpenMP* はどちらもアクセラレーターへのオフロードをサポートしています。OpenACC* が早期に利用可能になったことは計算ワークロードに GPU デバイスを使用するユーザーにとって良いニュースと言えますが、OpenACC* がサポートするデバイスベンダーはまだ限られています。現在は OpenMP* オフロードをサポートするアクセラレーター・ベンダーの数が増えていることから、アクセラレーターへのオフロードに OpenMP* を採用する需要が高まっています。
OpenACC* から OpenMP* API へのインテル® アプリケーション移行ツール (英語) は、OpenACC* ベースのアプリケーションの OpenMP* への移行を支援するオープンソース・プロジェクトです (IWOMP の論文 (英語) を参照)。このツールは、C/C++ および Fortran アプリケーションのソースを解析し、OpenACC* 構造を識別して、可能な場合は意味的に同等の OpenMP* (5.0 以降) 構造を提案します。構造間の記述的/規範的な違いを含む、さまざまな理由により、すべての OpenACC* 構造を OpenMP* に変換できるわけではありません。特に、パフォーマンス・チューニングは考慮されないので注意が必要です。このツールは意味的に正しい移行コードを提供することのみに焦点を当てており、パフォーマンスが最適化されたバージョンの移行コードを提供することには焦点を当てていないため、パフォーマンスの最適化は後の段階で行うことになります。OpenACC* 構造を変換できない場合、ツールは移行レポートにメッセージを生成します。2 つの言語間のマッピングの詳細は、IWOMP の論文で説明されています。アプリケーションのソースが移行されたら、開発者は OpenMP* 5.0 準拠のコンパイラーを選択し、ターゲット・アーキテクチャー向けにアプリケーションをコンパイルするだけです。
次のセクションで、POT3D と GEM という 2 つの移行の成功事例について説明します。その後、いくつかのコメントを述べて、この記事のまとめとします。
アプリケーション移行の例
移行ツールを実証するため、2 つのアプリケーション、POT3D と GEM を選択しました。詳細は、表 1 を参照してください。これらのアプリケーションを移行した後、インテル® HPC ツールキット 2024.0.1 のコンパイラーとライブラリーを使用してコンパイルしました。両方のアプリケーションを、2 ソケットのインテル® Xeon® Platinum 8480+ プロセッサーと 4 つのインテル® データセンター GPU Max 1550 を含む単一ノード上で実行しました。各 GPU は 2 つの計算タイルで構成され、ノードの計算タイルは合計 8 つになります。対応するリポジトリーで提供されているリファレンス出力と比較して実行結果を検証しました。
注:
対象となる計算構造: kernels
、loop
、parallel
および loop
。
対象となるデータ構造: enter
/exit data
、host_data
、および update
。
対象となるアトミック構造: atomic
。
対象となる非同期構造: async
および wait
。
POT3D
POT3D (英語) (commit-id: 5e8ee69f92860a372d5746462199ddfa702bbac2) は、観測された光球磁場を境界条件として使用して太陽コロナ磁場を近似するポテンシャル場の解を計算する Fortran コードです。コードは MPI を使用して並列化されますが、GPU アクセラレーションには OpenACC* と Fortran 標準 do concurrent 構文の 2 つの代替手段があります。この記事では、OpenACC* バージョンを使用します。
次のコマンドを実行してコードを変換しました。
${PATH_TO_TRANSLATOR}/intel-application-migration-tool-for-openacc-to-openmp src -async=none
ここで、src
はアプリケーションのソース・ディレクトリーを指します。-async=none
はソースコード内に存在する非同期 OpenACC* ステートメント (wait
および async
を含む) を無視してコードを変換します。OpenMP* は、これらのステートメントの正確なマッピングを提供しません。幸いなことに、開発者によれば、非同期はこのアプリケーションにほとんど利益をもたらしません。