cuFFT und Streams
Ich versuche, mehrere CUDA-FFT-Kernel mithilfe von Streams asynchron zu starten. Dafür erstelle ich meine Streams, cuFFT Forward und Inverse Pläne wie folgt:
streams = (cudaStream_t*) malloc(sizeof(cudaStream_t)*streamNum);
plansF = (cufftHandle *) malloc(sizeof(cufftHandle)*streamNum);
plansI = (cufftHandle *) malloc(sizeof(cufftHandle)*streamNum);
for(int i=0; i<streamNum; i++)
{
cudaStreamCreate(&streams[i]);
CHECK_ERROR(5)
cufftPlan1d(&plansF[i], ticks, CUFFT_R2C,1);
CHECK_ERROR(5)
cufftPlan1d(&plansI[i], ticks, CUFFT_C2R,1);
CHECK_ERROR(5)
cufftSetStream(plansF[i],streams[i]);
CHECK_ERROR(5)
cufftSetStream(plansI[i],streams[i]);
CHECK_ERROR(5)
}
In demmain
Funktion starte ich Forward-FFTs wie folgt:
for(w=1;w<q;w++)
{
cufftExecR2C(plansF[w], gpuMem1+k,gpuMem2+j);
CHECK_ERROR(8)
k += rect_small_real;
j += rect_small_complex;
}
Ich habe auch andere Kernel, die ich asynchron mit denselben Streams starte.
Wenn ich meine Anwendung mit Visual Profiler 5.0 profiliere, werden alle Kernel mit Ausnahme der CUDA-FFT (vorwärts und rückwärts) parallel ausgeführt und überlappen sich. FFT-Kernel werden in verschiedenen Streams ausgeführt, überlappen sich jedoch nicht, da sie tatsächlich nacheinander ausgeführt werden. Kann mir jemand sagen, was mein Problem ist?
Meine Umgebung ist VS 2008, 64 Bit, Windows 7.
Vielen Dank.