我做了一个快速程序,以确保我可以正确使用cufft库。当我运行批量大小“1”时,我得到了我期望的结果。但是,随着我增加批量大小,我得到了数据缓冲区末尾的随机字节。如果批量大小为2,则最后三个条目为噪声。如果批量大小为3,则在缓冲区末尾的最后六个条目中以及在批次中三个转换中的第二个的结果应该是结尾处的三个条目中得到噪声。 / p>
批量中第二次转换结果的错误数据示例:
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);
}
}
答案 0 :(得分:2)
您正在混淆使用BATCH和NX来索引数据集。
我认为你的最终fprintf行应该是这个而不是你拥有的:
fprintf(output, "%f\t%f\n", hostData[i + j*NX].x, hostData[i + j*NX].y);
同样,您需要从
更改数据设置行 hostData[i + j*BATCH]...
到
hostData[i + j*NX]...
(2个实例。)
虽然我们正在使用它,但这行不能为我编译,它缺少一个紧密的括号:
hostData = (cufftComplex*)malloc(NX * BATCH * sizeof(cufftComplex);