假设我有两个向量,由两个double
类型的数组表示,每个数组的大小为2。我想增加相应的职位。假设向量i0
和i1
,我想把i0[0] + i1[0]
和i0[1] + i1[1]
相加。
因为类型是double
,我需要两个寄存器。诀窍是将i0[0]
和i1[0]
,以及i0[1]
和i1[1]
放在另一个寄存器中,然后将寄存器本身添加进去。
我的问题是,如果我调用_mm_load_ps(i0[0])
,然后调用_mm_load_ps(i1[0])
,这会将它们分别放置在低64位和高64位中,还是会用第二个load
替换寄存器?如何将两个double放在同一个寄存器中,以便在之后调用add_ps
?
2条答案
按热度按时间mf98qq941#
我想你想要的是这个
当执行
_mm_load_pd
时,它将第一个double值放入寄存器的低64位,第二个放入寄存器的高64位。因此,在上面的加载之后,x1
保存两个double
值i0[0]
和i0[1]
(x2
也类似)。对_mm_add_pd
的调用垂直地添加了x1
和x2
中的相应元素,因此在添加之后,sum
在其低64位中保存i0[0] + i1[0]
,在其高64位中保存i0[1] + i1[1]
。**编辑:**我应该指出,使用
_mm_load_pd
而不是_mm_load_ps
没有任何好处。正如函数名所示,pd
类型显式加载两个压缩双精度型,ps
版本加载四个压缩单精度浮点型。由于这些都是纯粹的逐位内存移动,并且它们都使用SSE浮点单元,因此使用_mm_load_ps
加载double
数据不会有任何损失。_mm_load_ps
的优点:其指令编码比_mm_load_pd
短一个字节,因此从指令高速缓存感测(以及潜在的指令解码;我不是现代x86处理器所有复杂性的Maven)。上面使用_mm_load_ps
的代码看起来像这样:造型没有暗示任何功能;它只是让编译器将SSE寄存器的内容重新解释为保存双精度数而不是浮点数,以便它可以传递到双精度算术函数
_mm_add_pd
中。k3bvogb12#
_ps
前缀是 “packed single” 的缩写,意味着它用于单精度浮点,而不是双精度浮点。你需要
_mm_load_pd()
。这个函数接受一个16字节对齐的指针,指向一个由两个double
组成的数组的第一个成员,并加载它们。你可以这样使用它: