Корректная инициализация и корректное отключение FFTW3 - PullRequest
0 голосов
/ 01 мая 2018

Я использую FFTW3 в нескольких местах моего программного обеспечения. Однако эти разные места / функции / модули не знают друг о друге, и порядок их вызова (включая их собственную инициализацию и очистку) предсказать невозможно. Это приводит к путанице, когда дело доходит до инициализации и постепенного отключения FFTW3.

  • FFTW3 имеет функцию с именем fftw_init_threads(), которая должна вызываться только один раз перед использованием любой функции FFTW3. Поскольку я не знаю, какой из модулей приложения (который использует FFTW3) инициализируется первым, как я могу убедиться, что я вызываю эту функцию только один раз во всем приложении?
  • FFTW3 имеет функцию с именем fftw_cleanup_threads(), которая должна вызываться один раз в самом конце приложения для очистки содержимого. Любые вызовы функций FFTW3 после этого вызова не будут выполнены. Опять же, поскольку я не знаю, какая подсистема моего приложения отключается последней, как я могу убедиться, что я вызываю эту функцию один раз в самом конце?

Одним из быстрых решений было бы слепо вызывать две вышеупомянутые функции только в начале и конце моей функции main() соответственно. Однако это плохой дизайн и не приемлемо. Само приложение не должно ничего знать о FFTW3. Только модули, использующие FFTW3, должны знать о FFTW3. Мое текущее решение состоит в том, чтобы иметь дополнительный модуль, который действует как обертка вокруг двух функций и отслеживает, был ли FFTW3 инициализирован или завершен. Если модуль запрашивает инициализацию FFTW3, а FFTW3 не инициализируется, то он вызовет fftw_init_threads(). В противном случае он просто увеличит внутренний счетчик и вернется. Нечто подобное реализовано для функции fftw_cleanup_threads(). Это решение работает, если и только если модули приложения используют оболочку для инициализации и завершения FFTW3.

Так что мне интересно, как вы, ребята, решаете эту проблему? Есть ли способ запросить саму библиотеку FFTW3 и проверить, инициализирована она или нет? Я не смог найти что-то в документации.

Спасибо

1 Ответ

0 голосов
/ 01 мая 2018

Можно безопасно вызывать fftw_init_threads несколько раз, FFTW3 отслеживает свой статус инициализации (глобальная переменная threads_inited в threads/api.c) и не будет повторять инициализацию, если предыдущая действительна.

Вы можете вызывать fftw_cleanup_threads несколько раз, он знает, что не нужно повторять процесс, если ничего не инициализировано.

Чего вам следует избегать в вашем приложении, так это вызывать fftw_cleanup_threads из модуля, в то время как другие все еще могут использовать FFTW.

Вы можете сделать это с помощью глобального счетчика, чтобы отслеживать, сколько модулей используют FFTW, и вызывать fftw_cleanup_threads () только после завершения последнего.

...