의의 FFT를 일괄/우리는 약간의 m 벡터 각각의 수행 일부 N의 FFT이있는 경우 우리가 cuFFT의 배치 모드를 사용할 수 있음을 읽어 보시기 바랍니다. 그래서 그것을 테스트하기 위해 샘플 프로그램을 만들고 실행했습니다. 내가 사용한 데이터는 1024
부동 소수점 숫자가 같은 1024
숫자가 10
번 반복 된 파일이었습니다. 1024
포인트 FFT에 대해 동일한 결과를 얻어야하지만, 나는 그것을 얻지 못하고있다. 개념적으로 어딘가에 문제가 있다면 저를 바로 잡으십시오. 그리고 제가 만든 오류를 바로 잡을 수 있다면 코드가 아래에 있습니다.1D 실제 배열
참고 : 1D FFT로만 작업하고 있습니다. 여기
는 코드입니다 : 로버트 Crovella에서 언급 한 바와 같이#include <cuda.h>
#include <cufft.h>
#include <stdio.h>
#include <math.h>
#define NX 1024
#define DATASIZE 1024
#define BATCH 10
int main (int argc, char* argv[])
{
cufftHandle plan;
cufftComplex *deviceOutputData, *hostOutputData;
cufftReal *hostInputData, *deviceInputData;
int i,j;
FILE *in; // *out, *fp;
cudaMalloc ((void**)&deviceInputData, NX*BATCH*sizeof(cufftReal));
hostInputData = (cufftReal*) malloc (NX*BATCH*sizeof(cufftReal));
cudaMalloc ((void**)&deviceOutputData, NX*BATCH*sizeof(cufftComplex));
hostOutputData = (cufftComplex*) malloc (NX*BATCH*sizeof(cufftComplex));
in = fopen ("InFile.txt", "r");
if (in==NULL)
{ fprintf (stderr, "Input file has some issues. Please check."); exit(1);}
float data;
//Allocate data
for (i=0; i<BATCH; i++){
for (j=0; j<DATASIZE;j++)
{
fscanf(in, "%f", &data);
hostInputData [j + i*DATASIZE] = data;
}
}
fclose (in);
cudaMemcpy (deviceInputData, hostInputData, DATASIZE*BATCH*sizeof(cufftReal), cudaMemcpyHostToDevice);
cufftPlan1d (&plan, NX, CUFFT_R2C, BATCH);
cufftExecR2C (plan, deviceInputData, deviceOutputData);
cudaThreadSynchronize();
cudaMemcpy (hostOutputData, deviceOutputData, DATASIZE*BATCH*sizeof(cufftComplex), cudaMemcpyDeviceToHost);
cufftDestroy (plan);
cudaFree (deviceOutputData);
cudaFree (deviceInputData);
#define a hostOutputData[j+i*NX].x
#define b hostOutputData[j+i*NX].y
float result[NX];
for (i=0; i<BATCH; i++){
printf ("\n*New Batch*\n");
for (j=0; j<=NX/2;j++){
result[j] = sqrt ((a*a)+(b*b));
printf ("%f\n", result[j]);
}
for (j=1; j<NX/2; j++){
result[j+(NX/2)] = result [(NX/2)-j];
printf ("%f\n", result[j+(NX/2)]);
}
}
안녕하세요 @RobertCrovella 선생님, 코드의 일부를 삽입했습니다. 그 부분이 해석하기에 충분하다고 생각했기 때문입니다. 어쨌든, 나는 코드 스 니펫을 수정했다. Jack의 코드로 나를 추천 해 주셔서 감사합니다 :) –
cudaPlanMany()의 hlep로 배치 모드를 실행할 수 있습니다. 고마워요 @ 로버트 크로 베라. –