多线程FFTW 3.1.2在共享内存计算机上

时间:2009-09-16 20:31:43

标签: multithreading parallel-processing fortran shared-memory fftw

我使用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。

如果有人知道这里发生了什么......非常感谢!

2 个答案:

答案 0 :(得分:2)

这看起来可能是同步问题。如果除了一个以外的所有线程都被锁定,则可以获得此类行为。通过信号量到图书馆电话。

你怎么称呼计划者?您的所有函数调用是否都正确同步?您是在单个线程中还是在所有线程上创建计划?我假设您已经阅读了FFTW文档中的thread safety注释...;)

答案 1 :(得分:1)

除非你的FFT非常大,否则FFTW中的自动多线程不太可能是一个快速的胜利。库内的同步开销可以支配正在进行的计算。您应该分析不同的大小,并查看收支平衡点的位置。

相关问题