вызов fftw в многопоточной программе

Я хочу использовать fftw3 в потоках. Но код, вставленный на http://codepad.org/lIjdGF5z, вызывает ошибку "двойное освобождение или повреждение". Как правильно вызывать подпрограммы fftw3 в потоках. Спасибо! Вы можете скомпилировать код с помощью команды "g++ test.cpp -lfftw3_threads -lfftw3 -lboost_thread"


person user41635    schedule 14.01.2013    source источник
comment
Вы не должны создавать и уничтожать план каждый раз, когда делаете БПФ. Просто сделайте это один раз.   -  person Paul R    schedule 14.01.2013


Ответы (1)


Я считаю, что вызов fftw_plan_dft_2d не является реентерабельным, а это означает, что его нельзя вызывать одновременно в нескольких потоках, даже если вы создаете разные планы. Единственными потокобезопасными функциями fftw являются fftw_execute варианты в соответствии с параграфом 2 Страница безопасности потоков документации.

Кроме того, как упомянул Пол Р. в комментариях, вы должны создавать планы только один раз в начале, а затем использовать их снова и снова. Это будет намного быстрее. Кроме того, согласно параграфу 3 страницы документации по безопасности потоков, вы можете использовать один и тот же план для нескольких одновременных вызовов fftw_execute. Поэтому, если ваши преобразования имеют одинаковый размер, вам понадобится только один план для всех потоков.

person Jason B    schedule 14.01.2013
comment
как насчет программы, вставленной на codepad.org/nHSAN1lJ . Поток содержит только реентерабельную процедуру fftw. - person user41635; 15.01.2013
comment
Это работает? Если нет, я не думаю, что вам нужно использовать здесь интерфейс fftw_plan_many_dft. Это на случай, если у вас есть несколько 2D FFT для последовательного выполнения с одним вызовом fftw_execute. Тот факт, что вы вызываете его с помощью howmany == 1, означает, что вы все еще делаете только одно 2D-преобразование на fftw_execute. Вы все еще можете просто использовать более простой интерфейс fftw_plan_dft_2d. - person Jason B; 15.01.2013
comment
Как можно использовать один и тот же план при нескольких одновременных вызовах fftw_execute? Поскольку план инкапсулирует свой ввод/вывод, не даст ли это вам либо неопределенные, либо в лучшем случае идентичные результаты? - person Rhythmic Fistman; 05.01.2015
comment
Это верно для стандартного вызова fftw_execute, но вы также можете использовать функции выполнения New-array, упомянутые здесь: fftw.org/fftw3_doc/. В них, если данные отформатированы одинаково, вы можете передавать разные указатели ввода и вывода для каждого вызова выполнения. - person Jason B; 05.01.2015