我最近对我编写的 Python 脚本进行了简单的参数扫描,其中包括 mltiprocessing。我连续评估了 4、8、12 和 16 个 CPU 上的 N 个文件(每次迭代添加 20 个文件),并评估了该进程运行所需的时间。我在我的工作专用的节点上运行这个(即没有其他进程竞争资源)
结果:
如您所见,处理时间随着 CPU 的增加而提高。然而,我确实注意到改进的变化似乎遵循指数衰减趋势。我快速浏览了一下每块板的处理时间,指数衰减趋势更加明显:
代码的相关部分在这里:
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 数量更加呈线性关系吗?
预先感谢您提供的任何帮助:)
Q2 :
“我能做些什么来使性能差异与所使用的 CPU 数量更加呈线性关系吗?”
是的, 设计代码(流程),以便在端到端流程中拥有最小的、最好的零、串行部分,并且不增加任何附加的开销成本。然后,只有到那时,你的处理才会遵循阿姆达尔定律(只有工作的原子性才是性能提升的主要玻璃天花板),因为所有其他资源都不会阻塞你的处理流程(它们在真实的硬件中是这样做的—— mem-I/O 通道的数量是第一个此类性能阻碍因素,尽管在某种程度上可以通过 NUMA 缓存层次结构进行屏蔽,但稀缺资源阻碍任何进一步性能提升的原则在此很清楚)。
Q1 :
“谁能解释一下为什么会出现这种趋势?”
加速扩展是由 Gene AMDAHL 博士在上个世纪大型机计算早期首次解释的。他最初的表述被称为“收益递减定律”,原则上说,无论向流程中添加多少资源,即使添加无限多个此类资源,每个新添加的资源的加速提升也会较小并且更少,因为最终添加了零新加速(因为满足了收益递减上限的影响,其中处理时间仍然至少与处理流程的串行部分的时间有关,向并行添加更多资源部分不会将静止的串行部分缩短一个飞秒......