Ich benutze CUFFT für 2D FFT auf 128 Bildern. Jedes Bild hat die Größe 128 x 128. Auf MATLAB dauert die Durchführung einer 2D-FFT 0,3 ms, und die Durchführung einer FFT auf allen 128 Bildern dauert etwa 128 mal so viele Male. Verwendung CUFFT, die Ausführung des folgenden Coderechen FFT für ein BildStrategie - CUFFT computing 2D FFT auf vielen Bildern
cudaMalloc((void**)idata, sizeof(cufftDoubleReal) * 128 * 128);
cudaMalloc((void**)odata, sizeof(cufftDoubleComplex) * 128 * 128);
cudaMemcpy(*idata, in_real, 128 * 128 * sizeof(cufftDoubleReal),
cudaMemcpyHostToDevice);
cudaMemcpy(*idata, in_complex, 128 * 128 * sizeof(cufftDoubleComples),
cudaMemcpyHostToDevice);
cufftExecD2Z(plan, idata, odata);
cudaMemcpy(out_complex, *odata, 128 * 128 * sizeof(cufftDoubleComplex), cudaMemcpyDeviceToHost);
, die 0,4 ms auf meiner Maschine nimmt herum.
Ich habe versucht, den gleichen Code für mehr als ein Bild auszuführen, und die Ausführungszeit ist im Grunde die Anzahl der Bilder mehrere von 0,4ms. Die Art und Weise habe ich das im Grunde ist das Kopieren und die oben genannten Code viele Male einfügen, natürlich, mit den Variablen für die entsprechenden Bilder geändert, die
// For image1
cudaMalloc((void**)idata, sizeof(cufftDoubleReal) * 128 * 128);
cudaMalloc((void**)odata, sizeof(cufftDoubleComplex) * 128 * 128);
cudaMemcpy(*idata, in_real, 128 * 128 * sizeof(cufftDoubleReal),
cudaMemcpyHostToDevice);
cudaMemcpy(*idata, in_complex, 128 * 128 * sizeof(cufftDoubleComples),
cudaMemcpyHostToDevice);
cufftExecD2Z(plan, idata, odata);
cudaMemcpy(out_complex, *odata, 128 * 128 * sizeof(cufftDoubleComplex), cudaMemcpyDeviceToHost);
// For image 2
cudaMalloc((void**)idata2, sizeof(cufftDoubleReal) * 128 * 128);
cudaMalloc((void**)odata2, sizeof(cufftDoubleComplex) * 128 * 128);
cudaMemcpy(*idata2, in_real2, 128 * 128 * sizeof(cufftDoubleReal),
cudaMemcpyHostToDevice);
cudaMemcpy(*idata2, in_complex2, 128 * 128 * sizeof(cufftDoubleComples),
cudaMemcpyHostToDevice);
cufftExecD2Z(plan, idata2, odata2);
cudaMemcpy(out_complex, *odata2, 128 * 128 * sizeof(cufftDoubleComplex), cudaMemcpyDeviceToHost);
...
// For image N
...
So bedeutet das kann ich erwarten, wenn ich 2D-FFT für alle 128 gelte Bilder, würde die Ausführungszeit ziemlich in der gleichen Reihenfolge wie die MATLAB sein.
Also meine Frage: ist die Art, wie ich die Ausführung richtig anwenden? Nutze ich die parallele Rechenleistung der GPU voll aus? Sollte ich die Art und Weise, wie ich den Code ausführe, ändern, zum Beispiel zuerst cudaMemcpy für alle 128 Bilder und führe sie dann aus, um einige CPU- und GPU-Ausführungen zu überlappen?