- 浏览: 137629 次
文章分类
最新评论
上一节介绍了浮点数与各种数值类型之间的相互转换所用到的指令,本节则介绍进行各种浮点运算所需的指令。
先来看看下面一组用于执行算术运算的标量 AVX2 浮点指令。
其中,每条指令有一个或两个源操作数 S1、S2,以及一个目的操作数 D。第一个源操作数 S1 可以是一个 XMM 寄存器或一个内存位置,而第二个源操作数和目的操作数都必须是 XMM 寄存器。每个操作都有一条针对单精度和一条双精度的指令。结果都存放在目的寄存器中。
考虑下面的浮点 C 函数。
其对应的 x86-64 代码类似如下。
不同于整数操作,AVX 浮点操作不能以立即数值作为操作数。相反,编译器必须为所有的常量值分配和初始化存储空间,然后再把这些值从内存读入。下面这个从摄氏度到华氏度转换的函数说明了这个问题。
在采用小端字节顺序的机器上生成的 x86-64 汇编代码类似如下。
可以看到,值 1.8 是从标号为“.LC2”内存位置处读出,值 32.0 是从标号“.LC3”内存位置处读出。而这些标号对应的值,每一个都是通过一对“.long”声明和十进制表示的值指定的。要理解这些数所表示的浮点值,需要知道浮点数在系统底层的表示方法,具体可以参考《深入理解计算机系统》第二章——信息的表示和处理,碍于篇幅限制,这里只给出结论。以标号“.LC2”的两个数值为例,因为机器采用的是小端字节顺序,所以第一个值 3435973837(0xcccccccd)给出的是低位 4 字节,第二个值 1073532108(0x3ffccccc)给出的是高位 4 字节。从高位字节抽取指数字段为 0x3ff(1023),减去偏置值 1023 得到指数 0,将两个值的小数位连接起来,得到小数字段 0xccccccccccccd,二进制小数表示为 0.8,加上隐含的 1 就得到 1.8。
除了进行普通运算操作,GCC 生成的代码还可以在 XMM 寄存器上执行位级操作。下图所示的指令会对一个 XMM 寄存器中的所有 128 位进行位操作,不过同前面一样,我们一般只关心目的寄存器的低 4 或 8 字节。
另外,AVX2 还提供了两条用于比较浮点数值的指令。
这里的操作数 S2 必须在 XMM 寄存器中,而 S1 还可以在内存中。这两条指令类似于 CMP 指令,也是通过设置条件码来指示它们的相对值。浮点比较指令会设置三个条件码:零标志位 ZF、进位标志位 CF 和奇偶标志位 PF。PF 标志位在 GCC 产生的 x86 代码中不太常见,对于整数操作,当最近的一次算术或逻辑运算产生的值的最低位字节是偶校验的(即这个字节中有偶数个 1),那么就会设置这个标志位。而对于浮点数,当两个操作数中任一个是 NaN 时,就会设置该位。这个标志位就是用来发现是否有参数为 NaN 的情况,因为当 x 为 NaN 时,比较 x==x 都会得到 0,表示比较失败。
条件码的设置条件如下。
当任一操作数为 NaN 时,就会出现图中无序的情况。通常 jp(jump on parity) 指令是条件跳转,条件就是浮点比较得到一个无序的结果。进位和零标志位的使用同整数的一样,这里不再赘述。
参考书籍:
1、《深入理解计算机系统》第三章——程序的机器级表示。
先来看看下面一组用于执行算术运算的标量 AVX2 浮点指令。
其中,每条指令有一个或两个源操作数 S1、S2,以及一个目的操作数 D。第一个源操作数 S1 可以是一个 XMM 寄存器或一个内存位置,而第二个源操作数和目的操作数都必须是 XMM 寄存器。每个操作都有一条针对单精度和一条双精度的指令。结果都存放在目的寄存器中。
考虑下面的浮点 C 函数。
double funct(double a, float x, double b, int i){ return a*x - b/i; }
其对应的 x86-64 代码类似如下。
; double funct(double a, float x, double b, int i); ; a in %xmm0, x in %xmm1, b in %xmm2, i in %edi funct: ; The following two instructions convert x to double vunpcklps %xmm1, %xmm1, %xmm1 vcvtps2pd %xmm1, %xmm1 vmulsd %xmm0, %xmm1, %xmm0 ; Multiply a by x vcvtsi2sd %edi, %xmm1, %xmm1 ; Convert i to double vdivsd %xmm1, %xmm2, %xmm2 ; Compute b/i vsubsd %xmm2, %xmm0, %xmm0 ; Subtract from a*x ret ; Return
不同于整数操作,AVX 浮点操作不能以立即数值作为操作数。相反,编译器必须为所有的常量值分配和初始化存储空间,然后再把这些值从内存读入。下面这个从摄氏度到华氏度转换的函数说明了这个问题。
double cel2fahr(double temp){ return 1.8 * temp + 32.0; }
在采用小端字节顺序的机器上生成的 x86-64 汇编代码类似如下。
; double cel2fahr(double temp) ; temp in %xmm0 cel2fahr: vmulsd .LC2(%rip), %xmm0, %xmm0 ; Multiply by 1.8 vaddsd .LC3(%rip), %xmm0, %xmm0 ; Add 32.0 ret .LC2: .long 3435973837 ; Low-order 4 bytes of 1.8 .long 1073532108 ; High-order 4 bytes of 1.8 .LC3: .long 0 ; Low-order 4 bytes of 32.0 .long 1077936128 ; High-order 4 bytes of 32.0
可以看到,值 1.8 是从标号为“.LC2”内存位置处读出,值 32.0 是从标号“.LC3”内存位置处读出。而这些标号对应的值,每一个都是通过一对“.long”声明和十进制表示的值指定的。要理解这些数所表示的浮点值,需要知道浮点数在系统底层的表示方法,具体可以参考《深入理解计算机系统》第二章——信息的表示和处理,碍于篇幅限制,这里只给出结论。以标号“.LC2”的两个数值为例,因为机器采用的是小端字节顺序,所以第一个值 3435973837(0xcccccccd)给出的是低位 4 字节,第二个值 1073532108(0x3ffccccc)给出的是高位 4 字节。从高位字节抽取指数字段为 0x3ff(1023),减去偏置值 1023 得到指数 0,将两个值的小数位连接起来,得到小数字段 0xccccccccccccd,二进制小数表示为 0.8,加上隐含的 1 就得到 1.8。
除了进行普通运算操作,GCC 生成的代码还可以在 XMM 寄存器上执行位级操作。下图所示的指令会对一个 XMM 寄存器中的所有 128 位进行位操作,不过同前面一样,我们一般只关心目的寄存器的低 4 或 8 字节。
另外,AVX2 还提供了两条用于比较浮点数值的指令。
这里的操作数 S2 必须在 XMM 寄存器中,而 S1 还可以在内存中。这两条指令类似于 CMP 指令,也是通过设置条件码来指示它们的相对值。浮点比较指令会设置三个条件码:零标志位 ZF、进位标志位 CF 和奇偶标志位 PF。PF 标志位在 GCC 产生的 x86 代码中不太常见,对于整数操作,当最近的一次算术或逻辑运算产生的值的最低位字节是偶校验的(即这个字节中有偶数个 1),那么就会设置这个标志位。而对于浮点数,当两个操作数中任一个是 NaN 时,就会设置该位。这个标志位就是用来发现是否有参数为 NaN 的情况,因为当 x 为 NaN 时,比较 x==x 都会得到 0,表示比较失败。
条件码的设置条件如下。
当任一操作数为 NaN 时,就会出现图中无序的情况。通常 jp(jump on parity) 指令是条件跳转,条件就是浮点比较得到一个无序的结果。进位和零标志位的使用同整数的一样,这里不再赘述。
参考书籍:
1、《深入理解计算机系统》第三章——程序的机器级表示。
发表评论
-
浮点数类型转换指令
2019-05-15 22:37 1659在浮点寄存 ... -
浮点寄存器概述
2019-05-14 22:31 2495本文介绍的浮点寄存器是基于 AVX2(Adva ... -
汇编指令之跳转指令
2019-04-15 00:21 4674正常执行的情况下,指令会按照顺序一条条地执行, ... -
汇编指令之条件码
2019-04-08 21:05 2309在系统底层,除了整数寄存器,CPU 还维护着一 ... -
汇编指令之算术和逻辑操作指令
2019-03-28 22:16 1274下表是 x86-64 ... -
汇编指令之数据传送指令
2019-03-25 21:28 1257在x86-64 中的 ... -
x86-64 中的寄存器与汇编操作数杂述
2019-03-20 21:45 962Intel 中常用 ... -
hello 程序执行背后的故事
2018-12-26 21:48 590源文件 hello. ... -
linux启动服务概述
2017-04-08 02:43 388传统的linux中定义了七个运行级,分别如下: ... -
unix限制
2017-04-04 16:08 561UNIX系统实现定义了很多幻数和常量,其中有很 ... -
linux引导加载程序--GRUB
2017-04-04 04:22 612linux世界里有两种 ... -
存储器映射
2016-06-13 00:12 539注:本文摘自《深入理解计算机操作系统》第九章--虚拟存 ... -
虚拟存储器对存储器管理的作用
2016-06-10 16:00 681注:本文中的大部分内容均是摘录自《深入理解计算机系统》一书,权 ... -
信号处理问题
2016-06-03 08:31 550注:本文摘自《深入理解计算机系统》第8章 --- 异常控制流。 ... -
僵尸进程
2016-05-23 23:57 350在解释僵尸进程的概念之前,我们得先了解这样的一个事实: 一个进 ... -
程序优化之存储器别名使用
2016-05-20 08:55 782说明:本文示例摘自《深入理解计算机系统》第五章----优化程序 ... -
条件变量基本概念与原理(转载)
2016-05-20 08:54 1544对于条件变量,我一直感到很困惑,搞不清其与互斥锁到底有啥区别, ... -
CPU与磁盘的交互过程
2016-05-19 09:05 1813对于计算机系统底层技术,想必很多人都和我一样不太了解,最近在学 ... -
存储器层次结构中基本的缓存原理
2016-05-19 09:00 650对于操作系统,我们知道,越靠近CPU的存储器,其存储速度就会越 ... -
异常处理
2016-05-19 00:29 410我知道很多人都知道异常处理,但可能对其底层并不太了解,现在我们 ...
相关推荐
2023-04-06-项目笔记-第二百六十一阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.259局变量的作用域_259- 2024-09-19
项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
本文阐述了人工智能在数据中心节能应用领域的理论与实践,通过介绍机器学习和基于物理机理模型的人工智能节能技术的应用情况,展示了如何利用AI技术来提升数据中心能源效率,减少PUE。并指出基于大数据分析的智能运维方法能优化数据中心冷却系统的运行状态,从而达成绿色节能目的;同时也强调了未来的节能系统发展趋势及标准化推进措施等重要方向。 适用人群:数据中心管理人员,环保工作者,信息和通信技术行业的专业人士。 使用场景及目标:适用于那些希望利用AI和其他技术优化其数据中心效能的企业;通过技术手段达到减少能耗、提升工作效率的目的。 其他:随着全球对环境友好技术的关注增加,在数据中心的建设和运维过程中融合AI等新技术已经成为必然趋势。
基于java的网上球鞋竞拍系统设计与实现.docx
【c语言入门】 静态库、动态链接库、include、makefile、io、文件操作函数、管道原理及应用、简单的数据结构
基于java中药分类管理系统设计与实现.docx
内容概要:文中针对大斜视SAR系统在动目标成像上遇到的各种问题,包括聚焦难、几何变形和交叉副瓣高等挑战,采用了一个融合了频谱旋转和稀疏化增强处理方式的新颖算法——频谱旋转ωk算法,进行了详细讨论并提供了一套完整解决方案。 适用人群:该研究对于SAR技术研究专家、学者、工程师有着特别的实际意义与价值。 使用场景及目标:本成果可应用于斜视角达到甚至超过七十度的高斜度SAR动目标成像系统中,提升动目标检测、定位、识别等能力。具体应用场景涵盖了战场态势监测、交通流量监管等多个领域。 本文通过详细的理论建模及仿真实验结果论证算法的有效可行性;此外,文中提及了未来在更高动态环境下SAR成像领域的扩展可能性。
基于java的新闻发布系统设计与实现.docx
基于java的应急资源管理系统设计与实现.docx
基于java的斗车交易系统设计与实现.docx
主要内容:文章探讨了随着6G通讯技术发展,将通感一体化应用于车联网的可能性及其带来的显著效果,尤其是在辅助自动驾驶、多车合作感知与控制、车路通感融合发展中的应用。通过阐述各方面的技术框架和细节(如波束管理和智能反射面技术),文中指出了车联网系统在实现高效率、安全性以及智能化管理上的关键突破。同时强调在实施中遇到诸如频带分配、信号混迭、硬件整合等现实挑战,并提出了未来发展方向。 适用人群:研究人员和开发人员,特别是从事车联网和新一代通讯技术支持的专业人士。 使用场景及目标:适用于车联网的研究和开发,目的是构建高效的交通通信系统,在实际使用中促进自动驾驶、智能交通管理系统等新技术落地,提高道路通行的安全性和效率。 相关背景与建议:本文对通感一体化的技术介绍深入浅出,并讨论了一系列技术前沿,包括智能反射技术的最新成果。阅读者应掌握一定的无线通讯基础知识,并能理解技术理论在工程实践里的潜在机遇与难题。
均包含代码,文章,部分项目包含ppt
均包含代码,文章,部分项目包含ppt
2019李宁跑步自媒体年度内容运营方案.pptx
基于java的中国咖啡文化宣传网站的设计与实现.docx
基于java的学生考勤管理设计与实现.docx
安卓开发:探索移动应用的无限可能
34521945-b0e9-461e-8b69-6436502dee5b-1.zip
完整的项目源码(注意更换自己的数据库名,并且字段设置要一样)
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。