这些功能有什么区别吗?如果不是,为什么?
__m128 __mm_set1_ps(float a)
__m128 __mm_set_ps1(float a)
Intel Intrinsics Guide上的两个描述是一样的网站。
谢谢你。
最佳答案
有零差异。 _mm_set1_ps
是惯用的,使用它。
例如clang 的 xmmintrin.h 定义了 set_ps1
在 set1_ps
方面:
static __inline__ __m128 __DEFAULT_FN_ATTRS
_mm_set_ps1(float __w)
{
return _mm_set1_ps(__w);
}
历史猜测
我的猜测是英特尔在 SSE1 的早期还没有确定命名方案,而是切换到
_mm_set1_
键入前进。但如果他们已经记录了 _mm_set_ps1
,他们无法收回。请注意,没有
_mm_set_epi321
或 _mm_set_ep81
(幸运的是)!因此_mm_set1_ps
是惯用的并且遵循与其他广播内在函数相同的模式,而 _mm_set_ps1
是不寻常的,会让人类读者感到惊讶。有_mm_set_pd1
和 _mm_load_pd1
,不过,大概它们是同时引入的(使用 SSE2)。我只知道它,因为前几天我在寻找可以执行严格别名安全广播负载的内在函数时偶然发现了它,就像您可以使用
vpbroadcastd
一样。在组装。 (没有一种可以在任何地方高效编译的可移植的;对内在函数的编译器支持是一个混合包,当您尝试做任何复杂的事情时,会出现脑残的悲观和缺少内在函数。也许再过几年 _mm_loadu_si32(void*)
到零扩展至少会得到广泛支持......)/结束话题咆哮。
关于c - _mm_set1_ps 和 _mm_set_ps1 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60922271/