Проблемы при запуске CUFFT в многопоточном приложении

Помогите, пожалуйста, скажите свое мнение.
Создаю многопоточное приложение (QThread) в Visual C++ 2008. Приложение выполняет прямое FFT двух массивов, комплексное умножение результата, затем обратное FFT. Для обычного FFT работает отлично, для CUDAFFT - выбивает при числе потоков > 1. Причина - неудачное выполнение FFT. Метод run объекта QThread:

  1. for(i=0;i<icount;i++)
  2. {
  3.   RandomInit(frameA,ilength * ilength);
  4.   RandomInit(frameB,ilength * ilength);
  5.   res=cudaMemcpyAsync(d_Data1,   frameA,  ilength * ilength * sizeof(float), cudaMemcpyHostToDevice, stream) ;
  6.   cudaEventRecord(stop_event, stream);
  7.   cudaEventSynchronize(stop_event);
  8.   if(res!=cudaSuccess)  { printf("%s\n",cudaGetErrorString(res)); return;       }
  9.   res= cudaMemcpyAsync(d_Data2,   frameB,  ilength * ilength * sizeof(float), cudaMemcpyHostToDevice, stream) ;
  10.   cudaEventRecord(stop_event, stream);
  11.   cudaEventSynchronize(stop_event);
  12.   if(res!=cudaSuccess) {        printf("%s\n",cudaGetErrorString(res)); return; }
  13.  
  14.   CutilSafeCall( cufftExecR2C(fftPlanFwd1, (cufftReal *)d_Data1, (cufftComplex *)d_DataSpectrum1));
  15.   fftres= cufftExecR2C(fftPlanFwd2, (cufftReal *)d_Data2, (cufftComplex *)d_DataSpectrum2) ;
  16.   cudaEventRecord(stop_event, stream);
  17.   cudaEventSynchronize(stop_event);
  18.   if(fftres!=CUFFT_SUCCESS) { printf("%d",fftres); return; }
  19.  
  20.   cutilSafeCall(multiplication_stream(d_DataSpectrum1, d_DataSpectrum2, ilength, ilength,stream));
  21.   cudaEventRecord(stop_event, stream);
  22.   cudaEventSynchronize(stop_event);
  23.  
  24.   fftres = cufftExecC2R(fftPlanInv, (cufftComplex *)d_DataSpectrum1, (cufftReal *)d_Data1) ;
  25.   cudaEventRecord(stop_event, stream);
  26.   cudaEventSynchronize(stop_event);
  27.   if(fftres!=CUFFT_SUCCESS){ printf("%d",fftres); return;}
  28.  
  29.   res = cudaMemcpyAsync(frameA, d_Data1, ilength * ilength * sizeof(float), cudaMemcpyDeviceToHost, stream) ;
  30.   cudaEventRecord(stop_event, stream);
  31.   cudaEventSynchronize(stop_event);
  32.   if(res!=cudaSuccess){ printf("%s\n",cudaGetErrorString(res)); return; }
  33. }

Forums: 

Проясните, пожалуйста...

1. Какую версию CUDA вы используете?
2. Вы переключали девайсы? Т.е. для каждого потока должен быть свой выделеный GPU, но не оба потока должны работать с одним GPU?
3. Какое железо?

1. V 4.0 2. Девайсы не

1. V 4.0
2. Девайсы не переключал. Видел пример по работе с двумя видеокартами, попробую...
3. Geforce 310M/512Мб. ОС Windows7, Core i3-330M, 2.17GHz...

Использование потоков в CUDA

Модернизировал программу с использованием CUTThread. Программа работает, но опять же, только при наличии одного потока на CPU. Как только со стороны CPU два потока вызывают CuFFT, возникает ошибка. Т.е. многопоточные приложения не могут параллельно использовать видеокарту для расчетов :-( !???

смотрите что в документации

смотрите что в документации пишут на CUDA 4.1

"Starting with CUFFT version 4.1, CUFFT library is thread safe"

Значит, в предыдущих версиях - не thread safe. Обновляйтесь до 4.1