tzw*_*ckl 10 c assembly arm flops neon
我们必须实现一个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
Run Code Online (Sandbox Code Playgroud)
我们现在的第一个想法是实现一种FPO计数器,我们在每次浮点运算(算术运算以及比较和移动运算)之后递增,但这意味着我们必须在我们的代码中插入递增运算,这也会减慢关闭应用程序...有没有人知道是否有某种硬件计数器可以计算浮点运算的数量,或者可能存在某种性能工具,可用于监控我们的程序并测量FPO的数量.任何建议或指示将不胜感激.
下面是使用计数方法评估矩阵乘法的FLOP.我们首先测量了我们感兴趣的每条指令的插入计数器的运行时间,之后我们计算了每秒的浮点运算次数.

Not*_*hat 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意味着更好的表现,这对于任何合理的解释显然是不正确的?或者您是否会得出结论,除了合成基准之外,FLOPS对于将一个CPU的理论最大带宽与另一个CPU的理论最大带宽进行比较几乎毫无意义?
为了论证,数字是凭空掏出来的; 然而它们实际上并不像Cortex-M4F这样的东西 - 单精度FPU,其中加法和乘法都是单周期,加上一到两个用于寄存器危险.