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);
  }
}

0 ответов

Другие вопросы по тегам