【问题标题】:Newbie Thread Question (FFTW)新手主题问题 (FFTW)
【发布时间】:2010-11-08 13:06:07
【问题描述】:

我正在使用 FFTW(一个 FFT 库)的线程版本来尝试加速双 CPU 机器上的某些代码。 这是只有 1 个线程的时间输出:

131.838u 1.979s 2:13.91 99.9%

这里有 2 个线程:

166.261u 30.392s 1:52.67 174.5%

用户时间和 CPU 负载百分比似乎表明它的线程非常有效,但挂钟时间(这是我真正关心的)告诉我(我认为)它需要大约 28 秒的额外时间来处理与线程。这是描述情况的准确方式吗?如果是这样,这是相当正常的,还是我可能配置不正确? 谢谢你的光。

【问题讨论】:

    标签: c multithreading time fftw


    【解决方案1】:

    我已经大量使用了 FFTW,并且发现,除非您要使用两个以上的处理器,否则只使用单线程版本几乎总是一种更简洁的解决方案。它更快,因为线程间通信更少,或者至少这是我的经验。

    需要检查的几件事:

    1. 您是否正确配置并使用了您的智慧?智慧一旦被创造出来,就会让你的变换运行得更快。如果您不使用它,那么您应该使用它。
    2. 您是从一个线程还是从两个线程调用库?这一直是我的问题,将多个线程调用锁定到库中变得很痛苦。
    3. 您的变换有多大?您是先尝试一个小型的,只是想看看效果如何,然后再扩大规模?

    【讨论】:

    • 感谢您的帮助 1) 我没有使用智慧 - 只是 FFTW_MEASURE 2) 我没有手动创建任何线程,如果这就是您的意思吗? 3) 我尝试了几种尺寸——现在我正在做 100 次大约 130k 的 4D 变换,但我也尝试过更小的尺寸。这是我的函数调用,如果您有兴趣:[code] int jl[4] = {32,50,16,16}; p = fftw_plan_many_dft(4, jl, 100, A, NULL, 1, 32*50*16*16, B, NULL, 1, 32*50*16*16, +1, FFTW_MEASURE); [/code] 我希望它会很自然地线程化——每个 CPU 处理交替变换。再次感谢
    • FFTW_Measure 是所有智慧设置中耗时最长的,可以轻松解决您的问题。尝试 FFTW_ESTIMATE,因为 measure 正在执行大量排列和测试以查看哪个最快。使用多个处理器时,该排列数会大大增加,但如果您节省智慧,后续转换应该会受益于多个处理器。
    • ESTIMATE 给出 224.651u 2.169s 1:54.75 197.6% 但是,我在 MEASURE 代码中添加了一些 printfs,并且看起来规划阶段花费的时间不超过一秒钟。我想也许线程开销太高了?再次感谢。
    • 这段代码非常复杂,所以除非你要包装你的电话,否则你的 printfs 可能漏掉了一些东西。线程开销确实相当高,这就是我不使用它的原因。此外,您的线程尺寸非常小,这就是 Estimate 回报没有太大差异的原因。在这一点上,我将看到线程和非线程性能如何随着更大的尺寸扩展,然后在您接近目标尺寸时尝试智慧节省。
    • 尺寸对我来说似乎不是那么小* - 毕竟 32 x 50 x 16 x 16 = 409600(不知道为什么我之前有 130k)。我靠在头顶。无论如何,我希望有一天有机会在 16 CPU 双核机器上试用它,所以也许线程在这种情况下会更有成效。再次感谢你的帮助。 *如果 FFTW 总是以经典的“行列”方式计算 N-D FFTS,我想这很小,但我不知道是不是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2010-12-08
    • 2011-08-13
    • 2010-12-20
    • 2010-11-05
    • 1970-01-01
    相关资源
    最近更新 更多