参数扫描:添加 CPU 后处理时间的改善明显呈指数衰减?

问题描述 投票:0回答:1

我最近对我编写的 Python 脚本进行了简单的参数扫描,其中包括 mltiprocessing。我连续评估了 4、8、12 和 16 个 CPU 上的 N 个文件(每次迭代添加 20 个文件),并评估了该进程运行所需的时间。我在我的工作专用的节点上运行这个(即没有其他进程竞争资源)

结果:

enter image description here

如您所见,处理时间随着 CPU 的增加而提高。然而,我确实注意到改进的变化似乎遵循指数衰减趋势。我快速浏览了一下每块板的处理时间,指数衰减趋势更加明显:

enter image description here

代码的相关部分在这里:

list_of_sub_dfs = [group.reset_index(drop=True) for _, group in df.groupby('Unique_identifier')]

with multiprocessing.Pool(processes=int(args.processors)) as pool:
    partial_process_wrapper = partial(process_well, smoothing_factor=smoothing_fact,normalize=normalize_data)
    results = pool.map(partial_process_wrapper, list_of_sub_dfs)
    for original_curve_rows, sub_curve_rows, Tm_rows in results:
        all_original_curve_rows.extend(original_curve_rows)
        all_subcurves.extend(sub_curve_rows)
        all_tm_rows.extend(Tm_rows)

简而言之:输入数据被分成大小相等的块(由数据中的唯一标识符分割)并输入到 process_well 函数中,该函数会生成多个列表。

谁能解释一下为什么会出现这种趋势?我可以做些什么来使性能差异与所使用的 CPU 数量更加呈线性关系吗?

预先感谢您提供的任何帮助:)

python-3.x performance multiprocessing
1个回答
0
投票

Q2 :
“我能做些什么来使性能差异与所使用的 CPU 数量更加呈线性关系吗?”

是的, 设计代码(流程),以便在端到端流程中拥有最小的、最好的零、串行部分,并且不增加任何附加的开销成本。然后,只有到那时,你的处理才会遵循阿姆达尔定律(只有工作的原子性才是性能提升的主要玻璃天花板),因为所有其他资源都不会阻塞你的处理流程(它们在真实的硬件中是这样做的—— mem-I/O 通道的数量是第一个此类性能阻碍因素,尽管在某种程度上可以通过 NUMA 缓存层次结构进行屏蔽,但稀缺资源阻碍任何进一步性能提升的原则在此很清楚)。

Q1 :
“谁能解释一下为什么会出现这种趋势?”

加速扩展是由 Gene AMDAHL 博士在上个世纪大型机计算早期首次解释的。他最初的表述被称为“收益递减定律”,原则上说,无论向流程中添加多少资源,即使添加无限多个此类资源,每个新添加的资源的加速提升也会较小并且更少,因为最终添加了零新加速(因为满足了收益递减上限的影响,其中处理时间仍然至少与处理流程的串行部分的时间有关,向并行添加更多资源部分不会将静止的串行部分缩短一个飞秒......

简单 - 精确的公式在这里,并且可以使用交互式工具来模拟/动画参数的效果,正如经常引用的这里

© www.soinside.com 2019 - 2024. All rights reserved.