2

我使用带有 Fortran 的FFTW 3.1.2 来执行实数到复数和复数到实数的 FFT。它在一个线程上完美运行。

不幸的是,当我在 32 CPU 共享内存计算机上使用多线程 FFTW 时遇到了一些问题。我有两个计划,一个用于 9 个实数到复数 FFT,一个用于 9 个复数到实数 FFT(每个实数场的大小:512*512)。我使用 Fortran 并编译(使用ifort)链接到以下库的代码:

-lfftw3f_threads -lfftw3f -lm -lguide -lpthread -mp

程序似乎编译正确,函数sfftw_init_threads返回一个非零整数值,通常为 65527。

然而,即使程序运行完美,使用 2 个或更多线程也比使用 1 个要慢。一条top命令显示奇怪的 CPU 负载大于 100%(并且比 n_threads*100 大得多)。一条htop 命令显示一个处理器(假设 1 号处理器)正在以 100% 的程序负载运行,而所有其他处理器(包括 1 号处理器)都在以 0% 负载、0% 内存运行同一程序和 0 时间。

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

4

2 回答 2

2

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

你怎么称呼策划师?您的所有函数调用是否正确同步?您是在单个线程还是在所有线程中创建计划?我假设您已经阅读了FFTW 文档中有关线程安全的说明... ;)

于 2009-09-16T21:23:16.740 回答
1

除非您的 FFT 非常大,否则 FFTW 中的自动多线程不太可能是明智的。库内的同步开销可以支配正在完成的计算。您应该分析不同的尺寸并查看盈亏平衡点在哪里。

于 2010-09-16T07:18:36.577 回答