インテル Fortran コンパイラーの次なる展開


この記事は、インテル® コミュニティーのブログに公開されている「The Next Chapter for the Intel® Fortran Compiler」の日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。


インテル® Fortran コンパイラー開発チームはメジャー・マイルストーンであったインテル® Fortran コンパイラー IFX 2023 のリリースを達成したことを嬉しく思います。この IFX 2023 のリリースでは、インテル® Fortran コンパイラー・クラシック、IFORT と同等の Fortran 言語機能を追加しました。これは小さな達成ではありません。初めに、IFX は IFORT と同様の Fortran 2018 の完全な言語サポートに対応しました。これには多くの方が期待していたであろう、DEC/Compaq/インテルの言語機能、拡張機能、そしてコンパイラー・ディレクティブが含まれています。しかし、これに加えてさらに、IFX のストーリーで祝福することがあります。並行して、Fortran コンパイラーに OpenMP* GPU オフロードの機能が追加され、インテル® データセンター GPU マックス・シリーズのようなインテル® GPU のアクセラレーションにアプリケーションからアクセスできるようになりました。このプログではなぜこれが偉業的なリリースであるのか、そして、どのようにインテル® Fortran の次なる展開へつながるのかを説明します。リリースのハイライトに入る前に IFX の開発の歴史について振り返っておきましょう。

IFX 開発: 旅路

今から4、5年前、インテル® Fortran コンパイラー・チームはインテル® Fortran コンパイラーをより近代化するプロジェクトを開始しました。当時、C/C++ ICC コンパイラーと共有していた、数十年以来の独自のコンパイラー・テクノロジーである ILO が限界に達していることが明らかになりつつありました。そこで、コンパイラー・テクノロジーをモジュール化された保守が容易なフレームワークへ移行することにしました。クリーンで現代的なフレームワークはオブジェクト指向に基づくものです。このゴールを達成するために、私たちは、インテル・アーキテクチャーにおける Fortran のスタンダードである最も人気の高い IFORT に挑戦し、いずれは取って代わるような、LLVM コンパイラー・フレームワークをベースとした新しい Fortan コンパイラーを作ることに決めました。最終的なゴールは LLVM ベースのフレームワークである Fortran フロントエンドを使用して、管理しやすく、そして何十年もの将来にわたって Fortran ユーザーをサポートできるコンパイラーにすることでした。この数十年、お客様が IFORT や DEC Fortran へ投資していることを知り、お客様がインテルに期待する高品質な Fortran コンパイラーを開発することが目標となりました。ビジネスの観点においては、インテルの開発ポートフォリオの中で、Fortran が最も人気があり、成功した製品であったため、継続的に同製品を提供する必要があることは明らかでした。インテル® Fortran への期待により、インテル® Fortran フロントエンドである IFORT を超え、さらに現代的なコンパイラー・フレームワークにしなければいけないことを痛感していました。

インテル® Fortran フロントエンドとは、そしてなぜそれが重要なのか

皆さんよくご存じのように、コンパイラーは Fortran ソースファイルや製品バイナリー、ライブラリー、さらに実行可能なプログラムを生成するプログラムです。現代のコンパイラーは複雑なソフトウェアの一部です。大まかに簡略化すると、コンパイラーはフロントエンド、ミドルエンド、そしてバックエンドの 3 つのマクロなパートから構成されています。インテル® Fortran フロントエンド (FFE) は IFX コンパイラーの最初のパートとなります。FFE は Fortran コードを解析、解読し、Fortran 言語規格に適合していることを確認してから、内部表現に変換します。プログラマーにとって、これは、作業に最も影響を与えるコンパイラーのパートです。これは Fortran コードのどの部分を受け入れ、警告または拒否するかの判断材料となります。FFE パートが完了した後、プログラムの検証されたバイナリー表現を 2 つ目のパートである LLVM ベースの「ミドルエンド」と呼ばれる部分に渡します。ミドルエンドの後、3 つ目のパートである「バックエンド」へと移ります。このバックエンドは CPU および GPU のアーキテクチャーをターゲットとしたコードを生成します。

IFX フロントエンド・コードに関しては、IFORT と同じインテル® Fortran フロントエンド (FFE) を使用しています。これはコンパイラーの最初のパートであり、Fortran 言語特有のもので、Fortran コードを解析、解読します。IFX と IFORT が同じ FFE を共有することで、スムーズに問題なく、IFORT から IFX へ移行できます。

IFX 開発への挑戦

