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

128位到512位寄存器用于什么?

如何解决《128位到512位寄存器用于什么?》经验,为你挑选了1个好方法。

在查看x86/x64架构中的寄存器表之后,我注意到有128,256和512位寄存器的整个部分,我从未见过它们用于汇编或反编译的C/C++代码: XMM(0-15)表示128,YMM(0-15)表示256,ZMM(0-31)512.

做了一些挖后我所收集的是,你必须使用2个64位操作,以一个128位的数字进行的,而不是使用通用的数学,add,sub,mul,div操作.如果是这种情况,那么具有这些扩展寄存器集的用途究竟是什么,是否有任何汇编操作可以用来操作它们?



1> phuclv..:

那些用于

浮点运算

一次对多个数据进行操作

您必须使用2个64位操作才能在128位数上执行数学运算

不,它们不是为了这个目的,你不能轻易地将它们用于128位数字.使用仅2条指令添加128位数字要快得多:add rax, rbx; adc rdx, rcx如果处理XMM寄存器,则代替大量指令.看到

实用的BigNum AVX/SSE可能吗?

是否可以使用SSE(v2)来生成128位宽的整数?


关于它们的用法,首先它们用于标量浮点运算.所以,如果你有floatdoubleC或C++那么他们最有可能被存储在XMM寄存器的低位部分和操纵在结束指令ss(标量单)或sd(标双)

事实上,还有另外一组8个80位ST(x)寄存器可用于x87协处理器,用于进行浮点数学运算.然而,它们很慢而且不太可预测.慢,因为默认情况下操作以更高的精度完成,这本身就需要更多的工作,并且还需要存储然后加载以在必要时舍入到更低的精度.不可预测也是因为精度高.起初可能会感到奇怪,但很容易解释,例如某些操作溢出或下溢floatdouble精确,但long double不精确.这会在32位和64位构建1中导致许多错误或意外结果

这是两组寄存器的浮点示例

// f = x/z + y*z
x87:
        fld     dword ptr [esp + 12]
        fld     st(0)
        fdivr   dword ptr [esp + 4]
        fxch    st(1)
        fmul    dword ptr [esp + 8]
        faddp   st(1)
        ret
SSE:
        divss   xmm0, xmm2
        mulss   xmm1, xmm2
        addss   xmm0, xmm1
        ret
AVX:
        vdivss  xmm0, xmm0, xmm2
        vmulss  xmm1, xmm1, xmm2
        vaddss  xmm0, xmm0, xmm1
        ret

向更快和更一致的SSE寄存器的迁移是MSVC中不再提供80位扩展精度类型的原因之一long double


然后,英特尔为SIMD操作引入了MMX指令集,该指令集使用与新名称相同的寄存器.MMX可能代表多数学扩展矩阵数学扩展,但恕我直言,它最有可能或多媒体扩展,因为多媒体和互联网在当时越来越重要.在多媒体解决方案中,您经常需要对每个像素,纹素,声音样本执行相同的操作......就像这些一样ST(x)MMX

for (int i = 0; i <100000; ++i)
{
   A[i] = B[i] + C[i];
   D[i] = E[i] * F[i];
}

我们可以通过一次执行多个元素来加速,而不是分别对每个元素进行操作.这就是人们发明SIMD的原因.使用MMX,您可以一次增加8个像素通道的亮度,或者增加四个16位声音样本的音量...单个元素上的操作称为标量,完整寄存器称为矢量,它是一组标量值

由于MMX的缺点(如ST寄存器的重用或缺乏浮点支持),当扩展SIMD指令集与流式SIMD扩展(SSE)时,英特尔决定给它们一组全新的名为XMM 的寄存器,这是两次更长(128位),所以现在我们可以一次操作16个字节.它还支持一次多个浮点运算.然后英特尔将XMM延长到高级矢量扩展(AVX)中的256位YMM ,并在AVX-512中再次将长度加倍(这次它在64位模式下也将寄存器数量增加到32).现在,您可以在工作16个32位整数,在一个时间

从上面您可以理解这些寄存器的第二个也是最重要的作用:使用单个指令并行处理多个数据.例如,在SSE4中,引入了一组处理C字符串的指令.现在你可以通过一次检查多个字节来计算字符串长度,查找子字符串...更快.您还可以更快地复制或比较内存.现代memcpy实现一次移动16个,32个或64个字节,具体取决于最大的寄存器宽度,而不是像最简单的C解决方案那样逐个移动.

不幸的是,编译器仍然不善于将标量代码转换为并行代码,因此大多数时候我们必须帮助它们,尽管自动矢量化仍然变得更好更智能

自动矢量化

自动并行化和自动矢量化

由于SIMD的重要性,现在几乎所有高性能架构都有自己的SIMD版本,如PowerPC 上的Altivec或ARM 上的Neon.


1一些例子:

SSE浮点运算是否可重复?

x87中的扩展(80位)双浮点,而不是SSE2 - 我们不会错过它?

acos(double)在x64和x32 ​​Visual Studio上给出不同的结果

为什么相同的代码会在32位与64位计算机上产生不同的数字结果?

x86和x64之间的浮点算术的差异

std :: pow在32位和64位应用程序中产生不同的结果

为什么Math.Exp在32位和64位之间给出不同的结果,具有相同的输入,相同的硬件


推荐阅读
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
  • 线程漫谈——线程基础
    本系列意在记录Windwos线程的相关知识点,包括线程基础、线程调度、线程同步、TLS、线程池等。进程与线程理解线程是至关重要的,每个进程至少有一个线程,进程是线程的容器,线程才是真正的执行体,线程必 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 本文介绍了使用Rust语言编写、保存和编译程序的简单步骤。首先,打开记事本文件并编写程序代码,然后将代码保存到一个以.rs为扩展名的文件中。接下来,使用rustc命令来编译运行程序。最后,通过命令行运行编译后的程序,得到输出结果。如果遇到编译错误,可以下载Build Tools for Visual Studio 2017来解决。 ... [详细]
  • Introduction(简介)Forbeingapowerfulobject-orientedprogramminglanguage,Cisuseda ... [详细]
  • vb.net不用多线程如何同时运行两个过程?不用多线程?即使用多线程,也不会是“同时”执行,题主只要略懂一些计算机编译原理就能明白了。不用多线程更不可能让两个过程同步执行了。不过可 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
author-avatar
流浪1种无奈
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有