测量随机算法中的并行加速

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了测量随机算法中的并行加速相关的知识,希望对你有一定的参考价值。

我有一个顺序和并行变体的随机程序。该程序的性质是它的运行时间根据其“运气”而大不相同。它通常以看似几何分布的模式在1秒到2分钟之间取值。并行变体显示具有不同数字的类似行为。

在这种情况下,衡量并行加速的“好”方法是什么?我有可能只使用测量值的均值/中值作为“运行时”的代表

我如何解释这种方法,是否有(统计/数学)更好的方法来计算加速?

编辑:感谢user3666197,它注意到获得良好数据所需的一些非常重要的技术细节。我做了那个功课,想澄清我的问题。

我使我的基准测试过程尽可能可靠:

  • 基准是用种子运行的,结果可以重现。
  • 每个配置重复多次(~400次),脚本中包含不同的种子

我的问题仍然是:如何计算这个程序的加速计算。

我做了什么:

平均连续运行时间约为8.38,中位数为4.8,这是一个很大的差异。对于2个线程,平均运行时间为4.36,而中值运行时间为2.42。如果我按顺序划分顺序,我会得到1.92(手段)和1.992(中位数)的加速。对于4个类似的线程:意味着:2.25运行时和3.72加速,中位数:1.12中位数和4.3加速(超线性)。 8个线程存在类似的数字。

我尝试以不同的方式可视化数据。 Plots

直方图显示了使用各种线程的运行时间分布,右侧的框图也是如此。可以看出一些加速是可见的。

如果我根据种子配对测量,我会得到成对的次数:顺序和平行时间。我的第一个想法之一是通过计算回归线的斜率来计算加速,然而,似乎回归线没有正确地“总结”数据并且价值有限。在右下图中,仅显示了4个线程的点。

答案

我建议你根据一组足够大的测量值的运行时算术平均值来计算加速比。确保正确传达数字代表的内容。可能很难确保您具有足够大的设置测量值以便以一定的置信度计算正确的平均值,尤其是因为您的样本不是正态分布的。包括有关分配和限制的发现。在计算加速之前,请务必首先总结运行时。

有一个很好的paper by Torsten Hoefler and Roberto Belli详细介绍了你的问题。特别是第2.1.1和3节。

另一答案

如何测量并行加速与纯[SERIAL]代码?

永远是定量和系统的。

这意味着至少:

1)使用所有系统步骤来控制测试重复性 2)比较苹果与苹果,包括随机化器的受控种子设置 3)最好,生成所有测试电池作为脚本,自动重复实验 4)在测试中记录性能(总体和局部部分时间)'UUID #-可区分的日志5)收集相当于1E + 3~1E + 4个大小的测试运行群体,而不仅仅是几个单独的试验单元

鉴于您的解决方案已经以纯[[SERIAL]代码执行方式和其他一些[CONCURRENT]甚至[PARALLEL]实现,最精确的步骤是比较端到端测试持续时间。

使用单调时钟是很常见的,在~ [us]域中具有优于[TIME]分辨率的单调时钟。

有关内部性的更多细节,最好查看re-formulated Amdahl's Law以及对并行加速初始,无约束资源使用公式的批评。

以上是关于测量随机算法中的并行加速的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中并行化以下代码片段?

通过并行化加速随机数生成

水平集图像分割并行加速算法设计与实现(串行OpenMPCUDA)——串行实现篇

测量 NVIDIA 张量核心加速

OpenMP并行编程应用—加速OpenCV图像拼接算法

OpenGL 之 Compute Shader(通用计算并行加速)