正确初始化和正常关闭FFTW3

时间:2018-05-01 02:03:15

标签: fftw

我在我的软件中的几个地方使用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 :(得分:1)

多次调用 fftw_init_threads 是安全的,FFTW3会跟踪其初始化状态(threads_inited中的全局变量threads/api.c),如果是前一个,则不会重复初始化一个是有效的。

您可以多次调用 fftw_cleanup_threads ,如果没有任何初始化,它知道不重复该过程。

在您的应用程序中需要避免的是从模块调用 fftw_cleanup_threads ,而其他人可能仍在使用FFTW。

您可以使用全局计数器来跟踪使用FFTW的模块数量,并在最后一个模块完成时调用fftw_cleanup_threads()。