SIMD

来源:互联网 发布:超人软件官网 编辑:程序博客网 时间:2024/05/23 21:19

Single Instruction Multiple Data,单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集

SIMD在性能上的优势:

编辑
以加法指令为例,单指令单数据(SISD)的CPU对加法指令译码后,执行部件先访问内存,取得第一个操作数;之后再一次访问内存,取得第二个操作数;随后才能进行求和运算。而在SIMD型的CPU中,指令译码后几个执行部件同时访问内存,一次性获得所有操作数进行运算。这个特点使SIMD特别适合于多媒体应用等数据密集型运算。
如:AMD公司引以为豪的3D NOW! 技术实质就是SIMD,这使K6-2、雷鸟、毒龙处理器在音频解码、视频回放、3D游戏等应用中显示出优异的性能。

在大型机上使用SIMD指令集

编辑
使用Z13矢量扩展工具中的SIMD指令集加速社交媒体和大数据工作负载处理。
IBM的z13处理器通过更大容量的缓存,同时多线程,大页面帧,指令流水线管理和单指令多数据,增加高性能大型机服务器的计算能力。
Z13被设计成为大型机提供移动计算能力。并且处理器通过z13矢量扩展设备,回归单指令多数据(SIMD)。
SIMD矢量指令能够加速如C和Java语言的处理。矢量指令对多个数据元素进行并行操作,从而使主机能够快速处理大量数据。这对于社交媒体和大数据工作负载来说是个福音,但对面临普通负载的系统程序员来说似乎没有太大的帮助。
SIMD指令通过多种方式增加吞吐量。大多数机器指令会的结果会覆盖输入操作数其中之一不同,大部分SIMD指令集会使用两个输入寄存器,并将结果存储在第三个寄存器。这意味着程序员可以节省与寄存器纠结的时间。
矢量寄存器为128字节长度。前16个寄存器实际上与64位浮点寄存器(FPRs)共存。改变一个FPR同样会破坏对应矢量寄存器的所有字节。存在一些关于通过程序调用保护矢量寄存器的特殊规则,IBM的Assembler Services Guide有详细说明。
SIMD向量指令包括所有数学函数和浮点模式。同样也有字符串操作以及用于获取和存储数据的方法。
矢量寄存器内容由1、2、4、8或16字节元素组成。矢量指令掩膜指定需要被操纵原件的尺寸。所有矢量指令助记符从V开始,虽然IBM同样还为特定的元素大小提供了额外的记忆空间,具体可以查阅z13 Principles of Operation手册低21章24节。

SIMD指令如何工作

加载矢量寄存器的命令看起来很熟悉:
VL V1, D2(X2,B2)
其中V1是矢量寄存器,D2是位移,X2和B2为索引与基地址寄存器。
但是,由于矢量寄存器的内容有元素组成,还有指令可以与他们单独打交道。例子之一就是Vector Load Element指令,可以更新一个元素:
VLEx V1,D2(X2,B2)M3
其中x指定元素的大小,B为字节,H为半字(16位),F为全字以及G为双字。V1、D2、 X2 与 B2操作数扮演熟悉的角色,但M3的掩膜指定字段的索引并更新。因此VLEH V1,HALFWORD,3会更新矢量寄存器1的第四个半字,并保持其他元素不变。
在常规负载下,SIMD向量负载指令集有多种方法来产生掩膜,从通用寄存器插入元素并从一种矢量包装元素到寄存器。这与十进制不大一样——这种能力能减半元素并将其压缩到另一个寄存器。

Vector register examples

假设我们已经加载了两个矢量寄存器,每个寄存器有8个半字整数,我们可以将所有元素合在一起,用一条矢量添加指令:
VA V1,V2,V3,M4
本例中,处理器把V2和V3中的半字元素相加并保存在V1中,这样体现了SIMD指令的非破坏自然属性。掩膜值应该与半字相同。处理器会将溢出移动到整数符号位,这样可以使计算有点棘手。
矢量指令同样也支持字符串函数。只要掌握几个复杂选项,SIMD字符串功能就能变得更简单一些,你可以把他们作为硬件实现C语言字符串处理函数。让我们以Vector Find Element Equal为例:
VFEE V1,V2,V3,M4[,M5]
在高级别上,该指令会比较V2与V3中的元素,并在V1设置相应的标识。掩膜M4表示元素的大小,M5指定两件事:设置位2告诉处理器比较V2、V3和0。当位4等于1,处理器将会设置条件码。在任何速率下,指令会从左往右比较第二个和第三个操作数元素。当它发现相等的元素,就会在第一个操作数的第七字节设置元素字节索引。如果没有元素相等,第一个操作数的第七字节将包含一个与寄存器元素数量相等的字节索引。如果指令发现所有元素都为零,也会进行同样的操作。[1] 

