#cuda #fft
#cuda #БПФ
Вопрос:
Я работаю с трехмерным массивом реальных чисел с плавающей точкой.
В одной части моего кода я должен взять 3DFFT этих значений, а затем расставить точки над результирующей сложной матрицей с другой матрицей с плавающими значениями. (точка = поточечное умножение)
Затем я использую обратное БПФ и обновляю исходный массив.
Что важно при выполнении первого cufftPlan3d()
? т.е. Чего на самом деле требует план?
Нужно ли в плане просто видеть размеры и тип массива для быстрой работы, или он также учитывает величины реальных и сложных частей?
Я пытаюсь использовать план как можно реже, чтобы быстрее вычислять преобразования, но я также хочу, чтобы БПФ (и IFFTS) выполнялись как можно быстрее, поскольку это узкое место кода.
Моя первая мысль заключается в том, что я бы составил план перед начальным БПФ, а затем составил другой план после результирующего скалярного произведения / БПФ для обратного БПФ, а затем использовал эти 2 плана везде позже в цикле.
Спасибо за любые предложения.
Ответ №1:
Вы определенно должны иметь возможность создавать только один план и повторно использовать его везде в цикле, при условии, что тип и размер преобразования не меняются. Похоже, что для вас это так. Фактически, вы можете использовать один и тот же план как для прямого (FFT), так и для обратного (iFFT) преобразований, если тип и размер одинаковы, поскольку CUFFT_FORWARD
/ CUFFT_REVERSE
являются параметрами для cufftExec*()
, а не для cufftPlan*()
.
Если у вас есть несколько размеров и типов для поддержки, создайте отдельный план для каждой комбинации тип / размер при запуске (если вы знаете их заранее).
Комментарии:
1. может быть, вы можете добавить пример, чтобы немного объяснить. Потому что многие люди будут использовать преобразования R2C и C2R для прямого и обратного преобразования, которые не могут быть обработаны одним типом. Это возможно только в том случае, если оба входа и выхода являются сложными (преобразования C2C и Z2Z).