scikits-cuda.cufft を使用して、任意のサイズの入力の変換を計算できる Python でラップされた GPU fft 関数を作成したいと考えています。(2の累乗しかとらないPyFFTを試しました)
CUDA コードから skcuda.cufft コードをモデル化しました。
__host__ cuDoubleComplex* FFT(cuDoubleComplex *data, int NX){
cudaEvent_t start, stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start, 0);
cuDoubleComplex *d_data;
cudaMalloc((void **)&d_data,NX*sizeof(cuDoubleComplex));
cufftHandle plan;
cufftPlan1d(&plan,NX,CUFFT_Z2Z,1);
cudaMemcpy(d_data, data, NX*sizeof(cuDoubleComplex), cudaMemcpyHostToDevice);
cufftExecZ2Z(plan,d_data,d_data,CUFFT_FORWARD);
cudaMemcpy(data,d_data,NX*sizeof(cuDoubleComplex),cudaMemcpyDeviceToHost);
cufftDestroy(plan);
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
float elapsedTime;
cudaEventElapsedTime(&elapsedTime, start, stop);
printf("\n Elapsed Time: %3.1f ms\n", elapsedTime);
cudaFree(d_data);
return data;
}
私の skcuda.cufft コードは次のようになります。
import skcuda.cufft as ft
import pycuda.autoinit
import pycuda.gpuarray as gpuarray
import numpy as np
N=100
x=np.array(np.random.random(N),np.float32)
x_gpu=gpuarray.to_gpu(x)
xf_gpu = gpuarray.empty(N,np.complex64)
plan=ft.cufftPlan1d(N,ft.CUFFT_Z2Z,1)
ft.cufftExecZ2Z(plan,x_gpu,xf_gpu,ft.CUFFT_FORWARD)
ft.cufftDestroy(plan)
xf=x_gpu.get()
しかし、エラーが発生します:
runfile('/home/jesli/sk-cufft_test.py', wdir='/home/jesli') トレースバック (最新の呼び出しが最後):
ファイル ""、1 行目、runfile('/home/jesli/sk-cufft_test.py', wdir='/home/jesli') 内
ファイル "/home/jesli/anaconda/lib/python2.7/site-packages/spyderlib/widgets/externalshell/sitecustomize.py"、580 行目、実行ファイル execfile(ファイル名、名前空間) 内
ファイル「/home/jesli/sk-cufft_test.py」、19 行目、ft.cufftExecZ2Z(plan,x_gpu,xf_gpu,ft.CUFFT_FORWARD) 内
ファイル「/home/jesli/anaconda/lib/python2.7/site-packages/skcuda/cufft.py」、319行目、cufftExecZ2Z方向)
ArgumentError: 引数 2: : 間違った型
変換方向 ( CUFFT_FORWARD、CUFFT_INVERSE ) は、ソース コードで既に定義されています。
http://scikit-cuda.readthedocs.org/en/latest/_modules/skcuda/cufft.html
コードの何が問題だったのか、または関数が期待する引数を知りたいです。