在大型机上使用SIMD指令集

编辑
使用Z13矢量扩展工具中的SIMD指令集加速社交媒体和大数据工作负载处理。
IBM的z13处理器通过更大容量的缓存,同时多线程,大页面帧,指令流水线管理和单指令多数据,增加高性能大型机服务器的计算能力。
Z13被设计成为大型机提供移动计算能力。并且处理器通过z13矢量扩展设备,回归单指令多数据(SIMD)。
SIMD矢量指令能够加速如C和Java语言的处理。矢量指令对多个数据元素进行并行操作,从而使主机能够快速处理大量数据。这对于社交媒体和大数据工作负载来说是个福音,但对面临普通负载的系统程序员来说似乎没有太大的帮助。
SIMD指令通过多种方式增加吞吐量。大多数机器指令会的结果会覆盖输入操作数其中之一不同,大部分SIMD指令集会使用两个输入寄存器,并将结果存储在第三个寄存器。这意味着程序员可以节省与寄存器纠结的时间。
矢量寄存器为128字节长度。前16个寄存器实际上与64位浮点寄存器(FPRs)共存。改变一个FPR同样会破坏对应矢量寄存器的所有字节。存在一些关于通过程序调用保护矢量寄存器的特殊规则,IBM的Assembler Services Guide有详细说明。
SIMD向量指令包括所有数学函数和浮点模式。同样也有字符串操作以及用于获取和存储数据的方法。
矢量寄存器内容由1、2、4、8或16字节元素组成。矢量指令掩膜指定需要被操纵原件的尺寸。所有矢量指令助记符从V开始,虽然IBM同样还为特定的元素大小提供了额外的记忆空间,具体可以查阅z13 Principles of Operation手册低21章24节。

SIMD指令如何工作

加载矢量寄存器的命令看起来很熟悉:
VL V1, D2(X2,B2)
其中V1是矢量寄存器,D2是位移,X2和B2为索引与基地址寄存器。
但是,由于矢量寄存器的内容有元素组成,还有指令可以与他们单独打交道。例子之一就是Vector Load Element指令,可以更新一个元素:
VLEx V1,D2(X2,B2)M3
其中x指定元素的大小,B为字节,H为半字(16位),F为全字以及G为双字。V1、D2、 X2 与 B2操作数扮演熟悉的角色,但M3的掩膜指定字段的索引并更新。因此VLEH V1,HALFWORD,3会更新矢量寄存器1的第四个半字,并保持其他元素不变。
在常规负载下,SIMD向量负载指令集有多种方法来产生掩膜,从通用寄存器插入元素并从一种矢量包装元素到寄存器。这与十进制不大一样——这种能力能减半元素并将其压缩到另一个寄存器。

Vector register examples

假设我们已经加载了两个矢量寄存器,每个寄存器有8个半字整数,我们可以将所有元素合在一起,用一条矢量添加指令:
VA V1,V2,V3,M4
本例中,处理器把V2和V3中的半字元素相加并保存在V1中,这样体现了SIMD指令的非破坏自然属性。掩膜值应该与半字相同。处理器会将溢出移动到整数符号位,这样可以使计算有点棘手。
矢量指令同样也支持字符串函数。只要掌握几个复杂选项,SIMD字符串功能就能变得更简单一些,你可以把他们作为硬件实现C语言字符串处理函数。让我们以Vector Find Element Equal为例:
VFEE V1,V2,V3,M4[,M5]
在高级别上,该指令会比较V2与V3中的元素,并在V1设置相应的标识。掩膜M4表示元素的大小,M5指定两件事:设置位2告诉处理器比较V2、V3和0。当位4等于1,处理器将会设置条件码。在任何速率下,指令会从左往右比较第二个和第三个操作数元素。当它发现相等的元素,就会在第一个操作数的第七字节设置元素字节索引。如果没有元素相等,第一个操作数的第七字节将包含一个与寄存器元素数量相等的字节索引。如果指令发现所有元素都为零,也会进行同样的操作。[1] 

0 0
原创粉丝点击