1

据我了解,采样分析器的工作方式如下:它定期中断程序执行并读出调用堆栈。它记录程序的哪个部分当前正在执行,并增加一个表示该程序部分的计数器。在后处理步骤中:对于程序的每个功能,计算整个执行时间的比率,该功能负责。这是通过查看此特定函数的计数器 C 和样本总数 N 来完成的:

函数比 = C / N

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

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

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

4

1 回答 1

1

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

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

  • 您不仅对堆栈上的哪些函数感兴趣,还对哪些代码行感兴趣,因为它们传达了所花费时间的目的。寻找“热点目的”比寻找“热点”更有用。

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

  • 尽管有最后一点,在抽样中,质量胜过数量。当目标是了解您有哪些加速机会时,您可以通过手动检查 10 到 20 个样本来了解每个时间都被花费的全部原因,从而获得更快的速度。这就是我手动取样的原因。以统计精度了解时间量实际上远没有那么重要。

  • 发现和解决不止一个问题的重要性,我怎么强调都不为过。速度问题有好几个,你解决的每一个问题都会对已经完成的问题产生乘数效应。你找不到的那些最终成为限制因素。

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

更多关于那个。

于 2013-04-16T11:44:00.510 回答