ソースコードを読み解く: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