CUDA 5.0 をVisual C++ Express Edition 2010 で使う

円柱周りの流れの数値計算をするには計算量が多くなるので,CPUだととても遅くなります.
そこで,GPUを使って数値計算をすることにしました.GPGPUというやつです.
GPGPUによる数値計算には,CUDAと呼ばれるNVIDIAの提供している開発環境がとても便利です.
CUDAは,GPU向けのC言語の開発環境なので,基本的にC言語と同じようにソースコードが書けます.
C言語によるプログラミングしかできない自分にとってはぴったりの開発環境といえます.

前置きはこれくらいにして,CUDA 5.0をVisual C++ 2010で使う方法を以下にまとめます.
ネットでいろいろ探したところ,CUDA 4.0をVC++で使う方法などは多く見つけたのですが,CUDA 5.0に関する記事がほとんどなかったので大変苦労しました.

1.NVIDIAのページからCUDA5.0をダウンロードし,インストール
https://developer.nvidia.com/cuda-downloads


2.ルールファイルなどをコピー

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\extras\visual_studio_integration\rules

にある3つのファイル

NvCudaDriverApi.v5.0.rules
NvCudaLinker.v5.0.rules
NvCudaRuntimeApi.v5.0.rules

を,

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\VCProjectDefaults

にコピー.また,

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\extras\visual_studio_integration\MSBuildExtensions

にある4つのファイル

CUDA 5.0.props
CUDA 5.0.targets
CUDA 5.0.xml
Nvda.Build.CudaTasks.v5.0.dll

を,

C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations

にコピー.


3.Visual C++の設定
新しいプロジェクトとソースファイルを作成

プロジェクトを右クリックし,「ビルドのカスタマイズ」を選択

「CUDA 5.0(.targets,.props)」にチェックを入れる

プロジェクトを右クリックし,「プロパティ」を選択.構成プロパティ/リンカー/入力の「追加の依存ファイル」のところに,cudart.libとcuda.libを追加
(cuBlas,cuSparseなどのライブラリを使うときもここにcublas.lib,cusparse.libなどを追加)


ソースファイルを右クリックし,「プロパティ」を選択.構成プロパティ/全般の「項目の種類」を「CUDA C/C++」に変える

この手順は,新しいプロジェクトを作成する度に行う必要があります.


4.64bitアプリケーションをコンパイルできるようにする.
(Visual C++ 2010 で Windows SDK v7.1が使えるようになっていることが前提です.)

手順2で

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\extras\visual_studio_integration\MSBuildExtensions

に移動した

CUDA 5.0.props

テキストエディタで開き,PlatformToolsetについて記述されている部分を探して,

2010

を書き加える

これでCUDAが使えるようになるはずです.
あくまで僕個人の忘備録なので,あまり信用しないでください.

今回,VC++ 2010 でCUDA 5.0 を使うにあたって,以下のサイトを参考にしました.

Cuda 5.0 with Visual Studio 2010
http://planetanacreon.wordpress.com/2012/11/27/cuda-5-0-with-visual-studio-2010/

CUDA Visual Studio 2010 Express build error
http://stackoverflow.com/questions/13396878/cuda-visual-studio-2010-express-build-error

VC++プロジェクトを64bitプラットフォーム用に設定する

さあ円柱周りの流れの数値計算を始めようと思っていた矢先,新たな問題が生じました.
より広い範囲のシミュレーションを行おうとして配列の要素数を増やしたところ,メモリが不足してしまったのです.
32bitのプログラムでは限界がありました.

僕はプログラミング初心者なのでよく知らなかったのですが,32bitのプログラムはメモリの使用制限があるようです.
そこで,プログラムが64bitプラットフォームで動くようにVisual C++の設定を変えました.
(もともと64bitOSでプログラミングをしていました.)

まず,↓のサイトからWindows SDK for Windows 7 and .NET Framework 4をダウンロードしインストール
http://www.microsoft.com/en-us/download/confirmation.aspx?id=8279

そして↓のサイトを参考にVisual C++の設定を変更
http://msdn.microsoft.com/ja-jp/library/9yb4317s.aspx

ビルドしてエラーが出る場合,↓のサイトを参考にして設定を変更
http://togarasi.wordpress.com/2010/06/02/visual-studio-2010-c-%E3%81%A7-windows-sdk-v7-1-%E3%82%92%E4%BD%BF%E3%81%86%E3%81%AB%E3%81%AF%EF%BC%9F/

この設定はプロジェクトごとにやる必要があるようです.

結果,メモリ不足に陥ることなくプログラムが動くようになりました〜♪
めでたしめでたし

ちなみにVisual C++のバージョンは2010です.
あとから先生に聞いたのですが,Linuxgccは自動で64bitプラットフォームに対応したコンパイルをしてくれるそうです(知らなかった).

ParaViewとvtkフォーマット

微分方程式数値計算した結果を表示する場合には,ParaViewというフリーの描画ソフトが役に立ちます.
このソフトは決まったフォーマットで書かれたvtkファイルを読み込んで自動で描画をしてくれるという優れものです.

vtkファイルの書き方は以下の通り

# vtk DataFile Version 2.0
ASCII

DATASET UNSTRUCTURED_GRID
POINTS 節点数 float
x座標 y座標 データ

・節点数だけデータを書く

CELLS 要素数素数×(要素あたりの節点数+1)
要素を構成する節点数(三角形要素なら3) 節点番号 節点番号 節点番号

・要素数だけデータを書く

CELL_TYPES 要素数
要素0のデータタイプ(三角形要素なら5)

・要素数だけ5を書く

POINT_DATA 節点数
SCALARS データのラベル float 1
LOOKUP_TABLE default
節点0の値

・節点数だけデータを書く

詳しくはここで↓
http://www.tukizakura.org/~fujim2/cgi-bin/pukiwiki/pukiwiki.php?UnstructuredGrid%B7%C1%BC%B0%20Legacy

C言語のプログラムでは,これらの情報をfprintf関数を用いてコツコツ書いていきます.
節点数や要素数分のデータを書く場合には配列とfor文を駆使します.

今回は定常熱伝導方程式を四角い領域で一番上の辺の部分だけ1,あとは0というような境界条件で解くプログラムを作成しました.
このプログラムは,まずtxtファイルから節点,要素,境界条件などの領域に関する情報を読み込み,プログラム中で微分方程式を離散化・定式化して有限要素法により数値計算して最後にvtkファイルとして結果を吐き出すという流れです.

吐き出したvtkファイルをParaViewに読み込ませて描画した結果が以下の図です.

このように定常状態での熱伝導の様子がシミュレーションされています.


輪郭のみ表示するとこのように三角形要素に分割して計算されていることが分かります.