我使用FFTW 3.1.2与Fortran一起执行实数到复数和复数到实数的FFT。它在一个线程上完美运行。
不幸的是,当我使用多线程FFTW时,我遇到了一些问题
在32 CPU共享内存计算机上。我有两个计划,
一个用于9个实数到复数FFT,一个用于9个复数到实数FFT(大小
每个真实场:512 * 512)。我使用Fortran并编译(使用ifort
)my
代码链接到以下库:
-lfftw3f_threads -lfftw3f -lm -lguide -lpthread -mp
程序似乎正确编译,函数sfftw_init_threads
返回非零整数值,通常为65527。
然而,即使程序运行完美,它也会慢2
或者多于一个的线程。 top
命令显示奇怪的CPU负载
大于100%(并且比n_threads * 100大得多)。一个htop
命令显示一个处理器(假设编号为1)正在工作
100%加载程序,而所有其他处理器,包括
数字1,正在处理这个相同的程序,0%负载,0%内存和0 TIME。
如果有人知道这里发生了什么......非常感谢!
答案 0 :(得分:2)
这看起来可能是同步问题。如果除了一个以外的所有线程都被锁定,则可以获得此类行为。通过信号量到图书馆电话。
你怎么称呼计划者?您的所有函数调用是否都正确同步?您是在单个线程中还是在所有线程上创建计划?我假设您已经阅读了FFTW文档中的thread safety注释...;)
答案 1 :(得分:1)
除非你的FFT非常大,否则FFTW中的自动多线程不太可能是一个快速的胜利。库内的同步开销可以支配正在进行的计算。您应该分析不同的大小,并查看收支平衡点的位置。