微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

浮点指令和浮点运算有什么区别?

如何解决浮点指令和浮点运算有什么区别?

我一直在研究计算机性能指标,但我对 MFLOPS 有疑问。根据定义,MFLOPS 是 (NumberOfFloatingPointOperations/ExecutionTime*106)。起初,我认为操作和指令是一样的。但是,我在 PDF 中发现了这一点:

"... . 因为它是基于程序中的操作而不是基于 说明,MFLOPS 比 MIPS 更有力地声称是公平的 不同电脑的比较。这一主张的关键在于 运行在不同计算机上的同一个程序可能会执行一个 不同数量的指令,但将始终执行相同的 浮点运算次数。 ……”

好像操作和指令不太一样。有什么区别?

来源:https://course.ccs.neu.edu/cs3650/ssl/TEXT-CD/Content/COD3e/InMoreDepth/IMD4-MFLOPS-as-a-Performance-Metric.pdf

解决方法

FP 域中最典型的运算是加法和乘法。 Arm64 Neon 指令集 OTOH 实现了融合乘法累加,在一条指令中可以执行 2 个最基本的浮点运算。

SIMD 通常还可以并行执行 2、4、8、16 次加法、乘法甚至可能的融合乘法累加,从而增加每条指令(或每个时钟周期)的浮点运算次数。

此外,随着机器学习推理引擎中广泛使用的 FP16 的引入,每条指令可以挤出两倍的操作数量——事实上的行业标准仍然几乎将浮点运算等同于单精度运算,迫使一些制造商使用其他首字母缩略词,例如每秒神经操作。

,

“FP 指令”的类别通常包括加载和存储(如 x86 movsd xmm0,[rdi])、寄存器复制、按位布尔运算以及其他非 FP 数学指令,因为它们不涉及处理 FP 符号/指数/尾数或四舍五入和归一化结果的任何艰苦工作。

此外,一条机器指令可以执行多次 FLOP(SIMD 和/或 FMA)。

执行 FP 数学的程序还将包括一些整数指令用于循环开销,可能用于数组索引或指针增量(尤其是在没有索引寻址模式的经典 MIPS 等 ISA 上),或者如果您在调试模式下编译,但您询问“浮点指令”。


现代流水线乱序 CPU 的 FP 执行单元数量有限;此类执行单元占用大量晶体管,与标量整数 add 不同,因此 CPU 通常没有足够的后端 FP 执行吞吐量来跟上前端。 (例如 AMD Zen 有 5 指令/6 uop 宽的前端,但只有两个 SIMD FP add/mul/FMA 执行单元)。

一些 FP 工作负载会在其吞吐量上出现瓶颈,运行足够少的其他指令,以至于 FP 操作吞吐量是限制因素,无论您为什么 ISA 编译。 (它是否允许像 x86 这样的 FP mul 的内存源操作数,或者是需要单独加载指令的加载/存储 ISA(例如 RISC)。)

FLOPS(FLOPs/second)作为品质因数告诉您理论上的最大 FP 吞吐量,如果您可以将其他指令开销保持在足够低的水平,以便 CPU 实际保持其 FP 执行单元有工作要做。


加载和存储指令,以及复制寄存器之类的东西,不是 FP 数学运算,也不算作 FLOPS。类似地,数组索引数学和循环计数器的整数指令通常只是 FP 算法中的开销。 (一些 FP 代码使用紧凑存储在数据结构中的稀疏数组,这些数据结构具有整数索引数组或其他任何东西,因此在这种情况下整数工作可以成为程序“实际工作”的一部分,但它仍然不是 FP 数学)。>

相反,SIMD 可以通过一条 CPU 指令完成多项数学运算,从而允许大量的工作通过一个不太宽的管道来完成。 (例如,x86 vmulps ymm0,ymm1,[rdi] 从内存加载 32 个字节,并在该数据和 ymm1 的元素之间执行 8 次打包的单精度乘法运算。)

FMA(融合乘加)通常被视为两个 FLOP,尽管大多数支持它的 CPU 本身在单个执行单元中执行它。例如,英特尔自 Haswell 可以在每个时钟周期启动两个 SIMD FMA 操作,每个操作处理 32 字节的数据(8 个浮点数或 4 个双精度数)。所以这是每个内核每个周期 2x 8 个单精度 FLOP。

