Parallel processing 是否可以使用采样探查器在并行应用程序中查找热点?
据我所知,采样分析器的工作原理如下:它定期中断程序执行并读取调用堆栈。它注意到程序的哪个部分当前正在执行,并增加一个表示该部分程序的计数器。在后处理步骤中:对于程序的每个函数,计算函数负责的整个执行时间的比率。通过查看此特定函数的计数器C和样本总数N: 函数的比率=C/N 找到热点是很容易的,因为这是程序中具有高比率的部分 但是,对于在并行硬件上运行的并行程序,如何做到这一点呢。据我所知,当程序执行被中断时,所有处理器上程序的执行部分都被确定。因此,并行执行的函数会被计数多次。因此,此函数的样本数C不能再用于计算其在整个执行时间中所占的份额 我的想法正确吗?还有其他方法可以识别并行程序的热点吗?或者这仅仅是使用采样不可能的吗?您走在了正确的轨道上。 是否需要对所有线程进行采样取决于它们是在做相同的事情还是在做不同的事情。 不必同时对所有样品进行取样。 您需要查看实际工作的线程,而不仅仅是空闲线程。 有几点:Parallel processing 是否可以使用采样探查器在并行应用程序中查找热点?,parallel-processing,profiling,sampling,Parallel Processing,Profiling,Sampling,据我所知,采样分析器的工作原理如下:它定期中断程序执行并读取调用堆栈。它注意到程序的哪个部分当前正在执行,并增加一个表示该部分程序的计数器。在后处理步骤中:对于程序的每个函数,计算函数负责的整个执行时间的比率。通过查看此特定函数的计数器C和样本总数N: 函数的比率=C/N 找到热点是很容易的,因为这是程序中具有高比率的部分 但是,对于在并行硬件上运行的并行程序,如何做到这一点呢。据我所知,当程序执行被中断时,所有处理器上程序的执行部分都被确定。因此,并行执行的函数会被计数多次。因此,此函数的样本
- 采样时间应为墙上的时钟时间,而不是CPU时间,除非您想对不必要的I/O和其他阻塞调用视而不见
- 您不仅对堆栈上的函数感兴趣,还对哪些代码行感兴趣,因为它们传达了所花费时间的目的。寻找“热点目标”比寻找“热点”更有用
- 一个函数或一行代码的成本只是它出现在屏幕上的样本的分数。为了了解这一点,假设每10毫秒采集一次样本,总共有N个样本。如果函数或代码行可以消失,那么它在堆栈上的所有样本也将消失,从而将N减少该分数。这就是加速
- 尽管有最后一点,但在抽样中,质量优于数量。当目标是了解您有哪些加速机会时,您可以通过手动检查10-20个样本来了解花费每一时刻的全部原因,从而更快地取得进展。这就是为什么我要手动取样。用统计精度知道时间的长短其实不那么重要
- 发现并解决一个以上问题的重要性怎么强调都不过分。速度问题有好几个方面,你解决的每一个问题都会对已经解决的问题产生乘数效应。那些你找不到的最终成为了限制因素
- 涉及大量异步线程间消息传递的程序更为困难,因为它更难识别花费时间的全部原因
- 采样时间应为墙上的时钟时间,而不是CPU时间,除非您想对不必要的I/O和其他阻塞调用视而不见
- 您不仅对堆栈上的函数感兴趣,还对哪些代码行感兴趣,因为它们传达了所花费时间的目的。寻找“热点目标”比寻找“热点”更有用
- 一个函数或一行代码的成本只是它出现在屏幕上的样本的分数。为了了解这一点,假设每10毫秒采集一次样本,总共有N个样本。如果函数或代码行可以消失,那么它在堆栈上的所有样本也将消失,从而将N减少该分数。这就是加速
- 尽管有最后一点,但在抽样中,质量优于数量。当目标是了解您有哪些加速机会时,您可以通过手动检查10-20个样本来了解花费每一时刻的全部原因,从而更快地取得进展。这就是为什么我要手动取样。用统计精度知道时间的长短其实不那么重要
- 发现并解决一个以上问题的重要性怎么强调都不过分。速度问题有好几个方面,你解决的每一个问题都会对已经解决的问题产生乘数效应。那些你找不到的最终成为了限制因素
- 涉及大量异步线程间消息传递的程序更为困难,因为它更难识别花费时间的全部原因
您需要中断每个线程以找出它在哪里执行。您需要中断每个线程以找出它在哪里执行。谢谢您的提示,而且您的链接非常有趣。但是我不明白为什么我找不到类似“采样分析器在应用于并行程序时是无用的…”这样的东西在文学或其他任何地方。例如,Intel的Parallel Studio非常关注多核编程,但他们没有说并行放大器只能用于查找顺序程序中的热点。你知道讨论这个话题的文学/剖析教程吗?@Constantin:我不知道你在想什么