Cuftt медленнее, чем FFT
Я "преобразовал" программу, которая использует fftw для cufft, хотя, используя GPU, производительность ниже, чем на CPU. Nvidia Visual Profiler предупреждает меня, что операции memcpy очень медленные, низкий параллелизм ядра и копии не полностью используют доступную полосу пропускания. Я думаю, потому что мои вызовы memcpy внутри цикла, это снижает производительность. Любая идея о том, как улучшить производительность или действительно ли возможно улучшить производительность? Это тот случай, когда не стоит использовать GPU?
#define BATCH 10
cufftHandle plan_forward;
if (cufftPlan1d(&plan_forward, L, CUFFT_D2Z, BATCH) != CUFFT_SUCCESS){
fprintf(stderr, "CUFFT error: Plan creation failed");
return;
}
cufftDoubleComplex *dummy;
cudaMalloc((void**)&dummy, sizeof(cufftDoubleComplex)*(L)*BATCH);
cufftDoubleComplex *dummy2 = (cufftDoubleComplex*)malloc(L*BATCH * sizeof(cufftDoubleComplex));
cufftDoubleReal * dreal;
cudaMalloc((void**)&dreal, sizeof(cufftDoubleReal)*(L)*BATCH);
double *dummy_cpu;
cudaMallocHost(&dummy_cpu, sizeof(double)*L);
for (i=0;i<=L/2;i++) (*G)[i] = 0.0;
Variance_Gf = 0.0;
skipped_segments = 0;
for (j=0;j<K;j++) {
for (k=0,i=0;i<L;i++) {
if (isnan(y[j*L/2+i])) {
dummy_cpu[i] = 0.0;
k++;
} else {
dummy_cpu[i] = y[j*L/2+i]* (*windowfunction)(i-L/2,L/2,fraction);
}
}
cudaMemcpy(dreal,dummy_cpu,sizeof(double)*(L), cudaMemcpyHostToDevice);
if (cudaGetLastError() != cudaSuccess){
fprintf(stderr, "Cuda error: Failed to allocate\n");
}
if (cufftExecD2Z(plan_forward, dreal, dummy) != CUFFT_SUCCESS){
fprintf(stderr, "CUFFT error: ExecD2Z Forward failed");
}
if (cudaDeviceSynchronize() != cudaSuccess){
fprintf(stderr , "Cuda error : Failed to synchronize\n");
return ;
}
cudaMemcpy(dummy2,dummy,sizeof(cufftDoubleComplex)*(L), cudaMemcpyDeviceToHost);
for (i=0;i<(L/2+1);i++) {
(*G)[i] += 2.0*scale*(dummy2[i].x*dummy2[i].x + dummy2[i].y*dummy2[i].y);
}
}