-2

cudaライブラリ「cufft」を使用して、複雑なものから複雑なものへの1d FFTの簡単なコードを書いています。「cudaMalloc」を「malloc」に変更しました。これは、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;
}
4

1 に答える 1

2

ドキュメントでは、入力データと出力データは GPU 上にある必要があると説明cudaMalloc()されているため、代わりにを使用する必要がありmalloc()ます。

SO 本当の問題は、使用時に問題が発生した理由ですcudaMalloc()。おそらく最も簡単な説明は、GPU メモリを割り当ててから、CPU コードで直接書き込もうとしたことです。

for (i = 0; i < NX; i++){
  in[i].x = cos(2 * PI * FREQ * i / NX);
  in[i].y = 0;
};

代わりmalloc()に、CPU で同じサイズの領域を作成し、CPU でこの領域を初期化し、それを使用cudaMemcpy()して GPU にコピーする必要があります。同様に、結果をコピーして読み戻します。もちろん、さらに処理するためにデータを GPU に残しておくのが理想的です!

于 2015-05-15T15:59:39.453 に答える