分かりやすく言うと、インテル® Fortran 開発チームの仕事は、FFE (最初のパート) を、新しい LLVM ベースのインテル® ICX および DPC++ コンパイラーが共有する LLVM ベースのフレームワーク (2 つ目のパートおよび 3 つ目のパート) に結合または「固定」することでした。簡単なように聞こえますが、これらのパートに取り組むことは、骨の折れるような作業でした。

2018年から2020年: 計画、設定、コンセプトの証明

2018年から2020年の間は企画やビルドシステムおよびテストハーネスの設定、LLVM 技術の増強、初期のプロトタイピングに注力しました。この IFX 開発のフェーズはインテルの社外には公表されませんでした。多くのメジャーなソフトウェア・プロジェクトのように、アーキテクト、初期コーティング、プロセスやツールの導入が混在していました。そして IFX で F77「Hello World」プログラムのコンパイルに初めて成功したときはとても興奮しました。続いて、ベクトル加算カーネルの単純な OpenMP* オフロードが行われました。IFX が成長を始めたのです。

2021年実行の初期段階: 厳しいスタート

onAPI 2021 のリリースで IFX のベータ版を初めて公表しました。この初めてのベータ版は F90 の機能と OpenMP* オフロードの機能を備えた Fortran 77 コンパイラーでした。ベータ版と呼ぶには、少し大げさでした。これはコンセプトの証明でした。このバージョンについての言及は、それがすべてです。

2022年、積極的かつ急速な開発の年

2022.0 リリースでは、IFX は成熟途中でした。Fortran 言語の機能および OpenMP* オフロード機能の 2 つに重点をおいて IFX を積極的に開発していました。OpenMP* オフロード機能は急速に成熟し、早期に採用した方々は、Fortran 計算カーネルをサポートするインテル® GPU にオフロードするために、アプリケーションに OpenMP* ディレクティブを追加できるようになりました。Fortran 言語機能については、バージョン 2022.0 の IFX から、F77 と F90/95 の完全な実装、多くの F2003、いくつかの F2008 機能、いくつかの F2018 機能を追加しました。2022年の大部分を通じて、IFX はこれらの標準の高度な機能を使用するモダンな F2003/2008/2018 アプリケーションのコンパイルにいくつかの問題を抱えていました。2022年の秋にリリースされたインテル® oneAPI 2022.3 に含まれる IFX の2022年最後のアップデート・リリースで、ようやく比較的安定した有用なモダンな Fortran コンパイラーを手に入れることができたのです。コンパイラー・バージョン 2022.2 はまだ IFORT に匹敵するものではありませんでしたが、あと一歩のところまで、急速に近づいていました。

2023年、実装を完了

IFX 2023 のリリースにより、言語の同等性を示すために必要な IFORT のすべての Fortran 言語機能に対応しました。その上、IFX は業界で最も先進的な OpenMP* 5.0/5.1 の実装を備えています。そして近々リリース予定の OpenMP* 6.0 標準からいくつかの機能を追加します。昨年の 2022.0 リリースから今回の 2023.0 リリースまでの進捗を見るために、最初の 2022.0 リリースから今日の 2023.0 リリースまでの間に IFX に行われた修正の数を紹介します。この 1 年間で、Fortran フロントエンド開発チームは、コンパイラー・フロントエンド・コード・ベースに 804 件の修正または「編集」を行いました。これらの中には、1 つまたは 2 つのソースファイルに対する単純な修正もありましたが、Fortran フロントエンドの多くの部分に影響を与えるような大規模な修正もありました。この 804 件の修正は、ICX/DPC++ コンパイラーのチームと共有しているミドルエンドのオプティマイザーとバックエンドのコード生成部分に対する昨年のすべての変更に加えて行われたものです。804 件の編集や修正が行われたということは、2022年を通して平日 1 日あたり平均 3 つ以上の編集が行われたことになります。しかも、これは Fortran フロントエンドだけでの話です。つまり、2022年もしくは2021年に IFX を試したことのある人は、もう一度試すべき時期が来たと言えるでしょう。IFX 2023 は、以前に提供されたコンパイラーと比較して、はるかに改善されています。

IFX 2023 のいくつかのハイライト

