ソースコードを読み解く:OceanFFT.cpp偏

暇なんで、CUDAのサンプルソースコードでも読み解いて行こうと思います。Copyrightの関係とかあるので心配(ソースの注意書きを読んだけど、たぶん大丈夫。)です。

基本的に関数ごとにコメントしていく感じだけど、特に自分が分からない処だけかいつまんでやっていきます。所詮は個人の勉強用です。それでは、始めます。

main関数

 cutCheckCmdLineFlagという関数でコマンドラインから引数を読み込みテストモードで起動するかどうか選択している。ほとんどの場合runTest関数を呼び出して次の処理に移る。cutilExitdeで終了?


runTest関数

 前から疑問に思ってたんだけど、cutilSafeCallってなんなんだろう。

CUFFT_SAFE_CALL(cufftPlan2d(&fftPlan, meshW, meshH, CUFFT_C2R) );

FFT計算の準備をしていると思われる。[1]によると指定された信号サイズとデータ方で二次元FFTのプラン構成を作成する。と。まずFFTのプラン構成ってなんだ??一応、

meshW = 256;
meshH = 256;

という初期化はされている。このmeshWやらmeshHっていうのは、ちょうどウィンドウのサイズの半分の大きさになっている。

fftInputW = (meshW / 2)+1;
fftInputH = meshH;
fftInputSize = (fftInputW*fftInputH)*sizeof(float2);

ここでこのコードを抜き出してきたのは、このffpInputWとfftinputHっていうのが謎すぎるから。


次に、ここで出てくるフーリエ変換に関係ありそうな変数を取り上げてみる。

変数名 サイズ 説明
d_h0 float2 fftInputSize バイス側の変数。Base Heightfieldの振動数側。これを後でfftする。generate_h0()関数でなにやら中身を作る。
d_ht float2 fftInputSize バイス側の変数。
h_h0 float2 fftInputSize ホスト側の変数。
d_slope float2 meshW*meshH*sizeof(float2) バイス側の変数。


Buffer Objectの登録。ここに出てくる変数も取り上げてみる。

変数ID名 サイズ 説明
heightVertexBuffer meshW*meshH*sizeof(float) メッシュの高さが記録される。
slopeVertexBuffer meshW*meshH*sizeof(float2) メッシュの傾きが記録される。
posVertexBuffer meshW*meshH*4*sizeof(float) メッシュの各ポイントのX, Y座標
indexBuffer ((meshW*2)+2)*(meshH-1)*sizeof(GLuint) おそらく、レンダリングのために各頂点に番号をつけていると思われる。

runCuda関数の呼び出し。実際、Cudaの計算はここでしか呼び出していない。


OpenGLのコールバックを登録。


glutMainLoopに入る。

リファレンス

[1] CUDAテクニカルトレーニング http://www.nvidia.co.jp/docs/IO/59373/VolumeI.pdf