【问题标题】:threading issue with armadillo fft2犰狳 fft2 的线程问题
【发布时间】:2020-04-22 21:05:17
【问题描述】:

我正在使用 armadillo c++ 库进行 2D 傅立叶变换,我发现当我使用多个线程时结果不一致。具体来说,我从 fft2 函数中得到了不同的结果。

我传递给 fft2 的数据是线程本地的。我还验证了输入数据不受处理并行问题的其他线程的影响。如果有其他线程也调用 fft2,fft2 会产生不同的结果。有谁知道fft2的线程问题?或者,一般的犰狳?

【问题讨论】:

    标签: c++ multithreading fft armadillo


    【解决方案1】:

    犰狳本身似乎没有任何可能使其不是线程安全的状态(也许随机生成部分可能是一个问题)。也就是说,只要它所依赖的库是线程安全的,它似乎就是线程保存的。

    过去我在使用多线程时也遇到过结果不正确的问题。就我而言,罪魁祸首是我自己编译的 openblas。为了调查这个问题,我创建了一个small project 来检查并行和串行运行时某些 SVD 和矩阵乘法的结果是否相同。他们不是。然后我在 openblas 存储库中偶然发现了一个关于线程安全的问题,在那里我看到了一个可以在编译 openblas 时在 CMake (USE_LOCKING) 中设置的标志。在编译 openblas 时将 USE_LOCKING 设置为 true 后,我不再遇到犰狳给出的错误结果的问题。

    您可能会遇到类似的情况,但与 fft2 库有关。特别是因为您提到其他线程中的其他执行工作如果与 fft2 无关,则不会造成问题。因此,您应该检查 fft2 是否是线程安全的,而不是考虑犰狳。

    【讨论】:

    • 嗯,检查后我意识到我的犰狳正在拉入一个默认的 blas 库。当我切换到 openblas 时,性能有了显着提升(约 40 倍),但线程问题仍然存在。然后,我看到 openblas 有一个编译选项“pthread”。我在启用 pthread 的情况下重新编译了 openblas,但没有运气。你说你自己编译openblas的意思是你下载了源代码,然后手动编辑了CMake文件?这有点乱,但开始看起来可能是必要的。
    • 我提到 openblas 是为了表明线程问题不直接存在于犰狳中,而是存在于它的依赖项中。在我的调查过程中,如果我观察到如果我使用系统 openblas(Arch Linux)没有问题。在您的情况下,我很确定问题出在 FFT 库中,它可能不是线程安全的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多