Fortran の DO CONCURRENT を使用したアクセラレーター・オフロード

インテル® Fortran コンパイラー

この記事は、The Parallel Universe Magazine 53 号に掲載されている「Using Fortran DO CONCURRENT for Accelerator Offload」の日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。


parallel_v53_06

数式 (FORmula) をコードに変換 (TRANslate) する必要がある場合、FORTRAN は最適なオプションであり、これまで 66 年間にわたり使用されてきました。Fortran こそが数学演算向けのオリジナルのドメイン固有言語であると主張することもできますが、その議論は別の機会に取っておきます。この記事の目的は、Fortran の長所を称賛することではなく、ヘテロジニアス並列処理における Fortran の長所と短所を評価することです。

標準ベースのプログラミング言語は、アルゴリズムを表現する共通の方言を提供しています。「SYCL* の事例: ISO C++ がヘテロジニアス・コンピューティングに十分でない理由」で説明したように、特殊なハードウェアのサポートには時間がかかる傾向があります。ISO Fortran がヘテロジニアス・コンピューティングをどの程度サポートしているか見てみましょう。おそらく、ロスアラモス国立研究所の最近のレポート「今後 15 年間にミッション・クリティカルなコードを Fortran に依存することのリスクの評価」 (英語) によって引き起こされた議論に何かを追加できるでしょう。

DO CONCURRENT 構文は ISO Fortran 2008 で追加され、最近の ISO 標準で強化されました。この構文は、DO CONCURRENT ループの反復が独立していて、並列実行できることをコンパイラーに通知またはアサートします。インテル® Fortran コンパイラーは DO CONCURRENT をサポートしています。DO CONCURRENT ループはシーケンシャルかつ並列に実行でき、OpenMP* バックエンドを使用して DO CONCURRENT ループをアクセラレーターにオフロードすることもできます。

単純なイメージ・セグメンテーション・アルゴリズムを使用して、この機能を実証します。このアルゴリズムは、イメージ内のオブジェクトのエッジを検出します (図 1)。エッジにはイメージ内のほとんどの情報が含まれるため、このハイパスフィルターは多くのコンピューター・ビジョン・プロセスの最初のステップとなります。図 1 は、「1」のグループで表される 3 つのオブジェクトを含むバイナリーイメージを示しています。エッジマスクはブール行列で、true (T) は対応する「ピクセル」がオブジェクトのエッジにあることを意味します。


図 1. 単純なバイナリーイメージのエッジ検出

Fortran は、エッジ検出を簡単にコーディングできる、便利な配列表記法と組込みプロシージャーを提供しています (図 2) 。このアルゴリズムは、9 ポイントのバイナリーフィルターを各ピクセルに適用することで実装できます。DO CONCURRENT ループのプレディケートにより、フィルターはオブジェクトの一部であるピクセルにのみ適用されます。各ピクセルの演算は独立しているため、アルゴリズムはデータ並列性が高く、Fortran DO CONCURRENT ループと数行のコードで簡単に実装できます。


図 2. Fortran DO CONCURRENT ループ (青でハイライト表示) を使用して実装したエッジ検出。オフロードカーネルは緑でハイライト表示しています。完全なコード (img_seg_do_concurrent.F90) は GitHub* (英語) から入手できます。

DO CONCURRENT 構文は、DO 構文の別の形式にすぎません。DO CONCURRENT を初めて見た場合でも、ほとんどの Fortran プログラマーには、この例が二重にネストされた DO ループのように i インデックスと j インデックスをループしていることは明らかでしょう。DO CONCURRENT 構文の新しい点は、オプションのプレディケートです。これは、LOGICAL 型のスカラーマスク式です。プレディケートがある場合、マスク式が TRUE の反復のみ実行されます。上記の DO CONCURRENT コードは、次の DO および IF 実装と機能的には同等です。

主な違いは、DO CONCURRENT は依存関係がないことをコンパイラーにアサートするため、反復を任意の順序で実行できることです。インテル® Fortran コンパイラーは、OpenMP* バックエンドを使用して、DO CONCURRENT ループ内のステートメントを並列化またはオフロードできます。これは、サンプルコードをコンパイルするコマンドを見れば明らかです。

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