硬科技:浅谈x86的SIMD指令扩张史(中):SSE2到SSE4

如题所述

第1个回答  2022-11-14

前情提要:浅谈x86的SIMD指令扩张史(上)。MMX到SSE有了对应IEEE 754单精确度浮点格式的SSE还是不够,最起码,当时的x86处理器还缺了3个重要的关键点:

64位元双倍浮点精确度。 受制于x86指令的编码,暂存器才少少的8个。 x86的双运算元(A = A + B)格式,会摧毁其中1个暂存器原本的资料(如例子中的A),要保存资料,需事先搬移到其他的暂存器,增加程式码体积,更让第二个问题雪上加霜。

SSE2提供IEEE754 64位元双倍精确度

2001年随着Pentium 4而问世的144个SSE2指令解决了第一个问题,包含了一系列的快取记忆体控制指令,并顺便扩充了MMX,虽然这时候的SSE2已足以完全取代MMX了。

指令数量之所以会激增,也是为了提供更多样化的「花式」资料操作。但也请注意,这些指令集也不是每个指令都会进行SIMD运算。

如果应用程式已经使用80x87的80位元延伸精确度格式,转到SSE2仍会产生数值误差,所以不可能完全废弃这古老的包袱,即使微软的Visual Studio从2012年开始,浮点运算就预设使用SSE2,意思就是微软已经认定那时候的电脑都有SSE2可用了。。

AMD x86-64倍增资料暂存器

某种意义上来说Intel也是因祸得福,当然他们绝对不会这样想。

AMD透过删除INC/DEC指令,挤出空间实作REX prefix,提供在64位元模式新增暂存器的指令编码空间,让x86指令编码中所有可标定暂存器的3位元栏位,都扩展到了4位元,只要指令多出了REX Prefix这1个Byte,64位元x86处理器即可享受到倍增的资料暂存器。不过,程式不一定用到新暂存器,代表REX并非「必备品」,当启动新暂存器时,REX会无预警增加指令长度,提高最佳化指令解码器设计的困难度。

惨剧就发生在Intel Core 2家族(Merom, Penryn)身上,只要是64位元模式,前后相邻的「比较(Compare)/跳跃(Jump)」合而为单一条件运算的「巨集指令融合(Macro Fusion)机制」就自动人间蒸发。

AMD发表x86-64时很多人拍手叫好,但实际上因过度重视对32位元的相容性与最低的硬体修改成本(K8是由K7延伸出来的产物),AMD的扩充手段并不干净俐落,日后也同时造成所有(实质上也就那两家)x86处理器厂商的困扰。

在AMD手上「结束」的SSE

在革命性的AVX出现前,Intel仍持之以恒的扩充SSE指令集,像数值转换、载入长度不同的向量值、如何让资料「对齐」等细节就姑且在此不谈了,重点如下:

SSE3:又称PNI(Prescott New Instructions),追加13个指令,「总算」支援了在AMD 3DNow!已存在的「水平」运算,能对同一个XMM暂存器内的资料进行「横向」处理,不再只能「向下操作」。 SSSE3:TNI(Tejas New Instructions)或MNI(Merom New Instructions) ,SSE3的「补充包」,因为16个新指令都可操作XMM和MMX暂存器,因此在某些文件也被视为「32个指令」。 SSE4.1:Intel在Penryn加入的47个新指令。 SSE4.2:Intel在Nehalem加入的7个新指令。 SSE4a:AMD在原生四核心的K10「Barcelona」选择性支援4个SSE4指令和4个初代SSE指令,后来的推土机家族就很干脆的全部吃下所有的「SSE4」了。

在这里就不得不提AMD抢先在Intel之前注册商标的「SSE5」,AMD用全新的Opcode3与DREX栏位彻底取代REX,实现了x86指令集前所未有的「三运算元格式/四运算元语法」与「乘积累加(Multiply Accumulation,A = A x B + C)」指令,弥补自己年轻时所犯下「成功的错误」,但还好AMD没有硬推SSE5,「皈依」更加简洁有条理的Intel AVX,要不然微软为首的软体厂商们又要抓狂了,科科。

追踪 硬体世界考古探险王 硬科技

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网