10

我们必须实现一个 ASM 程序,以将坐标方案格式 (COOS) 和压缩行格式 (CSR) 中的稀疏矩阵相乘。现在我们已经实现了所有这些算法,我们想知道与通常的矩阵乘法相比,它们的性能提高了多少。我们已经实现了代码来测量所有这些算法的运行时间,但现在我们决定我们还想知道每秒可以执行多少次浮点运算 (FLOPS)。关于如何测量/计算这个的任何建议?

这里有一些关于所用系统的背景信息:

processor   : 0
model name  : ARMv7 Processor rev 2 (v7l)
Features    : swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpd32 
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x3
CPU part    : 0xc08
CPU revision    : 2

我们现在的第一个想法是实现一种 FPO 计数器,我们在每次浮点运算(算术运算以及比较和移动运算)之后递增,但这意味着我们必须在整个代码中插入递增运算,这也会减慢关闭应用程序...有谁知道是否有某种硬件计数器可以计算浮点运算的数量,或者是否存在某种性能工具可以用来监视我们的程序并测量 FPO 的数量。任何建议或指示将不胜感激。

这是使用计数方法评估矩阵乘法的 FLOP。我们首先测量了我们感兴趣的每条指令的运行时间,而不是插入的计数器,然后我们计算了每秒浮点操作的数量。 用于矩阵乘法的每秒浮点运算

4

2 回答 2

10

看起来最接近Cortex-A8 支持的性能事件是执行的总指令计数,考虑到“一条指令”执行从 0 到(我认为)8 FP 操作的任何操作,这并不是很有帮助。退后一步,很明显,尝试在硬件中测量算法的 FLOPS无论如何都不会真正起作用 - 例如,您可以使用向量操作编写实现,但并不总是将真实数据放在每个向量的所有通道中,然后是 CPU需要通灵才能知道它实际执行的 FP 操作有多少。


幸运的是,给定算法的正式定义,计算所涉及的操作数量应该相当简单(尽管不一定容易,取决于复杂性)。例如,在我的脑海中运行它,m x n矩阵与n x m矩阵的标准朴素乘法得出m * m * (n + n - 1)运算(每个输出元素n乘法和(n - 1)次加法)。一旦纸上分析提出了一个适当参数化的操作计数公式,您就可以将其放入您的基准测试工具中,以计算测试数据的数字。

一旦你完成了所有这些,你可能会开始后悔花费所有时间去做这件事,因为你所拥有的是(arbitrary number) / (execution time)(execution time)单独更有意义的东西,而且大多数情况下只是使(arbitrary number)不同情况之间的比较变得复杂。特别是 NEON 性能主要由管道延迟和内存带宽决定,因此低级实现细节很容易超过算法可能具有的任何固有差异。

这样想:假设在某些给定的 100MHz CPU 上a + a + b + b总共需要 5 个周期,而总共(a + b) * 2需要 4 个周期* - 前者得分 60 MFLOPS,后者只有 50 MFLOPS。您是否会说更多 FLOPS 意味着更好的性能,在这种情况下,需要 25%的时间才能得到相同结果的例程在某种程度上“更好”?您是否会说更少的 FLOPS 意味着更好的性能,这对于任何合理的解释来说显然是不正确的?或者您是否会得出结论,除了合成基准来比较一个 CPU 与另一个 CPU 的理论最大带宽之外,FLOPS 几乎没有任何意义?

*为了争论而凭空提出的数字;然而,它们实际上与 Cortex-M4F 之类的东西相距不远——单精度 FPU,其中加法和乘法都是单周期,再加上一两个寄存器冒险。

于 2015-01-26T03:50:44.487 回答
-1

核心数 x 平均频率 x 每周期操作数

于 2015-05-05T01:32:50.997 回答