cuFFTを使用してバッチを実験しています。しかし、私は正しい出力を得ているとは思わない。
int NX = 16; // size of the array
int BATCH = 16; // # of batch
GPU に 2 つの配列を割り当てています。
float *src;
cufftComplex *dst;
cudaMalloc((void**)&src, sizeof(float)*NX*BATCH);
cudaMalloc((void**)&dst, sizeof(cufftComplex)*NX*BATCH);
次のような単純なカーネルでソース配列を初期化しています。
__global__ void initFloatArray(float *data, const int size) {
const int i = (blockIdx.x * blockDim.x) + threadIdx.x;
if (i < size) {
data[i] = i % NX;
}
}
基本的に、各配列には 0 から 15 までの値があります。これを 16 回取得します。
私は次のように計画を作成します。
cufftPlanMany(&plan, 1, &NX, nullptr, 1, NX, nullptr, 1, NX, CUFFT_R2C, BATCH);
そして、私は自分の計画を実行しています:
cufftExecR2C(plan, src, dst);
最後に、dstの内容をホストに転送します。しかし、値を出力すると、次のようになります。
BATCH 0:
<120, 0>.length = 120
<-8, 40.2187>.length = 41.0066
<-8, 19.3137>.length = 20.905
<-8, 11.9728>.length = 14.3996
<-8, 8>.length = 11.3137
<-8, 5.34543>.length = 9.62152
<-8, 3.31371>.length = 8.65914
<-8, 1.5913>.length = 8.15673
<-8, 0>.length = 8
<120, 0>.length = 120
<-8, 40.2187>.length = 41.0066
<-8, 19.3137>.length = 20.905
<-8, 11.9728>.length = 14.3996
<-8, 8>.length = 11.3137
<-8, 5.34543>.length = 9.62152
<-8, 3.31371>.length = 8.65914
BATCH 1:
<-8, 1.5913>.length = 8.15673
<-8, 0>.length = 8
<120, 0>.length = 120
<-8, 40.2187>.length = 41.0066
<-8, 19.3137>.length = 20.905
<-8, 11.9728>.length = 14.3996
...
反復的な出力を期待していましたが、16 個ごとではなく、9 個の数値ごとに繰り返されます。
私は何か間違ったことをしていますか?それとも、私が理解していない何かがあります。