Fortran 言語機能のハイライト

  • Fortran 標準サポートにおいて IFX は、Fortran 2018 標準とそれ以前のすべての標準を実装しています。IFORT と同様に、注意事項はありません。これにより、IFX は Fortran コミュニティーで最も先進的な Fortran コンパイラーの 1 つとして位置付けられています。
  • OpenMP* 5.x オフロード
  • Fortran プログラマーは OpenMP* 5.x オフロードにより、インテル® データセンター GPU マックス・シリーズなどのインテル® GPU 上でコードを高速化することができます。
  • レガシー DEC 拡張機能のサポート

IFX では、IFORT と同じ拡張機能、ディレクティブ、動作がサポートされています。インテル® Fortran は、レガシー・アプリケーションを将来にわたってサポートします。

  • DO CONCURRENT の自動 GPU オフロード

この記事の後半で説明します。

最新の変更点をオンラインのリリースノートで公開しています。リリースノートでは、各リリースの新機能の概要を説明しています。リリースノートに加えて、Fortran 標準機能と OpenMP* 機能の詳細な表を Fortran Language and OpenMP* Features ページに掲載しています。これらのページでは、インテル® Fortran の最新の開発状況を確認できます。このリリースのハイライトをいくつか紹介します。

DLLIMPORT/DLLEXPORT

Windows* 上でインテルのコンパイラーを使用するユーザーのためのコミュニティーがあります。IFORT の大きな特徴の 1 つは、Windows* のダイナミック・リンク・ライブラリー、つまり DLL を作成して利用できることでした。この共有ライブラリー・オブジェクトは、言語混在プログラミング、アプリケーションのモジュール化とアップデートの容易化、CAD/CAM、表計算プログラム、その他のサードパーティー製ツールやアプリケーションの Fortran による拡張機能の追加に使用できます。これは、Windows* をサポートするどの Fortran コンパイラーにとっても、必要不可欠な機能です。IFX 2022.2 リリースまで、DLL を作成して利用する機能は IFORT にしか存在しませんでした。IFX にこの機能が必要であるという Windows* ユーザーからの強い要望にインテルは応えたのです。

Fortran と C の相互運用性機能

確かに、世の中には非常に優れた機能を持つ C/C++ のライブラリーやソースが豊富に存在します。そして、OS とそのシステム関数は C/C++ で作られているので、Fortran のコードが C を呼び出したり、呼び出されたりする方法が必要です。IFORT は何年も前からこの目的のために組込みモジュール iso_c_binding を提供しています。繰り返しますが、これは Fortran 言語のサポートを主張するコンパイラーには必須の機能です。IFX は以前のリリースでも iso_c_binding をサポートしていましたが、今回のリリースでは、ランク引き継ぎ配列や C 配列記述子を含むすべての C 言語との相互運用性機能も追加されています (Fortran 2018)。

より高速なコンパイル

LLVM ベースの実装に移行する利点と理由の 1 つは、クリーンでモジュール化されたモダンな設計です。このことは、コンパイル時の性能に現れています。IFX は IFORT に比べて最大 18% も速くコンパイルでき、生産性を高めることができます。以下は、IFX と IFORT のコンパイル時間を比較した初期の数字です。

DO CONCURRENT の自動オフロード機能

インテル® GPU へのオフロードに関しては、IFX はアプリケーションのニーズで最も要求の多い OpenMP* 4.5/5.0/5.1 機能で業界をリードしています。しかし、より高いレベルで見ると、OpenMP* は Fortran 言語の拡張です。Fortran プログラムにとって、OpenMP* は、サポートするランタイム・ライブラリーとともに、外部のディレクティブと関数のセットです。これらは Fortran 言語規格の一部ではありません。

Fortran コミュニティーでは、OpenMP* のような外部拡張やランタイム・ライブラリーに頼らずに、言語で直接並列プログラミング・パラダイムをサポートする方法について何年も前から議論されています。このような努力は、High Performance Fortran (HPF) にまで遡ることができます。そして、IFORT と IFX の両方に実装されている Co-Array Fortran については、小耳に挟んだことがある人もいるかもしれません。そして、F95 FORALL 文と構造がありますが、これはさまざまな理由で Fortran 2018 では陳腐化しました。そして直近では DO CONCURRENT が Fortran 2008 で導入され、Fortran 2018 で強化され、次期 Fortran 202x 標準でさらなる強化が予定されています。

DO CONCURRENT は、次の DO ブロックを並列実行してもよいことを表明する方法です。ループの反復の間に相互依存性はありません。「してもよい」であり、「する必要がある」とは言っていないことに注意してください。DO CONCURRENT はコンパイラーにループの並列実行を要求するのではなく、DO ブロックが安全に並列実行できることをコンパイラーに宣言または表明するもので、したがってコンパイラーが選択すればループを並列実行することができます。

