共享内存计算机上的多线程 FFTW 3.1.2
我使用 FFTW 3.1.2 和 Fortran 来执行实数到复数以及复数到实数的 FFT。它在一个线程上完美运行。
不幸的是,当我使用多线程 FFTW 时遇到一些问题 在 32 CPU 共享内存计算机上。我有两个计划, 一个用于 9 实数到复数 FFT,一个用于 9 复数到实数 FFT(大小 每个真实字段的大小:512*512)。我使用 Fortran 并编译(使用 ifort
)我的 链接到以下库的代码:
-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。
如果有人知道这里发生了什么......非常感谢!
I use FFTW 3.1.2 with Fortran to perform real to complex and complex to real FFTs. It works perfectly on one thread.
Unfortunately I have some problems when I use the multi-threaded FFTW
on a 32 CPU shared memory computer. I have two plans,
one for 9 real to complex FFT and one for 9 complex to real FFT (size
of each real field: 512*512). I use Fortran and I compile (using ifort
) my
code linking to the following libraries:
-lfftw3f_threads -lfftw3f -lm -lguide -lpthread -mp
The program seems to compile correctly and the function sfftw_init_threads
returns a non-zero integer value, usually 65527.
However, even though the program runs perfectly, it is slower with 2
or more threads than with one. A top
command shows weird CPU load
larger than 100% (and much more larger than n_threads*100). An htop
command shows that one processor (let's say number 1) is working at a
100% load on the program, while ALL the other processors, including
number 1, are working on this very same program, at a 0% load, 0% memory and 0 TIME.
If anybody has any idea of what's going on here... thanks a lot!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这看起来可能是同步问题。如果除一个线程之外的所有线程都被锁定(例如通过库调用的信号量),您可能会出现这种类型的行为。
你怎么称呼策划者?您的所有函数调用是否正确同步?您是在单个线程中还是在所有线程中创建计划?我假设您已经阅读了 FFTW 文档中关于线程安全的注释。 ..;)
This looks like it could be a synchronisation problem. You can get this type of behaviour if all threads except one are locked out e.g. by a semaphore to a library call.
How are you calling the planner? Are all your function calls correctly synchronised? Are you creating the plans in a single thread or on all threads? I assume you've read the notes on thread safety in the FFTW docs... ;)
除非您的 FFT 非常大,否则 FFTW 中的自动多线程不太可能在速度方面取得胜利。库内的同步开销可能会主导正在进行的计算。您应该分析不同的尺寸并查看盈亏平衡点在哪里。
Unless your FFTs are pretty large, the automatic multithreading in FFTW is unlikely to be a win speed wise. The synchronization overhead inside the library can dominate the computation being done. You should profile different sizes and see where the break even point is.