11.11. Open MPI应用性能基准测试
正确运行基准测试是一项极其困难的任务。需要考虑的因素非常多;这并非简单地编译并运行一个标准基准测试应用程序那么简单。本文档绝非权威指南,但确实尝试为生成准确且有意义的基准测试提供一些建议。
明确决定你要测试的内容,并相应设置系统。例如,若想测试最大性能,则下列许多建议极为相关(确保是相关系统和网络上的唯一用户,唯一运行的软件,使用处理器亲和性等)。若想测试平均性能,部分建议可能不太相关。无论如何,关键是要清楚知道你想测试的内容,并了解(而非猜测)你的系统和基准测试应用本身,以充分理解结果的含义。
具体而言,许多基准测试应用的实际测试内容并未被充分理解。常有用户运行某个基准测试后,仅基于一个他们不理解的结果就错误断定系统性能差。仔细阅读基准测试文档,甚至查看代码本身,以确切了解它在测试什么。
典型例子:并非所有乒乓测试都相同。多数用户认为乒乓测试就是乒乓测试。但事实并非如此;常见的乒乓测试往往微妙地测试不同内容(如NetPIPE、TCP bench、IMB、OSU等)。确保你理解基准测试实际在测试什么。
确保在运行基准测试的系统上你是唯一的用户,以避免其他进程的竞争。
确保您是整个网络/互连中唯一的用户,以消除其他进程造成的网络流量争用。这通常有些难以实现,特别是在较大型的共享系统中。但当您成为整个网络上唯一的用户时,将获得最准确、可重复的测试结果。
禁用所有未使用的服务和守护进程。即使是"无害"的守护进程也会消耗系统资源(如内存),并通过偶尔唤醒、占用CPU周期、读写磁盘等操作造成"抖动"。最佳的基准测试系统应该运行绝对最少数量的系统服务。
确保正确利用处理器和内存亲和性,防止操作系统在处理器之间交换MPI进程(例如导致不必要的缓存抖动)。
警告
在NUMA架构上,进程从一个插槽被挤到另一个插槽的代价,在缓存局部性方面(伴随缺乏局部性带来的所有缓存一致性开销)比内存传输路由方面(见下文)更为昂贵。
务必了解您系统的架构,特别是内存、磁盘和网络特性,并相应地进行测试。例如,在NUMA架构上,内存访问可能需要通过内存互连进行路由;远程设备和/或内存访问将明显慢于本地设备和/或内存访问。
使用适当的编译器优化标志编译您的基准测试。某些MPI实现中,编译器包装器(如
mpicc、mpifort等)会自动添加优化标志。Open MPI不会这样做。请明确添加-O或其他标志。确保您的基准测试运行足够长的时间。运行时间较短的基准测试通常准确性较低,因为它们采集的样本较少;而运行时间较长的任务往往能采集更多样本。
如果你的基准测试旨在测量极短事件(例如单次消息乒乓所需的时间):
首先执行一些“预热”事件。许多MPI实现(包括Open MPI)——以及MPI所依赖的其他子系统——可能采用“惰性”语义来建立和维护通信流。因此,第一个事件(或前几个事件)的耗时可能明显长于后续事件。
尽可能使用高精度计时器 —
gettimeofday()仅返回毫秒级精度(有时在几微秒量级)。多次运行该事件(数百或数千次,具体取决于事件及其耗时)。这不仅提供了更多样本,在某些情况下也是必要的,尤其是当您使用的计时器精度可能比您尝试基准测试的事件低几个数量级时。
确定你是报告最小值、平均值还是最大值,并给出充分的理由。
准确标注并报告所有结果。可复现性是基准测试的主要目标;如果基准测试结果没有精确标注它们报告的具体内容,那么这些结果实际上是无效的。请记录并详细说明你正在测试的"确切"系统配置。例如,注意所有硬件和软件特性(包括适当的硬件、固件和软件版本)。