IFX、IFORT ともに、-qopenmp または /Qopenmp オプションを使用すると、マルチコア CPU の場合、DO CONCURRENT で並列化します。この最新リリースでは、DO CONCURRENT 用の IFX を拡張し、サポートされているインテル® GPU へのオフロードを可能にしました。この機能は、OpenMP* GPU オフロードのサポートと同様に IFX でのみ提供され、IFORT では提供されません。サポートされるインテル® GPU への DO CONCURRENT の「自動オフロード」のための実装では、さらに 2 つのオプションが必要です。以下は、リリースノートと Intel Fortran Developer Guide and Reference に記載されている新しいオプションの説明です。

Linux*:

-fopenmp-target-do-concurrent

-fno-openmp-target-do-concurrent

macOS*: None

Windows*:

/Qopenmp-target-do-concurrent

/Qopenmp-target-do-concurrent-

このオプションは、OpenMP* を指定するために必要な 2 つのオプションに追加されます。また、オフロードのターゲット・アーキテクチャーまたは SPIR-V* を指定するために、-fopenmp-targets というオプションも追加で必要です。Linux* で必要なオプションの例を次に示します。

-qopenmp -fopenmp-target-do-concurrent -fopenmp-targets=spir64

このようにたくさんのオプションがあります。しかし、このようなオプションにあまり執着しないでください。既存のいくつかの OpenMP* オプションを再利用するのではなく、単一のシンプルなコンパイラー・オプションが欲しいというユーザーからの要望がすでにありました。結局のところ、DO CONCURRENT をオフロードするために OpenMP* を使用していることを知る必要はないはずです。目標は、並列処理をより高いレベル、つまり Fortran のレベルに持っていくことであり、実装の詳細はインテルにお任せください。

IFX で OpenMP* オフロードのための PC またはワークステーションをすでにセットアップしている場合は、上記のオプションを使用して DO CONCURRENT オフロード機能のテストを開始することができます。そうでない場合は、今後のブログで、オフロードのための Windows* または Linux* システムのセットアップを説明します。

IFORT は?

Fortran の開発者は、新しいからと言って「ピカピカの新商品」を追いかけるわけではありません。私たちは、DEC Fortran 以来、Fortran コミュニティーに貢献してきました。私たちは、新しいコンパイラーやツールを採用する前に、コミュニティーが価値を見出さなければならないことを理解しています。私たちは、IFX が IFORT で提供されるすべてとそれ以上のものを提供することを、ユーザーに証明しなければいけません。IFX には、IFORT にはなく、今後も追加されることはないであろう OpenMP* オフロード機能が備わっています。IFX がより速い性能を持つことを保証する必要もあります。性能は2023年に向けての作業となります。近い将来に、IFX に最新のインテルのハードウェアのサポートを追加する予定です。IFORT に GPU サポートを追加することはありませんし、将来のプロセッサー・チューニングを追加することもないでしょう。前述の通り、IFX はより高速なコンパイルを実現します。

多くの方がインテル® Fortran と IFORT に投資されていることは理解しています。同時に、インテル® Fortran が進むべき道は IFX であると考えています。もちろん、移行期間中は IFX とともに IFORT も提供します。移行期間のスケジュールは設定していません。これは、IFX がどれだけ早く IFORT との性能差を縮め、安定性を示すことができるかによります。しかし、IFX が IFORT を置き換えることができると確信した時点で、IFORT を非推奨とし、その後、リリース・パッケージから削除して、長期製品サポートに移行する予定です。また、通常の旧製品サポートポリシーに従い、IFORT の非推奨化およびリリース済みパッケージからの削除後も、さらに数年間、インテル® レジストレーション・センターでのダウンロードにより、優先サポートで、IFORT を提供し続ける予定です。優先サポートについては、こちらをご覧ください。IFORT の計画が具体化した時点で、お知らせする予定です。しかし、IFX への移行を直前まで待たないことをお勧めします。

IFX の現在と2023年以降の展望

インテルがなぜ IFX 2023 を誇りに思うのか、おわかりいただけたと思います。IFORT で Fortran 言語パリティーの目標を達成し、Fortran 2018 標準の実装を完了しました。そして、業界をリードする Fortran OpenMP* 5.x の実装を提供します。ここまで来るには、過去4、5年の間、チームによる積極的な開発努力がありました。

