数据何时在SSE寄存器和堆栈之间移动?

时间:2013-10-29 23:09:11

标签: c++ cpu simd cpu-registers

我不确定当我调用_mm_load_ps时会发生什么?我的意思是我知道我将一个4个浮点数组加载到__m128中,我可以用它来进行SIMD加速算法然后将它们存回,但不是这个__m128数据类型仍然在堆栈上?我的意思是显然没有足够的寄存器来加载任意数量的向量。所以这些128位数据在每次使用某些SIMD指令进行计算时来回移动?如果是这样,那么_mm_load_ps是什么意思?

也许我错了?

2 个答案:

答案 0 :(得分:7)

int变量可能驻留在寄存器或内存中(或者甚至两者中,在不同时间)的方式相同,SSE变量(例如__m128)也是如此。如果有足够的自由XMM寄存器,那么编译器通常会尝试将变量保存在寄存器中(除非你做了一些无用的操作,比如获取变量的地址),但是如果注册压力太大,那么一些变量可能溢出到内存。

答案 1 :(得分:3)

带有SSE,AVX或AVX-512的英特尔处理器可以有8到32个SIMD寄存器(见下文)。寄存器的数量还取决于它是32位代码还是64位代码。因此,当您调用_mm_load_ps时,值将加载到SIMD寄存器中。如果使用了所有寄存器,则必须将一些寄存器压入堆栈。

带SSE的处理器

8  128-bit registers labeled XMM0 - XMM7  //32-bit operating mode
16 128-bit registers labeled XMM0 - XMM15 //64-bit operating mode

使用AVX / AVX2的处理器

8  256-bit registers labeled YMM0 - YMM7  //32-bit operating mode
16 256 bit registers labeled YMM0 - YMM15 //64-bt operating mode

AVX-512处理器(2015/2016)

//32-bit operating mode?
32 512-bit registers labeled ZMM0 - ZMM31 //64-bit operating mode

维基百科对此AVX-512有一个很好的总结。