fortran66のブログ

fortran について書きます。

Fortran で CUDA

Fortran で CUDA を試みるチラシ裏メモ帳です。NVIDIA の CUDA ZONE にいつの間にか Fortran の項目が出来ていたのでいじってみました。Vista 64bit なので苦難の道です涙目です。
http://www.nvidia.co.jp/object/cuda_programming_tools_jp.html

■溝浚い

Dr.Dobbs Journal の『大衆のためのスーパーコンピューティング』の記事が、ドブ博士の論説『質量のためのスーパーコンピューティング』と訳されているのを見ると(Mass は Mass に違いないが)この道を進んでいいのか一抹の不安というか市松模様の不安を覚えます。
http://www.nvidia.co.jp/object/cuda_education_jp.html

■メモ

CUDA 対応 Fortran コンパイラは PGI がやっています。現在 64bit版の Linux 用のテストが希望者の間で行われているようです。
http://www.pgroup.com/resources/accel.htm
今後を注目したいですが、今回はパス。

■本題

□ドライバ等のインストール

CUDA ZONE
http://www.nvidia.co.jp/object/cuda_get_jp.html

  1. CUDA 2.1
    1. CUDAドライバ: Microsoft Windows Vista 64ビット用CUDAサポートNVIDIAドライバ(181.20)。
    2. CUDAツールキット: Windows Vista 64ビット用CUDAツールキット バージョン2.1
    3. CUDA SDK: Windows Vista 64ビット用CUDA SDK バージョン2.1

ツールキットのインストーラが途中で止まりましたが、インストールは済んでいるようなので「ままよ!」と進むことにします。

□check

CUDA_2_Quickstart_Guide.PDF
http://www.nvidia.co.jp/object/cuda_develop_jp.html

  1. インストールが成功していれば、bandwidthtest.exe を任意のディレクトリから実行できるはずです。


CPU / GPU 間は約 4.5 Gbytes/s、GPU 内部では約 36Gbytes/s のメモリー転送スピードということでしょうか?

□VS2005との統合
  • カスタムビルド

ここで落とせるカスタムビルド用規則を使うほうがシンプルでよい気がします。NVIDIA の Forum の ID が必要になります。
http://forums.nvidia.com/index.php?showtopic=30273&st=0
http://forums.nvidia.com/index.php?act=attach&type=post&id=3945
落としてきた Zip を解凍後、VS2005 で空のプロジェクトファイルを作成後、右クリック、カスタムビルド規則、既存ファイル検索 で VS2005 のディレクトリが開くので、解凍したフォルダーを突っ込んでコピー、そのディレクトリに下りて cudarules を選択してやれば、以後 CUDA の選択肢がカスタムビルドのメニューに現れるようになります。

-Wizard
http://sourceforge.net/projects/cudavswizard
これをインストールすると、C++用のプロジェクトに CUDA 用の選択肢が追加されます。
しかし、この wizard で生成された CUDA プログラムを実行すると VS2005 が終了時に落ちるようになりました。「ままよ!」と見過ごすことにします。

  • シンタックス・カラーリング

NVIDIAが用意してくれているものを用います。手順は、C:\Program Files (x86)\NVIDIA Corporation\NVIDIA CUDA SDK\doc\syntax_highlighting\visual_studio_8\README.txt にあるままに。

Want pretty syntax highlighting when editing your .cu files in Visual Studio?
Heres how:

    • -

Visual Studio .Net 2005 / Visual Studio 8:
1. If you don't have a usertype.dat file in your "Microsoft Visual Studio 8\Common7\IDE" folder, then copy the included usertype.dat file there. If you do, append the contents of the included usertype.dat onto the end of the "Microsoft Visual Studio 8\Common7\IDE\usertype.dat"

2. Start Visual Studio 8. Select the menu "Tools->Options...". Open "Text Editor" in the tree view on the left, and click on "File Extension". Type cu in the "Extension" box, and click "Add". Click "OK" on the dialog box.

3. Restart Visual Studio and your CUDA code should now have syntax highlighting.

□ディレクトリパスの設定

ツール->オプション から


C:\CUDA\lib
C:\Program Files (x86)\NVIDIA Corporation\NVIDIA CUDA SDK\common\lib


C:\CUDA\include\

C:\CUDA\lib
C:\Program Files (x86)\NVIDIA Corporation\NVIDIA CUDA SDK\common\lib

□プロジェクトにおける構成マネージャの設定

死ぬほどイライラする構成マネージャの設定に注意。64bit 設定の場合はすべて x64 に。x64 にしたつもりが win32 のままだったり、許しがたい行動を取って呉れます。Windows の検索の犬やオフィスのヘルプのイルカ並みに殺意を覚えます。

□実例

  • CUDA ZONE プログラミングツール http://www.nvidia.co.jp/object/cuda_programming_tools_jp.html から『CUDAカーネルに対するFORTRANインターフェイス (Fortran_Cuda.tgz)』を落としてきます。使うのは中にある main.f90 と Cuda_function.cu のふたつです。
  • Fortran のコンソールプロジェクトをつくり、main.f90 を登録します。追加のライブラリとして cudart.lib を加えます。ここではプロジェクト名を FortranCuda としました。

  • CUDA スタティック・ライブラリのプロジェクトをつくります。ここでは、デフォールト名のCUDAWinApp1 にしています。ヘッダーファイルなどは消して、sample.cu を Cuda_function.cu で置き換えます。ソリューション・エクスプローラを見ると、なぜかソースファイルがソースファイルの項目の外に作られてしまいますが、そのままでもよし、移動させてもよし、適宜対応します。
  • Fortran プロジェクトを右クリックして依存関係の設定を選びます。CUDA プロジェクトを選択します。

  • 本来ならばこれで設定終了ですが、ソースファイルが g77用の設定になっているようなので、多少 Fortran ソースを手直しする必要があります。インターフェースを用意することで解決します。
INTERFACE 
 SUBROUTINE cudafunction(c, c2, i) BIND(C, name='cudafunction_')
 USE, INTRINSIC :: ISO_C_BINDING
 IMPORT
 COMPLEX(C_FLOAT_COMPLEX) :: c(N), c2(N)
! complex(C_FLOAT_COMPLEX) :: c(:), c2(:) ! no good
 INTEGER :: i
 END SUBROUTINE cudafunction
END INTERFACE

ここで、サブルーチンの配列引数のサイズは明示的に与えなければならないようです。

  • Compile & Go

あとは、通常のごとくビルドして実行できるはずです。

(必須事項はすべて書いたつもりですが、試行錯誤の上ここまで来たので、何か抜けているかもしれません。)