We use cookies to ensure you get the best experience on our website. Learn more
Fortranコードの近代化と高速化
古くから作成された優れたFortranアプリケーションは多数存在しますが、最新のコンパイラを使用するためには、廃止された言語機能を削除するようソースコードをアップグレードする必要がある場合があります。通常、この作業はソースコードを少なくともFortran 1995標準に更新することを意味します。
コードの近代化
Fortranの近代化には以下が含まれる場合があります:
- 64ビットアプリケーションへの変換。これにより、より多くのメモリを使用できるようになります。
- "common blocks"をより近代的な"modules"に変換。
- PARAMETER文をモジュール内で使用したり、整備したりする。
- 配列を動的に確保。
- 古い形式のDOループを、より近代的なDO/END DOペアに変換し、非推奨となった共有型DOの終了ステートメントを個別のDO ENDに置き換える。
- モジュール外の配列を動的に確保。
- アップグレードによって明らかになるバグを修正。たとえば、メモリ使用量を最新化すると、「配列インデックスが範囲外」のバグが露呈する可能性があります。
- DOループやIF-THEN-ELSEグループのインデントを整備して、ソースコードの可読性を向上。
- アプリケーション固有のアップグレードケースに伴うその他の手動整備。
Fortranコードの近代化プロセスは面倒で時間がかかるため、上記の作業の大部分を自動化するためのツールをいくつか開発しました。
コードの高速化
ソースコードが整理され、性能基準となるアプリケーションが準備できたら、性能を向上させるためのいくつかの方法があります:
- アプリケーションがすでにメモリ不足だった場合、より多くのメモリを割り当てて動作させる。
- SIMD("Single Instruction Multiple Data")コンパイラオプションを有効にして、コンパイラが1つの命令で複数の配列アイテムを処理するコードを生成できるようにする。
- 最も計算負荷の高いループでOpenMPを使用してマルチコア/マルチスレッド処理を有効にする。現在のCPUは2コアから100コア以上を備えています。
粒子、分子、またはセルが何百万もある場合、これらのコアに計算を分散することで、大幅な性能向上が可能です。
プロファイリングツールを使用して最も負荷の高い部分を特定し、ソースコードを並列化の可能性を検討し、可能であれば簡単なOpenMPディレクティブを追加して並列ループに変換します。
- マルチシステムの異種計算を有効にする。これはOpenMPIを実装することを意味します。これにより、計算を複数のコンピュータに分散できます。
この技術は真に巨大な計算問題にのみ適用されるため、特定のアプリケーションでこれが有益かどうかを検討する必要があります。
- GPUサポートを有効にする。現在の高性能CPUが100以上のコアを備えている一方で、ハイエンドGPUは10,000以上のコアを持っています!
GPUコアはCPUコアよりも遅いですが、その膨大な数により通常はより高速に処理を完了できます。
Fortranの世界でGPUサポートを有効にするには、OpenACCを使用します。OpenACCはOpenMPに似ています。
NVIDIA GPUでさらに低レベルの制御を実現するためには、CUDA APIを使用することも可能ですが、FortranではC/C++よりも少し手間がかかります。
- 複数のGPUを使用する。このアプローチは、データポイント(例: 粒子)がどの程度相互作用するかによって適用できる場合があります。
頻繁な相互作用がある場合、GPU間でのデータ管理時間が追加の計算能力のメリットを相殺する可能性があります。
アプリケーションはどれくらい速くなるのでしょうか?申し訳ありませんが、その質問にはお答えできません!
一般的には、複数のコアを使用すると2倍から3倍の高速化が期待でき、1つのGPUを使用すると10倍から20倍の高速化が可能です。
もし古いFortranプロジェクトをアップグレードしたい場合や、すでに近代化されたプロジェクトをさらに高速化したい場合は、お問い合わせください。