2

I'm not exactly sure what happens when I call _mm_load_ps? I mean I know I load an array of 4 floats into a __m128, which I can use to do SIMD accelerated arithmetic and then store them back, but isn't this __m128 data type still on the stack? I mean obviously there aren't enough registers for arbitrary amounts of vectors to be loaded in. So these 128 bits of data are moved back and forth each time you use some SIMD instruction to make computations? If so, than what is the point of _mm_load_ps?

Maybe I have it all wrong?

4

2 回答 2

8

就像int变量可能驻留在寄存器或内存中(甚至两者,在不同时间)一样,SSE 变量也是如此,例如__m128. 如果有足够的空闲 XMM 寄存器,那么编译器通常会尝试将变量保存在寄存器中(除非你做了一些无用的事情,比如获取变量的地址),但是如果寄存器压力太大,那么一些变量可能会溢出到记忆。

于 2013-10-29T23:20:04.373 回答
4

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

就像如果你有很多int或标量float变量并且编译器不能将它们所有当前“活动”的变量保存在寄存器中 - 加载/存储内在函数主要只是为了告诉编译器对齐,并作为指针的替代 -转换为其他 C 数据类型。不是因为它们必须编译为实际的加载或存储,或者这些是编译器发出向量加载或存储指令的唯一方法。


带 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 服务器、Ice Lake 笔记本电脑、?? 台式机)

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

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

(当然,如果您告诉编译器允许使用 AVX-512 指令,编译器只能使用 x/y/zmm16..31。拥有支持 AVX-512 的 CPU 在运行已编译的机器代码时没有好处只有 AVX2 的 CPU。)

于 2013-10-30T08:36:48.290 回答