基于 Roofline 模型的性能

计算科学 并行计算 高性能计算 效率
2021-12-05 00:40:09

为了稍微跟进这里提出的问题,有人告诉我Roofline 模型是评估任何科学代码性能的一种方法。基本上,我计算算术强度(FLOPS 与 DRAM 字节的比率)并将其乘以 STREAM 带宽以获得理想的 FLOPS/s。我还可以使用 AI 来查看我与给定机器的最大性能有多接近。

也就是说,为有限元软件包(如 FEniCS 或 Deal.II)获取此 AI 的最简单方法是什么?就目前而言,我不太关心寄存器/缓存重用或为某种级别的缓存维持的有用带宽的量化。如果我使用 PETSc 编写了我自己的显式有限元实现,我可以简单地手动计算 FLOPS 的近似数量,并估计来自所有向量操作和稀疏矩阵向量乘法的加载/存储数量,如此处所述但是,对于任何给定的实现,是否有人对这样做有任何建议?

1个回答

你绝对不能做的是使用硬件性能计数器测量任何现代英特尔架构上的失败。从 Nehalem 开始,英特尔芯片基本上计算发出的浮点指令,如果数据没有到达处理器寄存器,指令可能不会被淘汰。相反,它会在一段时间后重新发布,并且这种情况一直发生,直到数据可用并且指令可以完成。结果,STREAM Triad 的硬件 PMC 测量结果超出了 10 倍。DGEMM 超出了几个百分点。这些可能代表了界限。这变得如此糟糕,以至于英特尔禁用了 Haswell 上的翻牌性能计数器。

因此,您唯一真正的选择是打开代码并手动计算操作,除非其中一些库包含为您计算它们的仪器。

从某种意义上说,为什么要这么麻烦?为什么不做两件事,因为无论如何您都将设置和运行这些代码:

  1. 在给定架构上的每个代码中运行完全相同的问题,尽你所能以相同的方式编译
  2. 针对大小参数的不同值(网格点、元素等)运行每种情况

借助每种情况的运行时间,您应该能够将多项式或其他复杂性理论函数拟合到运行时间数据,从而确认该方法具有预期的计算复杂性并估计各种相关常数。即如果你期望O(n2),那么你应该很好地拟合二次方。你可能需要忽略小端n完全。您还应该能够看到哪个更快。除非这些曲线多次交叉(一旦你进入渐近状态,它们真的不应该交叉),最快的就是最有效的。确保你跑得足够大。

询问这些代码中的任何一个是否像理论上一样有效是一个更难的问题。