热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么x86_64CPU上的通用寄存器没有融合乘法加法?

如何解决《为什么x86_64CPU上的通用寄存器没有融合乘法加法?》经验,为你挑选了1个好方法。

在Intel和AMD x86_64处理器上,SIMD矢量化寄存器具有特定的融合乘法 - 加法功能,但通用(标量,整数)寄存器不具备 - 您基本上需要相乘,然后添加(除非您可以适应lea) .

这是为什么?我的意思是,它是否无用,以至于不值得开销?



1> Peter Cordes..:

整数乘法很常见,但不是整数常见的事情之一.但是对于浮点数,总是使用乘法和加法,并且FMA 为许多ALU绑定的FP代码提供了主要的加速.

此外,浮点实际上避免了使用FMA的精度损失(x*y内部临时在添加之前根本没有舍入).这就是ISO C99/C++ fma()数学库函数存在的原因,以及为什么在没有硬件FMA支持的情况下实现它的速度很慢.

整数FMA(或乘法累加,又称MAC)与单独的乘法和加法相比没有任何精确的好处.


一些非x86 ISA确实提供整数FMA.它并没有用,但英特尔和AMD都没有费心将它包括在AVX512-IFMA之前(这仍然仅用于SIMD,基本上暴露了双精度FMA/vmulpd整数指令使用所需的52位尾数乘法器电路) .

非x86示例包括:

MIPS32,madd/ maddu(无符号)乘法累加到hi/ lo寄存器(通过常规乘法和除法指令用作目的地的特殊寄存器).

ARMsmlal和朋友(32x32 => 64位MAC,或16x16 => 32位),也可用于无符号整数.操作数是常规的R0..R15通用寄存器.


整数寄存器FMA在x86上很有用,但是具有3个整数输入的uops很少见.CMOV和ADC有3个输入,但其中一个是标志.即便如此,在Haswell为FP FMA添加了3输入uop支持之后,他们还是没有解码到Intel上的单个uop.

Haswell和后来可以跟踪带有3个整数输入的融合域uop,用于(某些)具有索引寻址模式的微融合指令.Sandybridge/Ivybridge非层压指令如add eax, [rdx+rcx].(但Nehalem可以让它们像Haswell一样保持微融合; SnB简化了融合域uop格式).无论如何,这是融合域,而不是调度程序.只有Broadwell/Skylake可以在调度程序中跟踪3输入整数uop,这仅适用于2个整数+标志,而不是3个整数寄存器.

英特尔确实使用"统一"调度程序,其中FP和整数运算使用相同的调度程序,并且它可以跟踪正确的3输入FP FMA.IDK是否存在技术障碍.如果没有,IDK为什么英特尔不包括整数FMA作为BMI2的一部分或其他东西,它增加了诸如mulx(2输入2输出mul,主要是显式操作数,与mul使用的遗产不同rdx:rax).


SSE2/SSSE3 确实有向量寄存器的整数mul-add指令,但只有在加宽16x16 => 32位(SSE2pmaddwd)或(无符号)8x(有符号)8 => 16位(SSSE3pmaddubsw)后才进行水平加法.

但这些只是2输入指令,所以尽管有乘法和加法,但它与FMA非常不同.


脚注:问题标题最初表示没有FMA"for scalars".标量FP FMA具有相同的FMA3扩展,添加了这些的打包版本: VFMADD231SD并且朋友以标量双精度操作,并且相同风格的vfmaddXXXss可用于XMM寄存器中的标量浮点数.


推荐阅读
  • 本文详细介绍了如何在本地环境中安装配置Frida及其服务器组件,以及如何通过Frida进行基本的应用程序动态分析,包括获取应用版本和加载的类信息。 ... [详细]
  • TunnelWarfareTimeLimit:1000MS MemoryLimit:131072KTotalSubmissions:7307 ... [详细]
  • 正在学习操作系统开发,遇到一个内核在GRUB Legacy(0.97)中无法成功引导的问题。具体表现为输入内核命令后显示错误信息,尝试引导时GRUB挂起。 ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • 本文旨在探讨Linux系统中两种重要的进程间通信(IPC)机制——System V和POSIX的标准及其特性,为开发者提供深入的理解。 ... [详细]
  • 本文作者分享了在某大型IToIP解决方案提供商参与多个项目开发的经验与感悟,特别是在软件工程方法论上的思考,提出了对现有开发模式的见解及改进建议。 ... [详细]
  • 电子与正电子的相互作用
    本文探讨了电子与正电子之间的基本物理特性及其在现代物理学中的应用,包括它们的产生、湮灭过程以及在粒子加速器和宇宙射线中的表现。 ... [详细]
  • 第三周课堂测试1、使用汇编语言编写指令时,用一些简单的容易记忆的符号来代替二进制指令,比机器语言更为方便,属于高级语言。(B ... [详细]
  • 本文探讨了如何利用伸展树(Splay Tree)来高效地处理区间操作,包括区间修改、查询和删除等。通过引入size域,伸展树能够灵活应对序列结构的变化。 ... [详细]
  • DropBlock:一种卷积网络的正则化技术
    本文详细探讨了DropBlock这一正则化方法在卷积神经网络中的应用与效果。通过结构化的dropout方式,即在特征图中连续区域内的单元同时被丢弃,DropBlock有效解决了传统dropout在卷积层应用时效果不佳的问题。更多理论分析及其实现细节可参考原文链接。 ... [详细]
  • 本文介绍了一种算法,用于在一个给定的二叉树中找到一个节点,该节点的子树包含最大数量的值小于该节点的节点。如果存在多个符合条件的节点,可以选择任意一个。 ... [详细]
  • 计算机视觉初学者指南:如何顺利入门
    本文旨在为计算机视觉领域的初学者提供一套全面的入门指南,涵盖基础知识、技术工具、学习资源等方面,帮助读者快速掌握计算机视觉的核心概念和技术。 ... [详细]
  • 本文深入探讨了分布式文件系统的核心概念及其在现代数据存储解决方案中的应用,特别是针对大规模数据处理的需求。文章不仅介绍了多种流行的分布式文件系统和NoSQL数据库,还提供了选择合适系统的指导原则。 ... [详细]
  • 尤洋:夸父AI系统——大规模并行训练的深度学习解决方案
    自从AlexNet等模型在计算机视觉领域取得突破以来,深度学习技术迅速发展。近年来,随着BERT等大型模型的广泛应用,AI模型的规模持续扩大,对硬件提出了更高的要求。本文介绍了新加坡国立大学尤洋教授团队开发的夸父AI系统,旨在解决大规模模型训练中的并行计算挑战。 ... [详细]
  • 本文介绍了进程的基本概念及其在操作系统中的重要性,探讨了进程与程序的区别,以及如何通过多进程实现并发和并行。文章还详细讲解了Python中的multiprocessing模块,包括Process类的使用方法、进程间的同步与异步调用、阻塞与非阻塞操作,并通过实例演示了进程池的应用。 ... [详细]
author-avatar
桃花源主ITXB
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有