cufft ライブラリを正しく使用できるようにするための簡単なプログラムを作成しました。「1」のバッチサイズを実行すると、期待どおりの結果が得られます。ただし、バッチ サイズを大きくすると、データ バッファーの末尾にランダムなバイトのように見えるものが表示されます。バッチ サイズが 2 の場合、最後の 3 つのエントリはノイズです。バッチ サイズが 3 の場合、バッファの最後の 6 つのエントリと、バッチ内の 3 つの変換の 2 番目の結果であるはずの最後の 3 つのエントリにノイズが発生します。
バッチ内の 2 番目の変換の結果の最後にある不良データの例:
7.680291 1.411589
← 良いデータ
7.748493 1.062853
7.797380 0.710554
7.826757 0.355854
-436781318144.000000 -436781318144.000000
← 悪い結果の始まり ←
5349828096.000000 5000401408.000000
5511789568.000000 4813803008.000000
5664713728.000000 4619900416.000000
出力の終わり
コード:
#define NX 1024
#define BATCH 4
#include <cuda.h>
#include <cufft.h>
#include <stdio.h>
#include <Windows.h>
#include <math.h>
int main()
{
cufftHandle plan;
cufftComplex *deviceData;
cufftComplex *hostData;
FILE* output;
char fileName[256];
int i, j;
cudaMalloc((void**)&deviceData, NX * BATCH * sizeof(cufftComplex));
hostData = (cufftComplex*)malloc(NX * BATCH * sizeof(cufftComplex);
//Initalize array with a real sin wave, increasing the frequency of the wave for each transform in the batch (indexed by "j")
for (j = 0; j < BATCH; j++)
{
for (i = 0; i < NX; i++)
{
hostData[i + j*BATCH].x = sin(i*(j+1) / (float)10);
hostData[i + j*BATCH].y = 0;
}
}
cudaMemcpy(deviceData, hostData, NX * BATCH * sizeof(cufftComplex), cudaMemcpyHostToDevice);
cufftPlan1d(&plan, NX, CUFFT_C2C, BATCH);
cufftExecC2C(plan, deviceData, deviceData, CUFFT_FORWARD);
cudaThreadSynchronize();
cudaMemcpy(hostData, deviceData, NX * BATCH * sizeof(cufftComplex), cudaMemcpyDeviceToHost);
cufftDestroy(plan);
cudaFree(deviceData);
output = fopen("outputFile.txt", "w");
//Write one file for each transform in the batch
for (j = 0; j < BATCH; j++)
{
memset(fileName, '\0', 256);
sprintf(fileName, "outputFile_%d.txt", j);
output = fopen(fileName, "w");
for (i = 0; i < NX; i++)
fprintf(output, "%f\t%f\n", hostData[i + j*BATCH].x, hostData[i + j*BATCH].y);
fclose(output);
}
}