据我了解,采样分析器的工作方式如下:它定期中断程序执行并读出调用堆栈。它记录程序的哪个部分当前正在执行,并增加一个表示该程序部分的计数器。在后处理步骤中:对于程序的每个功能,计算整个执行时间的比率,该功能负责。这是通过查看此特定函数的计数器 C 和样本总数 N 来完成的:
函数比 = C / N
然后找到热点很容易,因为这是程序中比例很高的部分。
但是对于在并行硬件上运行的并行程序,如何做到这一点。据我所知,当程序执行被中断时,所有处理器上的程序执行部分都会被确定。因此,并行执行的函数会被多次计数。因此,该函数的样本数 C 不能再用于计算其在整个执行时间中所占的份额。
我的想法正确吗?是否有其他方法可以识别并行程序的热点 - 或者这只是不可能使用采样?