我正在用cuda库“cufft”为复杂的1d FFT编写一个简单的代码。我用“malloc”改变了“cudaMalloc”,因为如果我使用cudaMalloc exe文件不能正常工作并崩溃!但这不是主要问题。 当我执行程序时,cufftExecC2C返回一个值!= CUFFT_SUCCESS因此FFT无法正常工作!!为什么? 这是我的代码
#include <stdio.h>
#include <cufft.h>
#include <cuda.h>
#include <math.h>
#define NX 64
#define BATCH 1
#define PI 3.14159265
#define FREQ 10
int main(){
//dichiarazione delle variabili
cufftHandle plan;
cufftComplex *out;
cufftComplex *in;
char premi_invio;
int i;
//assegnazione memoria agli array in e out
in=(cufftComplex*)malloc(sizeof(cufftComplex)*NX*BATCH);
/*
if (cudaGetLastError() != cudaSuccess){
printf("Cuda error: allocazione fallita\n");
return;
};
*/
out=(cufftComplex*)malloc(sizeof(cufftComplex)*NX*BATCH);
/*
if (cudaGetLastError() != cudaSuccess){
printf("Cuda error: allocazione fallita\n");
return;
};
*/
//creazione del piano per la trasformata e controllo della corretta creazione del piano
if (cufftPlan1d(&plan, NX, CUFFT_C2C, BATCH) == CUFFT_SUCCESS){
printf("piano creato correttamente!\npremi invio per continuare...\n");
scanf("%c", &premi_invio);
};
//assegnazione campioni all'array di input
for (i = 0; i < NX; i++){
in[i].x = cos(2 * PI * FREQ * i / NX);
in[i].y = 0;
};
printf("Vuoi visualizzare i campioni? (y/n)\n");
scanf("%c", &premi_invio);
if (premi_invio == 'y'){
for (i = 0; i < NX; i++){
printf("in[%d].x = %f \tin[%d].y = %f \n", i, in[i].x, i, in[i].y);
}
}
//esecuzione trasformata e controllo della corretta esecuzione
if (cufftExecC2C(plan,in,out,CUFFT_FORWARD) == CUFFT_SUCCESS){
printf("trasformata eseguita correttamente!\npremi invio per vedere i risultati...\n");
scanf("%c", &premi_invio);}
else {
printf("trasformata non eseguita\nPremi invio per tornare...\n");
scanf("%c", &premi_invio);
return;
}
//visualizzazione risultati (vettore out)
for (i = 0; i < NX; i++){
printf("out[%d].x = %f \tout[%d].y = %f\n", i, cuCrealf(out[i]),i, cuCimagf(out[i]) );
}
cufftDestroy(plan);
//cudaFree(in);
//cudaFree(out);
return 0;
}
答案 0 :(得分:2)
输入和输出数据必须位于GPU上的文档explains,因此您需要使用cudaMalloc()
代替malloc()
。
真正的问题是你在使用cudaMalloc()
时遇到问题的原因;可能最简单的解释是你分配GPU内存,然后尝试直接在CPU代码中写入:
for (i = 0; i < NX; i++){
in[i].x = cos(2 * PI * FREQ * i / NX);
in[i].y = 0;
};
相反,您应该在CPU上malloc()
相同大小的区域,在CPU上初始化此区域,然后使用cudaMemcpy()
将其复制到GPU。同样,将结果复制回来阅读它们。当然,理想情况下,您可以将数据留在GPU上进行进一步处理!