我正在使用armadillo c++库进行2D傅立叶变换,我发现当我使用多个线程时,结果是不一致的。具体地说,我从fft2函数得到了不同的结果。
我传递给fft2的数据是线程本地的。我还验证了输入数据不会受到处理并行问题的其他线程的影响。如果有其他线程也调用fft2,则fft2会产生不同的结果。有人知道fft2的线程问题吗?或者,一般情况下,是一只知更鸟吗?
发布于 2020-04-24 01:45:24
Armadillo本身似乎没有任何可能使其不是线程安全的状态(也许随机生成部分可能是一个问题)。也就是说,只要它所依赖的库是线程安全的,它就看起来是线程保存的。
我过去在使用多线程时也遇到过错误结果的问题。在我的例子中,罪魁祸首是openblas,这是我自己编译的。为了调查这个问题,我创建了一个small project来检查在并行和串行运行时,一些奇异值分解和矩阵乘法的结果是否相同。他们不是。然后,我在openblas存储库中遇到了一个关于线程安全性的问题,在编译openblas时,我看到了一个可以在CMake (USE_LOCKING)中设置的标志。在编译openblas时将USE_LOCKING设置为true之后,我再也没有遇到armadillo给出的错误结果的问题了。
您可能正在经历类似的事情,但是关于fft2库。特别是因为您提到了在其他线程中执行其他工作不会造成问题,如果它们与fft2无关。因此,您应该检查fft2是否是线程安全的,而不是去考虑armadillo。
https://stackoverflow.com/questions/61375099
复制相似问题