Могу ли я при планировании БПФ использовать тот же план для обратного БПФ?

#cuda #fft

#cuda #БПФ

Вопрос:

Я работаю с трехмерным массивом реальных чисел с плавающей точкой.

В одной части моего кода я должен взять 3DFFT этих значений, а затем расставить точки над результирующей сложной матрицей с другой матрицей с плавающими значениями. (точка = поточечное умножение)

Затем я использую обратное БПФ и обновляю исходный массив.

Что важно при выполнении первого cufftPlan3d() ? т.е. Чего на самом деле требует план?

Нужно ли в плане просто видеть размеры и тип массива для быстрой работы, или он также учитывает величины реальных и сложных частей?

Я пытаюсь использовать план как можно реже, чтобы быстрее вычислять преобразования, но я также хочу, чтобы БПФ (и IFFTS) выполнялись как можно быстрее, поскольку это узкое место кода.

Моя первая мысль заключается в том, что я бы составил план перед начальным БПФ, а затем составил другой план после результирующего скалярного произведения / БПФ для обратного БПФ, а затем использовал эти 2 плана везде позже в цикле.

Спасибо за любые предложения.

Ответ №1:

Вы определенно должны иметь возможность создавать только один план и повторно использовать его везде в цикле, при условии, что тип и размер преобразования не меняются. Похоже, что для вас это так. Фактически, вы можете использовать один и тот же план как для прямого (FFT), так и для обратного (iFFT) преобразований, если тип и размер одинаковы, поскольку CUFFT_FORWARD / CUFFT_REVERSE являются параметрами для cufftExec*() , а не для cufftPlan*() .

Если у вас есть несколько размеров и типов для поддержки, создайте отдельный план для каждой комбинации тип / размер при запуске (если вы знаете их заранее).

Комментарии:

1. может быть, вы можете добавить пример, чтобы немного объяснить. Потому что многие люди будут использовать преобразования R2C и C2R для прямого и обратного преобразования, которые не могут быть обработаны одним типом. Это возможно только в том случае, если оба входа и выхода являются сложными (преобразования C2C и Z2Z).