gpt4 book ai didi

c - 确定我们的 ASM 程序的 FLOPS

转载 作者:太空狗 更新时间:2023-10-29 16:48:58 25 4
gpt4 key购买 nike

我们必须实现一个 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。我们首先测量运行时间,然后为我们感兴趣的每条指令插入计数器,然后计算每秒的浮点运算次数。 Floating point operations per second for matrix multiplication

最佳答案

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


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

一旦你完成了所有这些,你可能会开始后悔花所有的时间去做这件事,因为你将拥有的是 (arbitrary number)/(execution time) which仅比 (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,其中加法和乘法都是单周期的,再加上一两个寄存器风险。

关于c - 确定我们的 ASM 程序的 FLOPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28142923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com