Я хочу использовать fftw3 в потоках. Но код, вставленный на http://codepad.org/lIjdGF5z, вызывает ошибку "двойное освобождение или повреждение". Как правильно вызывать подпрограммы fftw3 в потоках. Спасибо! Вы можете скомпилировать код с помощью команды "g++ test.cpp -lfftw3_threads -lfftw3 -lboost_thread"
вызов fftw в многопоточной программе
Ответы (1)
Я считаю, что вызов fftw_plan_dft_2d
не является реентерабельным, а это означает, что его нельзя вызывать одновременно в нескольких потоках, даже если вы создаете разные планы. Единственными потокобезопасными функциями fftw являются fftw_execute
варианты в соответствии с параграфом 2 Страница безопасности потоков документации.
Кроме того, как упомянул Пол Р. в комментариях, вы должны создавать планы только один раз в начале, а затем использовать их снова и снова. Это будет намного быстрее. Кроме того, согласно параграфу 3 страницы документации по безопасности потоков, вы можете использовать один и тот же план для нескольких одновременных вызовов fftw_execute
. Поэтому, если ваши преобразования имеют одинаковый размер, вам понадобится только один план для всех потоков.
fftw_plan_many_dft
. Это на случай, если у вас есть несколько 2D FFT для последовательного выполнения с одним вызовом fftw_execute
. Тот факт, что вы вызываете его с помощью howmany == 1
, означает, что вы все еще делаете только одно 2D-преобразование на fftw_execute
. Вы все еще можете просто использовать более простой интерфейс fftw_plan_dft_2d
.
- person Jason B; 15.01.2013
fftw_execute
? Поскольку план инкапсулирует свой ввод/вывод, не даст ли это вам либо неопределенные, либо в лучшем случае идентичные результаты?
- person Rhythmic Fistman; 05.01.2015
fftw_execute
, но вы также можете использовать функции выполнения New-array, упомянутые здесь: fftw.org/fftw3_doc/. В них, если данные отформатированы одинаково, вы можете передавать разные указатели ввода и вывода для каждого вызова выполнения.
- person Jason B; 05.01.2015