运行分析实验的次数



我正在尝试评测CUDA应用程序。我对HPC程序的性能分析和工作负载特性有一个基本的怀疑。假设我想分析挂钟时间(程序执行的端到端时间)。一个人应该进行多少次相同的实验来解释墙上时钟时间测量的变化?谢谢

一个人应该运行同一个实验多少次才能解释墙上时钟时间测量的变化?

问题语句假定执行时间会有变化。问题是吗

一个人应该运行CUDA代码多少次以进行性能分析和工作负载表征?

那么我会回答

一次。

让我解释一下为什么。。。给你一些不同意我的理由。。。

从根本上讲,计算机是确定性的,程序的执行是确定性的。(尽管,见下文,有些程序可能会给人一种非决定性的印象,但除非配备了异国情调的外围设备,否则它们是决定性的。)

那么,同一程序的两次运行之间执行时间差异的原因可能是什么呢?

  1. 物理学

随着组件温度的变化,位在RAM和CPU之间移动得更快吗?我不知道,但如果他们知道,我很确定,在计算机运行的通常温度范围内,相对差异将在纳米范围内。我认为计算物理学产生的任何其他差异都将同样完全可以忽略不计。这里唯一的教训可能是,不要对只需要一两微秒就能执行的程序进行性能分析。

注意,为了这个答案的目的,我忽略了一些处理器根据温度调整时钟速率的能力。这会对程序的执行时间产生一些(可能很大)影响,但你所学到的只是如何将其用作温度计。

  1. 系统资源争夺

我指的是在同一CPU/内核上运行的其他进程(包括操作系统)、内存总线上的其他流量、使用I/O的其他进程等。当然,是的,这些可能会对程序的执行时间产生重大影响。但是,在这些情况下,程序运行之间的运行时间变化会告诉你什么?它们告诉你系统在同一时间做其他工作有多忙。并使分析程序性能变得非常困难。

这里的一个教训是在一台安静的机器上运行程序。实际上,HPC系统管理的一个特点是,它们旨在提供一个安静的平台,为用户代码提供可靠的运行时间。

另一个教训是避免在测量执行时间时包括无法控制的操作所需的时间,如磁盘读写或网络通信。

如果您的程序是磁盘的重度用户,那么您可能应该使用标准基准代码之一来测量i/o速率,以便清楚地了解对程序的潜在影响。

  1. 程序功能

您的程序可能有某些方面可以合理地预期从一次运行到下一次运行会产生不同的时间。例如,若您的程序依赖于随机性,那个么不同的骰子可能会对执行时间产生一些影响。(在这种情况下,您可能需要多次运行该程序,看看它对RNG的操作有多敏感。)

然而,我从可变性的第三个来源中排除了使用不同输入或参数运行代码的可能性。如果您想测量程序执行时间wrt输入大小的可伸缩性,那么您肯定必须多次运行程序。

  1. 结论

关于一个程序,通过多次运行它,从一次运行到下一次运行所做的工作没有任何差异,几乎没有什么值得学习的。

是的,在我的早期,我曾多次运行同一个程序,以查看执行时间的变化。我知道事实并非如此,这就是我得到答案的原因。

这种测试展示了编译后的应用程序与将要使用它的操作系统/计算环境的交互效果,而不是特定算法或架构的效率。我通过在干净的重新启动/旋转后连续运行应用程序三次来进行这种测试。我正在寻找第一次执行时由操作系统加载和缓存库或运行时环境引起的任何差异;我希望接下来的两个运行时彼此相似(并且比第一个更快)。如果他们没有,那么就需要更多的调查。

还有两条评论:如果你有一个有很多依赖关系的复杂应用程序,很难确定你的应用程序需要什么库和运行时,以及给定的计算环境将如何处理它们。此外,我建议避免为客户指定应用程序运行时,因为很难控制客户的计算环境。关注应用程序中可以控制的内容:体系结构、算法、库版本。

最新更新