包装和拆包SSE/SSE2指令的数据?

Joh*_*ing 2 c++ sse sse2

我想了解SSE/SSE2如何工作的更多信息:我知道SSE/SSE2使用mmx寄存器,大小为128位(16字节),通常这些寄存器有4个浮点单元,我可以通过打包存储我的浮点数.在得到结果之前,我应该"打开它们".

我的问题是:因为我是菜鸟,为什么要将这些值打包到xmm寄存器中,为什么要解压它们呢?这有什么好处?

Mat*_*son 6

您无需打包/打开包装.如果数字格式正确,则只需使用合适的移动指令将它们加载到寄存器或内存操作数中,以便将内存内容用作add,substract等的第二个操作数.

有时候会发生的事情是,数据并没有从计算到最后需要去的地方,这就是各种打包和解压缩指令派上用场的地方.

比如说你正在做一些3D图形数学

struct coord { float X, Y, Z, W; };
Run Code Online (Sandbox Code Playgroud)

但是,为了使计算效率,我们在一次加载这些结构的四根,用X从一个寄存器所有四个,Y所有四个另一个寄存器,等等.现在,经过我们,例如,乘以所有X,Y,ZW值[ 4在时间]与变换矩阵缩放/旋转对象,我们需要将其存储回为X,Y,Z和W再次,这是由"拆包"适当的元件回做成其相应的X,Y,Z,W个人条目.

当然,如果不是有数组coord值,你存储的四个阵列X,Y,ZW值,我们可以只存储新的值到各自的插槽数组中没有压缩/解压缩的值.