【发布时间】:2019-08-23 01:20:19
【问题描述】:
GCC 好心地告诉我 SIMD 内在 _mm_permute_ps 的最后一个参数必须是 8 位立即数。那么为什么它的最后一个参数声明为期待int?
__m128 _mm_permute_ps(__m128 a, int imm8);
__m256d _mm256_permute_pd(__m256d a, int imm8);
8 位类型参数不会为最终用户提供更有用的界面吗?
【问题讨论】:
-
责备英特尔。他们提出了内在函数。
-
如果它必须是一个立即值,它真的有什么不同吗?
-
有一种观点认为“每个整数都应该是
int类型,除非有充分的理由让它成为其他类型”。根据我跨越三个十年的经验,我倾向于同意这种设计理念。正如@immibis 指出的那样,这里似乎没有“该死的好理由”。 -
而且,根据文档,它实际上只有 4 位(对于两个功能)。
-
@immibis:硬件会忽略
[7:4]位,但机器编码使用imm8的整个字节。你当然可以放任何你想要的东西。 (没关系;你不是用 asm 写的,所以不能保证编译器生成的 asm 甚至会包含一个vpermilps,更不用说使用你的直接不变了。例如,clang 的 shuffle 优化器可能会忘记被忽略的位。)
标签: c intel api-design intrinsics avx