确定我们的ASM计划的FLOPS

时间:2015-01-25 23:41:22

标签: c assembly arm neon flops

我们必须实现一个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数量的性能工具。 任何建议或指示将不胜感激。

以下是使用计数方法评估矩阵乘法的FLO​​P。我们首先测量了我们感兴趣的每条指令的插入计数器的运行时间,之后我们计算了每秒的浮点运算次数。 Floating point operations per second for matrix multiplication

2 个答案:

答案 0 :(得分:10)

看起来你可以用the performance events supported by Cortex-A8得到的最接近的是执行的总指令数,这对于“一条指令”执行从0到(我认为)8 FP操作的任何操作都不是很有帮助。退后一步,很明显,尝试在硬件中测量算法的FLOPS无论如何都不会真正起作用 - 例如您可以使用向量操作编写实现,但并不总是将实数存储在每个向量的所有通道中,那么CPU需要精通才能知道它执行的FP操作实际数量。


幸运的是,给定算法的正式定义,计算所涉及的操作数应该相当简单(尽管不一定 easy ,具体取决于复杂性)。例如,在脑海中贯穿它, m x n 矩阵的标准天真乘法与 n x m < / em> matrix出现在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意味着更好的表现,这对于任何合理的解释显然是不正确的?或者您是否会得出结论,除了合成基准之外,FLOPS对于将一个CPU的理论最大带宽与另一个CPU的理论最大带宽进行比较几乎毫无意义?

*为了辩论,我们凭空掏出了数字;然而它们实际上并不像Cortex-M4F这样的东西 - 单精度FPU,其中加法和乘法都是单周期,加上一到两个用于寄存器危险。

答案 1 :(得分:-1)

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