【问题标题】:Increased occupancy without speedup in FFT在 FFT 中没有加速的情况下增加了占用率
【发布时间】:2015-12-25 00:01:21
【问题描述】:

问题

我必须计算许多傅立叶变换。我想与我的许多内核并行执行这些操作。请注意,我不想要并行 FFT 算法,我只想启动许多令人尴尬的并行 FFT。

我发现,当我的 CPU 使用率上升时,我的完成时间并没有减少。

示例

我们创建一些随机数据

In [1]: import numpy as np

In [2]: x = np.random.random(10000000)  # some random data

以及计算一次 FFT 和计算一次 FFT 所需的时间。

In [3]: %time _ = np.fft.rfft(x)        # cost of one run
CPU times: user 589 ms, sys: 23.9 ms, total: 612 ms
Wall time: 613 ms

In [4]: %time _ = np.fft.rfft(x)        # there is some speedup from mulitple runs
CPU times: user 365 ms, sys: 12.4 ms, total: 378 ms
Wall time: 381 ms

我们按顺序对一系列数据运行此操作

In [5]: %time _ = map(np.fft.rfft, [x] * 12)  # many runs sequentially
CPU times: user 4.4 s, sys: 135 ms, total: 4.54 s
Wall time: 4.54 s

In [6]: 4.54 / 12                       # Same cost per FFT
Out[6]: 0.37833333333333335

我们做同样的事情,但现在使用四个线程的线程池。

In [7]: from multiprocessing.pool import ThreadPool

In [8]: pool = ThreadPool(4)            # I have four physical cores

In [9]: %time _ = pool.map(np.fft.rfft, [x] * 12)
CPU times: user 15.5 s, sys: 1.3 s, total: 16.8 s
Wall time: 4.79 s

我们发现没有加速。但是,我们确实发现 CPU 使用率(以top 衡量)接近 400%。这不是 GIL 的问题。 FFT 有些东西不能很好地并行化。也许我们正在破坏更高级别的缓存?

硬件: Intel(R) Core(TM) i5-3320M CPU @ 2.60GHz

问题

一般来说这里发生了什么,有没有办法利用多个内核来并行加速多个 FFT?

【问题讨论】:

  • 你的硬件是什么?
  • @MaxHutchinson,似乎与硬件无关。也可以在这里查看。
  • @cel 但我确实看到我的工作站硬件加速了。 FFT 是全内存系统,所以在动力不足的机器上,我可以想象一个线程能够使内存容量饱和。
  • @MaxHutchinson 一个旧的个人笔记本。不是一个好的工作站。添加了有问题的详细信息。

标签: python multithreading numpy scipy fft


【解决方案1】:

在我的工作站上,ThreadPool确实提供了加速(虽然不是完美的):

In [42]: x = np.random.random(2**23)

In [43]: %time _ = list(map(np.fft.rfft, [x]*12))
CPU times: user 3.32 s, sys: 380 ms, total: 3.7 s
Wall time: 3.7 s

In [44]: tpool = ThreadPool(4)

In [45]: %time _ = list(tpool.map(np.fft.rfft, [x]*12))
CPU times: user 5.4 s, sys: 596 ms, total: 6 s
Wall time: 1.62 s

In [46]: 3.7/4
Out[46]: 0.925

我正在使用 Python3,所以也许那里有什么东西?否则,它可能是硬件。 FFT 受内存限制,因此单个线程很可能会使您的内存系统饱和。您可以通过下拉到让您控制亲和力的环境来获得更好的内存系统局部性。

硬件

Intel(R) Core(TM) i7-4930K CPU @ 3.40GHz。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-11-10
  • 2021-01-24
  • 2021-02-23
  • 2020-03-17
  • 2018-07-22
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
相关资源
最近更新 更多