CUDAによるFFT部分をライブラリでの置き換え
C言語でブレの画像処理プログラムを参考文献をもとに作成しました。 (CPUで行う)
そのFFT部分をcufftライブラリを用いて処理を行おうと思っています。 (FFT部分を置き換えてGPUで行う)
unsigned char imageIN[画素数][画素数]
↓ これに画像のデータを入れてfloat型に変換
for(i=0; i<幅; i++){
for(j=0; j<幅; j++){
data[i][j] = (float)imageIN[i][j];
jdata[i][j] = 0.0;
}
}
という感じに画像のデータを入れ、cufftライブラリがc言語のみで作ったものとFFT部を比較しました。
するとCUFFTライブラリがうまく実行されていないようでした。
本題
どのようにしたらcufftライブラリを実行できるのでしょうか、(抽象的ですが一応聞きたいことは下にまとめました。)
(下のプログラムは他をある程度省略して、質問したい部分です。(逆方向FFTはコメントアウト))
int main(int argc, char **argv){
int i,k,d;
int n=512; //画像の1辺のサイズ
float *v=NULL;
cufftComplex *dv;
cufftHandle plan;
cudaMalloc((void **)&dv, n*n*sizeof(float2)); //デバイス・メモリの確保
cudaMallocHost((void **)&v, n*n*sizeof(float2)); //ホスト・メモリの確保
for(i=0; i<n*n*2; i++) v[i] = (float)(i % (n-1)); //データの初期化
load_image_data(); //原画像の読み込み
make_original_data(); //元のデータを作成する
// ここで v に画像のデータを入れる?
cudaMemcpy(dv,v,n*n*sizeof(double2), cudaMemcpyHostToDevice); //ホストからデバイスへ転送
cufftPlan2d(&plan,n,n,CUFFT_R2C); //n×nの2次元FFTの準備
cufftExecC2C(plan,dv,dv,CUFFT_FORWARD); //順方向への変換
cudaMemcpy(data, dv, n*n*sizeof(double2), cudaMemcpyDeviceToHost);
//デバイスからホストへ転送
//cufftDestroy(plan); //資源を解放
//(blurはCPUで行いたい)
blur(); //周波数領域でのぼけフィルタリング
/*
cudaMemcpy(dv,v,n*n*sizeof(double2), cudaMemcpyHostToDevice);//ホストからデバイスへ転送
cufftPlan2d(&plan,n,n,CUFFT_C2R); //n×nの2次元FFTの準備
cufftExecC2C(plan, dv, dv, CUFFT_INVERSE); //逆方向への変換
cufftDestroy(plan); //資源を解放
cudaMemcpy(v, dv, n*n*sizeof(double2), cudaMemcpyDeviceToHost);
//デバイスからホストへ転送
*/
cudaFree(v);
save_image_data(); //出力画像を保存する
return 0;
}
- このような処理を行うときは2次元FFTでよいのでしょうか。
- cufftComplex は構造体として考えてもよいのでしょうか。
- また、画像データの代入の仕方はどのように行えばよいでしょうか。
- 他に悪いところがあれば教えていただきたいです。
一応色々試してみたのですが、知識が及ばず迷走して悩んでいます。
よろしくお願いします。
誤解を生みそうな表現がありましたので一部( )で追加しました。