Итак, я использую cuFFT в сочетании с функцией потока CUDA. У меня проблема в том, что я не могу заставить ядра cuFFT работать с полным параллелизмом. Ниже приведены результаты, полученные из nvvp. В каждом потоке работает ядро 2D пакетного БПФ на 128 изображений размером 128х128. Я настраиваю 3 потока для запуска 3 независимых плана партии FFT.Параллельность потоков cuFFT
Как видно из рисунка, некоторые копии памяти (желтые столбцы) были одновременно с некоторыми вычислениями ядра (фиолетовыми, коричневыми и розовыми барами). Но пробелы в ядрах не были параллельными. Как вы заметили, каждое ядро строго следовали друг за другом. Ниже приведен код, который я использовал для копирования памяти на устройство и запуск ядра.
for (unsigned int j = 0; j < NUM_IMAGES; j++) {
gpuErrchk(cudaMemcpyAsync(dev_pointers_in[j],
image_vector[j],
NX*NY*NZ*sizeof(SimPixelType),
cudaMemcpyHostToDevice,
streams_fft[j]));
gpuErrchk(cudaMemcpyAsync(dev_pointers_out[j],
out,
NX*NY*NZ*sizeof(cufftDoubleComplex),
cudaMemcpyHostToDevice,
streams_fft[j]));
cufftExecD2Z(planr2c[j],
(SimPixelType*)dev_pointers_in[j],
(cufftDoubleComplex*)dev_pointers_out[j]);
}
Затем я изменил код так, что я закончил все копии памяти (синхронизировать) и отправить все ядра на потоки сразу, и я получил следующий результат профилирования:
Тогда я подтвердил, что ядра не работают одновременно.
Я посмотрел на один link, который объясняет в деталях, как настроить, чтобы использовать полный параллелизм либо проходящий «-default-потоком каждого потока» аргумент командной строки или #define CUDA_API_PER_THREAD_DEFAULT_STREAM, прежде чем #include или в вашем коде. Это функция, введенная в CUDA 7. Я проверил образец кода в приведенной выше ссылке на моем MacBook Pro Retina 15 'с GeForce GT750M (тот же самый компьютер, что и в приведенной выше ссылке), и я смог получить параллельные прогоны ядра. Но я не смог запустить ядра cuFFT параллельно.
Тогда я нашел это link с кем-то, говорящим, что ядро cuFFT будет занимать весь графический процессор, поэтому нет двух ядер cuFFT, работающих параллельно. Тогда я застрял. Поскольку я не нашел никакой официальной документации, касающейся того, позволяет ли CUFFT использовать параллельные ядра. Это правда? Есть ли способ обойти это?