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

发布于 2024-08-04 12:14:53 字数 776 浏览 16 评论 0原文

我使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

睫毛上残留的泪 2024-08-11 12:14:53

这看起来可能是同步问题。如果除一个线程之外的所有线程都被锁定(例如通过库调用的信号量),您可能会出现这种类型的行为。

你怎么称呼策划者?您的所有函数调用是否正确同步?您是在单个线程中还是在所有线程中创建计划?我假设您已经阅读了 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... ;)

你的呼吸 2024-08-11 12:14:53

除非您的 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文