# CUDA C BEST PRACTICE 笔记翻译 第三章

这次来第三章

3. Application Profiling

注 Profile这个词不太好翻译,我平常的理解一般是代指对程序进行各个方面的分析以找到瓶颈或者问题,后面我就都用 profile 了

3.1 Profile

许多代码用较少代码完成了大量的工作,使用 profiler,开发者可以定位到这样的热点,并开始编译并行化的候选列表

较少的代码完成大量工作,这里说的很模糊,我理解的意思是用少量的函数完成了大部分的计算,那么这块就有并行化加速的潜力。并行化候选列表我理解的就是看看哪些耗时多,这些就可以尝试用并行化来加速。

3.1.1 创建 Profile

有许多可能的方法来分析代码,但是目标都是相同的:找到花费了大部分程序运行时间一个或一系列函数。

对于任何分析活动,最重要的考虑是确保工作负载是真实的,换句话说,从这些分析测试中获得的结论和基于此做的决策与数据是相关的。使用非真实的数据会导致非最优的结果,开发人员会浪费精力在对非真实的数据规模上进行优化以及聚焦在错误的热点函数上。

有许多工具可以进行 profile 的操作,比如gprof,这是一个开源的 linux 平台的GNU内置的分析工具,下面是使用的一个例子

3.1.2. 识别热点

在上面的例子中,我们可以清晰的看到genTimeStep()这个函数占了三分之一的程序运行时间,这个函数就是我们进行并行化的第一个候选。

值得注意的是,上述例子的部分其他函数也占用了总运行时间的很大一部分,如 CalcStats()CalcSummaryData()。将这些函数并行化也会提升我们的加速的可能性。

3.1.3 理解可扩展行(scaling)

注:这里的 scaling 同样不是很好翻译,其大概的意思是整个工作的加速效果会随着不同的处理器和计算规模的增加情况如何变化,后面都用可扩展性

通过了解程序如何扩展,我们可以设定预期并计划增量的并行策略,3.1.3.1介绍了强可扩展性,使得我们在固定问题规模的情况下得到加速的上界。3.1.3.2介绍了弱可扩展性,问题规模是增加的。在许多程序中,是强和弱可扩展性 的结合。

3.1.3.1 强可扩展性与Amdahl 定律

强可伸缩性是一种度量,用于衡量对于固定的总体问题大小,随着向系统中添加更多处理器,解决问题所需的时间如何减少。表现出线性强扩展的应用程序的加速与所使用的处理器数量相等。

强可扩展性等价于阿姆达尔(Amdahl)定律,指出了对于某个程序的并行部分所能得到的最大加速,程序的最大加速SS

S=11P+PNS=\frac{1}{1-P+\frac{P}{N}}

这里 PP是可并行化部分所花费的总时间占比, NN是并行执行的处理器数目。N 越大,P/NP/N就越小,所以当 N 足够大时,公式就变成了S=1/(1P)S=1/(1-P)。所以如果一个程序可以并行的部分占比四分之三,最高的加速比就是4

事实上,大部分程序虽然在某些程度下具有线性强扩展性,无法展示出完美的线性强扩展性。关键的一点是可并行的部分越多,加速的潜力就越大。相反的,如果P 较小,增加处理器的数目所带来的性能提升就很小。因此,为了在固定的问题规模下获得最大的加速,值得花精力增加P,也就是最大化可以并行化的代码量。

注:阿姆达尔定律乍一看打击挺大的,我在刚接触这个研究方向是也困扰了一段时间,如果可并行部分就那么多,我就是用无限多个核心加速无线快也存在一个看起来并不高的上限。但是需要注意的是阿姆达尔的定律假定问题总体规模不变,事实上在很多情况下随着核心数目的增加问题规模也是会增加的。也可以看到很多时候加速比都成百上千的,换句话说,上限确实存在,但是在一定区间内还是会增大。可以尽量去增加问题的规模以打到更高的加速比。

3.1.3.2 弱可扩展性与Gustafson定律

弱缩放是一种度量方法,用于衡量随着更多处理器被添加到系统中,每个处理器的问题大小是固定的,解决问题的时间如何变化。例如,随着处理器数量的增加,整体问题的大小也会增加。弱可扩展性等价于古斯塔夫森(Gustafson)定律。问题的大小随处理器数量的增加而增加。因此,程序的最大加速S为

S=N+(1P)(1N)S=N+(1-P)(1-N)

这里的 P 和 N 的概念与上面一致的

另一种看待古斯塔夫森定律的角度是当我们扩展系统时,并不是问题的规模保持不变,而是执行的时间保持不变。请注意,Gustafson定律假设串行执行与并行执行的比率保持不变,这反映了设置和处理更大问题的额外成本。

3.1.3.3 应用强扩展性与弱扩展性

了解哪种扩展线适合于某个应用程序是评估加速的重要部分.对于某些应用程序,问题大小将保持不变,因此只适用于强扩展性。一个例子是模拟两个分子如何相互作用,其中分子大小是固定的。

For other applications, the problem size will grow to fill the available processors
对于其他的应用程序,问题规模会增加以填充可用的处理器。比如流体建模或蒙特卡洛模拟,增加问题大小可以增加准确性(accuracy)

注:没太明白跟准确性有啥关系,或者是我翻译的错了,希望有大佬可以解释下。

在了解了应用的 profile 后,开发人员应该了解如果计算性能发生变化,问题大小将如何变化,然后应用Amdahl定律或Gustafson定律来确定加速的上限。