Fortranの人がCUDAの恩恵を受けるには

3つの方法があります。

  1. 真面目に(?)CUDA Cで書く
  2. CUDA化されたライブラリをFortranから呼ぶ
  3. PGI Fortranコンパイラを使う
    1. コンパイラ指示行挿入によるプログラミング(PGIアクセラレータ)
    2. 明示的にCUDA APIを使った、いわゆるCUDA Fortran

どれもこれも実に一長一短です。一応、どれも試してみましたの感想を書きます。

その1:真面目に(?)CUDA Cで書く

当たり前ですが、C言語の知識が必須です。これが壁になる人もいると思いますが、一念発起してC言語を習得する価値はあると思います。
ボトルネックとなる部分のみをCUDA C化し、Fortranから呼び出せばいいのですから(ただ、ホスト-デバイス間のメモリ転送速度が問題になるかもしれませんが)、Fortranで書いた既存の資産(ライブラリとか)をすべてCまたはCUDA Cで書き直す必要はありません。

短所:習得に時間かかる。C言語の知識がない人は特に大変。
長所:自由度が高いので、最も性能を出せる。コンパイラが無料。

その2:CUDA化されたライブラリをFortranから呼ぶ

CUBLASやCULAといった、有名ライブラリのBLASLAPACKをCUDA化したものが既にあります。ラッパを使えばFortranからも使用することが出来ます。

短所:用意されているライブラリしか使えない、性能が出ない場合にチューニングする自由度が低い
長所:(つぼにはまれば)もっともお手軽に性能を出せる

その3:PGI Fortranコンパイラを使う

既存のFortranのコードに指示行を入れてPGIのFortranコンパイラコンパイルするだけでFortranをCUDA化出来るという魔法のような手段(PGIアクセラレータ)らしいですが、正直まだぐだぐだで実用には耐えないものだと思います。

短所:まだ開発レベル。実用には耐えない。コンパイラが有料。
長所:CUDAを勉強するよりも簡単で、CUDAライブラリを使用するよりは自由度が高い

CUDA Fortranについては、まだ未確認です。CUDA Cに近い使い方が出来て、性能を出せるならかなり良いと思います。

以下加筆:CUDA Fortranについて

2010-11-07現在、性能面についてはCUDA Cと大差ないです。ただCUDA Cに比べるとコンパイラがまだ開発段階のようで、謎のエラーが時々出ます。PGIのサイトに出ているのですが、毎月のようにコンパイラのbug fixが行われていて、それを読むと「こんな基本的な部分でコンパイルエラーが出るのかよ…」とびっくりします。ですが、PGIアクセラレータにくらべれば十分実用に耐えますし、チューニングすれば性能が出るというのはCUDA Cと同じです。
勿論、CUDA Cと同様にCUDAの知識が必要です。世の中を見渡すと、CUDA Fortranのドキュメントとか教科書はほとんどありません。大半がCUDA Cを対象にしています。CUDA Fortranを勉強するにはC言語を読めるようにはなる必要があります。。まあ、それでも、C言語が読めるようになるのと書けるようになるのは手間がずいぶん違うことを考えると、Fortranしか知らなかった人にとってはずいぶんCUDAが手元に来たと思います。

短所:習得に時間かかる。C言語読めることが必須。コンパイラが有料。
長所:自由度が高いので、最も性能を出せる。