Meh*_*dad 16 c x86 sse intel simd
以下两行有什么区别?
__m128 x = _mm_load_ps((float *) ptr);
__m128 y = _mm_load_pd((double *)ptr);
Run Code Online (Sandbox Code Playgroud)
换句话说,为什么有这么多不同的_mm_load_xyz指令,而不是通用的__m128 _mm_load(const void *)?
Ste*_*non 15
有不同的内在因素,因为它们对应不同的指令.
有不同的加载指令,因为英特尔希望保持设计处理器的自由度,在该处理器上,双精度向量由不同的物理寄存器文件支持,而不是单精度向量或整数向量,或者使用不同的执行单元.如果没有办法指定应将数据加载到适当的寄存器文件或转发网络中,则任何这些都可能会增加额外的延迟.
考虑它的一种方法是不同的指令执行"相同的事情",但另外提供处理器的提示,告诉它未来的指令将如何使用正在加载的数据.这可以帮助处理器确保数据在正确的位置以尽可能有效地使用,或者处理器可以忽略它.
请注意,这不仅仅是一个假设.存在使用整数向量加载(MOVDQA)来加载浮点运算所消耗的数据的处理器比使用浮点加载来获取浮点运算的数据需要更多的时间(反之亦然) .有关该主题的更多详细信息,请参阅"Intel优化手册"或"Agner Fog"的说明.使用与您将如何使用数据相匹配的负载,以避免将来出现此类性能危险.
_mm_load_ps加载 4 个单精度浮点值
_mm_load_pd加载 2 个双精度浮点值
它们做不同的事情,所以我认为具有不同的功能是有意义的。另外,在 C 语言中,不存在重载。