是否可以使用采样分析器在并行应用程序中找到热点?

时间:2013-04-15 19:11:13

标签: parallel-processing profiling sampling

据我所知,采样分析器的工作原理如下:它以规则的间隔中断程序执行并读出调用堆栈。它注意到程序的哪一部分当前正在执行,并增加了代表该程序这一部分的计数器。在后处理步骤中:对于程序的每个函数,计算整个执行时间的比率,函数负责该比率。这是通过查看该特定函数的计数器C和样本总数N:

来完成的

函数的比率= C / N

然后找到热点很容易,因为这是程序中具有高比率的部分。

但是如何在并行硬件上运行并行程序呢?据我所知,当程序执行中断时,确定所有处理器上程序的执行部分。由于并行执行的功能被多次计数。因此,该函数的样本数C不能用于计算其在整个执行时间中的份额。

我的想法是否正确?是否有其他方法可以识别并行程序的热点 - 或者使用采样这是不可能的?

1 个答案:

答案 0 :(得分:1)

你走在正确的轨道上。 是否需要对所有线程进行采样取决于它们是在做同样的事情还是做不同的事情。 并非必须同时对它们进行全部采样。 您需要查看实际工作的线程,而不仅仅是空闲。 一些要点:

  • 采样应该是挂钟时间,而不是CPU时间,除非您想对不必要的I / O和其他阻塞呼叫视而不见。

  • 您不仅对堆栈中的哪些功能感兴趣,而且对代码行感兴趣,因为它们传达了花费时间的目的。寻找“热门目的”而不是“热点”更有用。

  • 函数或代码行的成本只是它出现的部分样本。为了理解这一点,假设每10毫秒采样一次,总共N个样本。如果可以使函数或代码行消失,那么它在堆栈中的所有样本也将消失,从而使N减少该分数。这就是加速。

  • 尽管最后一点,在抽样中,质量节拍数量。当我们的目标是了解您为加速提供的机会时,您可以通过手动审查10-20个样本来更快地了解每个时刻花费的全部原因。这就是我手动采样的原因。了解统计精确度的时间量实际上并不那么重要。

  • 我无法强调发现和修复超过一个问题的重要性。速度问题有几个问题,你修复的每一个都会对已经完成的问题产生倍增效应。您发现的那些最终成为限制因素。

  • 涉及大量异步线程间消息传递的程序更加困难,因为很难分辨出花费时间的全部原因。

More on that.