さて、インテル® Fortran の今後はどうなるのでしょうか。今回は、DO CONCURRENT の自動オフロードについて説明しました。Fortran 202x の新機能では、リダクション句が追加されました。DO CONCURRENT が OpenMP* に対抗するためには、リダクションが不可欠です。F02x はまだ批准されていませんが、おそらく将来のアップデートですぐにこの機能を実装する予定です。これは、インテルのユーザーや熱心な支持者から強い要望があり、より広い Fortran コミュニティーでこの機能を採用するのに役立つことでしょう。インテルは、並列性を強化する Fortran 言語機能を全面的に支持しています。

Fortran 202x は、おそらく Fortran 2023 として知られるようになるでしょう。そして、この標準に含まれるいくつかの新機能の開発をすでに開始しています。インテル® Fortran コンパイラーでは、この次期規格を迅速に採用することをお約束します。

インテルはすでに OpenMP* 6.0 の機能をいくつか実装しており、この新しい規格のサポートが拡大することを十分に期待しています。

IFX の安定化は、2023年における優先事項です。インテルのアプリケーション・エンジニアリング・チームは、多くの大規模な科学技術コードを IFX で実現し、成功を収めてきました。また、多くのユーザーから、IFX を使ったアプリケーションのコンパイルと実行に成功しているとの声をいただいています。しかし、IFORT から IFX への移行を開始した多くのユーザーによって、安定性の真のテストが行われるでしょう。2023年に IFX の使用と採用が増え、この道のりを助けてくれることを期待しています。

性能については、インテル独自のテストでは、IFX は IFORT と拮抗しており、概ね今日の IFORT と同等であることが分かっています。2023年には、より多くのベンチマークレポートで IFX が使用されているのを見ることになるでしょう。IFX と IFORT の間で性能が異なる異常値は存在するかもしれません。IFX をテストし、インテル® Fortran コミュニティーで採用することで、性能の同等性をよりよく評価する必要があります。インテル® コンパイラーについて知っておくべきことの 1 つは、インテル® コンパイラーはパフォーマンスを重視するということです。2023年以降、IFX が進化するにつれて、パフォーマンスが向上することが期待されます。アプリケーションの経験を積みながら、IFX のパフォーマンスを向上させ、IFX でより良いパフォーマンスを実現するための記事を公開していく予定です。

2023年には、この新しいコンパイラーを立ち上げるために必要な開発努力に積極的に注力する章から IFX の新しい章に移行する予定です。この新しい章には、ほとんどすべてのケースで IFORT よりも IFX の方がパフォーマンスが良いことを確認する作業が含まれています。新しい章では、IFX が IFORT と同等かそれ以上に安定していることを確認します。新しい章では、Fortran 202x の機能を追加し、OpenMP* 6.0 の機能を追加します。新しい章では、2023年を通して、そして、2024年のリリースまでに、IFX が IFORT よりも明らかに優れていることに疑いの余地がないようにすることを目標としています。

結び

2023年は、IFX と IFORT を比較することをお勧めします。優先サポートをご利用の場合は、オンライン・サービス・センターのアカウントを通じてご質問や問題に対応しています。優先サポートをご利用でない場合は、インテル® Fortran コミュニティー・フォーラムをご利用ください。

本リリースに関する追加情報

IFX は、Windows* と Linux* で利用できます。IFX は、macOS* ではご利用いただけません。このインテル® oneAPI ツールキットとコンポーネントの最新アップデートは、2022年12月に公開されました。インテル® oneAPI ツールキットのバージョンは 2023.0.0 です。IFX はインテル® oneAPI ベース & HPC ツールキットに含まれており、単体コンポーネントのダウンロードとランタイム・バージョン・ページ、およびパッケージ・マネージャー用のリポジトリーから個別のダウンロードとして提供されています。Linux* および Windows* では、以下が含まれます。

インテル® Fortran コンパイラー・バージョン 2023.0.0 (IFX)
インテル® Fortran コンパイラー・クラシック・バージョン 2021.8.0 (IFORT)
macOS* では、インテル® Fortran コンパイラー・クラシック・バージョン 2021.8.0 (IFORT) のみを提供します。

また、Fortran コンパイラーを含む oneAPI HPC ツールキットをダウンロードすることも可能です。IFX を初めてお使いになる IFORT ユーザーの方は、インテル® oneAPI ポーティング・ガイド (ifx) を必ずお読みください。

エクセルソフトではインテル® oneAPI 各ツールキットの優先サポートを日本語でご対応させていただいております。