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

Measure parallel speedup in randomized-algorithms

我有一个包含顺序和并行变体的随机化程序。该程序的本质是其 运行 时间根据其 "luck" 的不同而有很大差异。它以看似几何分布的模式定期取 1 秒到 2 分钟之间的值。平行变体显示不同数字的相似行为。

在这种情况下,"good" 衡量并行加速的方法是什么? 我有可能只使用测量值的 mean/median 作为 "the run-time"

的代表

我将如何解释这种方法,是否有更好的 (statistically/mathematically) 方法来计算加速比?

编辑:感谢 user3666197,它指出了获得良好数据所必需的一些非常重要的技术细节。 我已经完成了作业,想澄清我的问题。

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

我的问题仍然存在:如何计算该程序的加速比。[​​=41=]

我做了什么:

mean sequential 运行-time 大概是8.38,median是4.8,差距很大。对于 2 个线程,平均 运行-time 是 4.36,而中值 运行-time 是 2.42。 如果我将顺序除以并行,我会得到 1.92(均值)和 1.992(中位数)的加速。 对于类似的 4 个线程:表示:2.25 运行 时间和 3.72 加速,中值:1.12 中值和 4.3 加速(超线性)。 8 个线程存在类似的数字。

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

直方图显示了使用不同线程的 运行 次的分布,右侧的箱线图也是如此。可见一些加速可见

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

如何衡量 parallel-speedup 与纯 [SERIAL] 代码?

始终保持量化和系统化。

这意味着至少:

1) 使用所有 systematic-steps 来控制 test-repeatability
2)比较苹果与苹果,包括。受控 seed-setup 用于随机化器
3) 最好,按照脚本生成所有 test-batteries,auto-repeatable 实验
4) 在测试的 UUID#-distinguishable 日志中记录性能(整体和 local-sections 计时) 5) 收集相当 1E+3 ~ 1E+4 大小的种群 test-runs,而不仅仅是几个单位的个体试验

鉴于您的解决方案已经以纯 [SERIAL] code-execution 方式和其他一些 [CONCURRENT] 甚至 [PARALLEL] 方式实现,最准确的步骤是比较end-to-end 测试持续时间。

使用 monotonic-clocks 很常见,在 [TIME] 域中的分辨率优于 ~ [us]

有关内部性的更多详细信息,最好查看 parallel-speedup 初始的 re-formulated Amdahl's Law and the criticism of,unconstrained-resources 使用公式.

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

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