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