皆さん、こんにちは。かつて宇宙の深淵を覗く数値シミュレーションの基盤を組み上げていた者です。
Fortranと聞くと「古い」「レガシー」といった言葉が脳裏をよぎるかもしれません。しかし、現代のHPC(ハイパフォーマンス・コンピューティング)の世界において、Fortranは依然として「計算速度」という一点において最強の矛であり続けています。
今日は、C言語やPythonを使いこなす皆さんが、Fortranの世界へ足を踏み入れるための最初の関門であり、最強の武器でもある`ISO_C_BINDING`についてお話しします。
—
なぜFortranでCのライブラリを呼ぶのか?
皆さんが研究や業務で使うライブラリの多くは、CやC++で書かれています。例えば、高速フーリエ変換の「FFTW」や、行列計算の「LAPACK/BLAS」、あるいはGPUを叩くためのCUDA APIなどです。
これらをFortranから直接叩くとき、メモリの配置やデータ型の解釈が食い違うと、プログラムはあっという間に「セグメンテーションフォールト」という名の深淵へ堕ちていきます。そこで登場するのが、`ISO_C_BINDING`モジュールです。これは、FortranとCの間に置く「完璧な通訳者」だと考えてください。
—
ステップ1:通訳者の呼び出し方
まずは、Fortranのソースコードの冒頭で、この「通訳者」を読み込みます。
module c_interface_mod
! ISO_C_BINDINGという最強のライブラリを読み込みます
use, intrinsic :: iso_c_binding
implicit none
! ここにC言語の関数定義を「Fortran語」に翻訳して登録します
end module
ここでのポイントは、`use, intrinsic :: iso_c_binding` です。これを使うことで、`c_int` や `c_double` といった「C言語と完全に互換性のある型」が使えるようになります。
—
ステップ2:C関数のインターフェースを定義する
次に、C言語側の関数をFortran側でどう呼び出すかを定義します。例えば、C言語で `void my_c_function(int a, double b)` という関数があるとしましょう。これをFortran側で登録するには、`interface`ブロックを使います。
interface
subroutine my_c_function(a, b) bind(c, name=”my_c_function”)
use, intrinsic :: iso_c_binding
integer(c_int), value :: a ! Cの int は c_int
real(c_double), value :: b ! Cの double は c_double
end subroutine
end interface
ここで重要なのは `value` 属性 です。C言語は基本的に「値渡し」ですが、Fortranの古い習慣は「参照渡し(ポインタ渡し)」です。`value`を忘れると、Fortranは「メモリのアドレス」を渡そうとして、C側でメモリ破壊を引き起こします。現場で一番多いデバッグの落とし穴がここです。
—
ステップ3:メモリの配置に注意せよ
さて、ここからが「現場の知見」です。FortranとCで配列をやり取りする際、最も注意すべきなのは「列優先」と「行優先」の呪いです。
- Fortran: 列優先(Column-major)。行列の左側の添字が先に動く。
- C言語: 行優先(Row-major)。行列の右側の添字が先に動く。
もしFortranの多次元配列をそのままCの関数に渡すと、インデックスが逆転して計算結果がゴミになります。大規模な行列計算を連携させる場合は、配列を転置(Transpose)して渡すか、あるいはメモリレイアウトをC言語側と合わせるという泥臭い工夫が不可欠です。
—
実践:コンパイルの極意
最後に、ビルド設定について。GCCを使っている場合、FortranとCをリンクするのは非常に簡単ですが、最適化フラグには注意が必要です。
Fortran側のコンパイル (gfortran)
gfortran -O3 -march=native -c my_fortran_code.f90
C側のコンパイル (gcc)
gcc -O3 -march=native -c my_c_lib.c
リンク (gfortranをフロントエンドにするのが楽です)
gfortran my_fortran_code.o my_c_lib.o -o simulation_app
`-march=native` を忘れずにつけてください。CPUの命令セットをフル活用して、行列演算の性能を限界まで引き出しましょう。
—
皆さんへのメッセージ
Fortranの文法は、最初は少し堅苦しく感じるかもしれません。しかし、`ISO_C_BINDING`を使いこなせば、Cの強力な資産を使いつつ、Fortranの堅牢かつ高速な数値計算能力を享受できる「ハイブリッドな開発環境」が手に入ります。
まずは小さな関数から、CのライブラリをFortranで叩いてみてください。その瞬間に、皆さんの計算コードは一段上のステージへ昇華するはずです。
何か分からないことがあれば、いつでも聞いてくださいね。皆さんの挑戦を、心から応援しています!

コメント