Python joblib 在 n_jobs 大于 8 后几乎没有性能增益

查看 39|回复 6
作者:Leon6868   
电脑 CPU 为 AMD Ryzen 7 6800H ,8 核 16 进程
系统为 Windows 11
任务为对一组数据做分段 FFT ,因为每段 FFT 相互无关,所以将整段数据分为 n_jobs 块后每块并行计算,试图加速(具体代码不能公开,正在整理一份能复现的代码)。但是发现了奇怪的情况,保持其他参数不变,使用 parallel = Parallel(n_jobs=int(n_jobs)) ,当 n_jobs 大于 4 后,总体用时不会下降。

深入进程测试后发现每个进程内部的 for 循环内的代码拖慢了速度,代码如下(正常来说怎么测试每行代码的性能呢……望大佬指路!):
tCost = []
for i in batchTask:
    tCost.append([time.time()])
    startTime = sampleDot[0] + i * step
    endTime = startTime + step
    splitSampleDot = sampleDot[
        np.where((sampleDot >= startTime) & (sampleDot
请问为什么会出现这种情况呢?有哪些办法能进一步提升性能呢?
BingoXuan   
因为你只有 8 核
Leon6868
OP
  
@BingoXuan #1 请问为什么用上 8 核后相比 1 线程也只有 50% 的性能提升呢?
vicalloy   
看一下每个核的 CPU 占用率,如果负载满了就是到性能瓶颈了。
BingoXuan   
t2 才是你真正计算部分吧,其他都是处理数据。感觉就是处理数据拖后腿了。
Donaldo   
@Leon6868 #2 上下文切换,缓存同步,核间通信也有开销的,实际上很难(甚至可以说不可能)做到 N 个核的效率是 1 个核的 N 倍。
Leon6868
OP
  
@BingoXuan #4 是的, `n_jobs` 小于 8 时 `t2` 几乎没影响,但是为什么这些数据处理代码会随着 `n_jobs` 增大而线性变慢呢,不同进程之间理论上应该不会相互影响?
您需要登录后才可以回帖 登录 | 立即注册

返回顶部