【发布时间】:2017-12-12 20:25:02
【问题描述】:
在某些内在函数中,它们使用后缀 x,例如 _mm256_set1_epi64x。它的意义是什么?作为参考,_mm256_set1_epi32 没有这个后缀。
【问题讨论】:
-
我认为“x”表示内在(和相应的指令)仅在 64 位目标上可用。但我不确定,也无法提供任何证据。这只是我注意到几次的一种模式。您在这里提出的另一个问题确实是题外话。我们不请求外部资源。
-
我认为这只是当内在函数有两个变体时,一个原始的“历史”变体和一个后续的更有用的变体,例如
_mm_set1_epi64采用__m64参数,而_mm_set1_epi64x采用int64_t。 -
许多内在函数的命名非常明显,来自指令助记符,除了很容易忘记
_mm256_permutevar_ps是 AVX1 车道内vpermilps还是车道交叉 AVX2vpermps。 (它是vpermilps。vpermps是_mm256_permutevar8x32_ps)。还有 massive 命名冗余,这会使您的代码膨胀并使其难以阅读。喜欢_mm256_storeu_si256。感谢英特尔,我真的很想在大多数内在函数中输入两次256。但是,如果您不在同一行上嵌套多个内在函数,那么可读性并不可怕。 (即像 asm 一样写) -
@PaulR:实际上
__int64,不一定和int64_t是一回事。它们可能不兼容别名。一个可能是long而另一个是long long,因此编译器可以假设int64_t *没有别名__int64 *。但是,是的,我认为历史是 MMX->SSE2 转换内在函数的 32 位代码采用非 x 名称。 -
@PeterCordes:英特尔和微软似乎更喜欢
__int64,而gcc使用long long,大概是因为__int64是非标准的。
标签: x86 vectorization x86-64 simd intrinsics