(并且它具有前端带宽和后端执行单元,还可以运行两个非 FMA uop,例如循环开销、存储 FMA 结果等,甚至包括 SIMD 按位 OR / AND / XOR,例如翻转浮点向量中的符号位。)

vxorps 不算作 FLOP,因为它只是简单的按位运算,而不是必须处理输入的尾数和指数并规范化输出的数学运算。 Nor do SIMD vector shuffles

您可能会将 x86 unpcklps xmm1,xmm0 之类的内容视为“浮点指令”。除了在助记符中具有“打包单个”之外,某些 CPU 上的相同随机或按位操作的整数和 FP 版本之间存在性能差异。例如,当浮点域指令从 SIMD 整数指令(如 paddq)读取输入时,英特尔 Nehalem 有 2 个周期的旁路转发延迟。

请参阅 Agner Fog 的 microarch 指南、https://agner.org/optimize/ 和诸如此类的问答

相关:

,

基准是BS。他们太容易被操纵,被操纵了。 MFLOPS 的概念一直存在缺陷,因为您无法对其进行测量。 MIPS 更好,但同样有缺陷,因为基准是 BS。更改编译选项,将相同的二进制文件在不同代的处理器上运行等结果导致人们对购买产品或了解性能做出错误判断。

浮点运算将是加法、减法、除法等运算。指令不同,您需要以某种方式将值放入 fpu 中,或者放入寄存器,然后使用寄存器操作数进行运算,或者进行运算使用内存操作数发生。用位填充处理器中的一个表,并让它对其进行一些大规模操作,等等。每秒与指令以及您将它们输入处理器的速度以及处理器对它们进行操作的速度有关。今天,这些都不是确定性的。同样,通常是编译后的代码,指令的列表和顺序现在基于编译器是动态的。如果你特别认为 x86 但其他架构也是如此,每一代都是一个新的/修改过的设计,英特尔倾向于在当前较慢的速度运行针对前代处理器调整的二进制文件,但如果你针对当前进行优化,它将运行得更快(重新编译)。 AMD 倾向于做相反的事情,让现有的二进制文件运行得更快。是否仍然像过去那样戏剧性地做到这一点?我不知道。

但所有这些都归结于基准测试是 BS 的事实。重要的是我现在正在运行的硬件上运行的二进制文件。它是否足够快,我可以更改什么以使其更快?如果您有源代码,请重新编译,手动调整问题区域。购买新硬件,但您无法通过基准测试预先确定新硬件是否会运行您需要更快或更慢运行的二进制文件。在 x86 世界的历史上,同样的二进制新处理器不一定更快,这绝对是一个问题,同样你不能真正针对 x86 进行优化并让它在任何地方运行良好。如果您关心性能,则需要按代/系统进行调整。浮点数 vs 定点数 vs 只是通用代码都没有关系,这是同一个问题。

您的报价当然有缺陷,因为我所做的基准测试是 BS 声称的一部分。您可以尝试创建一个基准测试,该基准测试在该代码中具有一定数量的已定义操作。它如何为每个目标通过哪个编译器进行编译决定了这些操作中有多少是在编译时解决的,而不是实际转化为可执行代码。对于相同的目标,不同的编译器或相同的编译器不同的版本或相同的编译器相同的版本,不同的选项,甚至是相同的编译器相同的版本,命令行上源文件或目标文件的不同顺序都可以/将影响执行时间。因此,同一台计算机、同一天、同一编译器、同一基准源代码以及固定数量的“浮点运算”可能会产生截然不同的“每秒”结果。如果你不能让相同的计算机、相同的编译器、相同的源代码一致地执行,那么你怎么可能用它来与其他任何东西进行比较? MFLOPS 和 MIPS 一样可怕,试图比较不同的硬件。

顺便说一句,您用您添加的引语回答了标题问题。运算是运算,加法,除法等。指令是指令。确实会有一个执行添加操作的添加指令,但添加将有一些设置和恢复工作要做。以及多少因操作或一组顺序(或并行)操作而异。

,

我认为浮点运算意味着一组指令。如果我们改变 ISA,它可能是相同数量的操作,但并不总是相同数量的指令。指令和操作不一样。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?