为什么某些英特尔的内在函数采用 const immediates,而另一些则采用非常量?
Why do some of Intel's intrinsics take const immediates, while others are non-const?
Intel's intrinsic guide 似乎在与直接值进行神秘的区分。他们将一些标记为常量,而另一些则不是常量。实际上,这两种类型都需要是编译时常量,否则编译器会报错。我只是想知道为什么要区分?我缺少什么?
以下是英特尔所说的示例:
_mm_blend_epi16 (__m128i a, __m128i b, const int imm8)
_mm_srli_si128 (__m128i a, int imm8)
假设您认为 const
有所改进,只是英特尔的旧东西不如他们的新东西写得好。
注意blend_epi16
是SSE4.1,而srli_si128
是SSE2。可能他们决定在为 SSE4.1 添加内在函数时强调参数需要是编译时常量这一点。
256 位版本的 AVX2 内在函数使用常量:__m256i _mm256_srli_si256 ( __m256i a, const int imm)
。这基本上证实了他们只是还没有想到 const
,因为他们开始对同一指令使用 const
。
另请注意,他们对 psrldq
instruction 的 _mm_srli_si128
名称非常不满意,因此他们为其引入了一个新名称:_mm_bsrli_si128
应该在新代码中优先使用,以使更清楚的是它是字节移位,而不是 128 位宽的移位。这与 _mm_srli_epi64
有很大不同。不幸的是,说明参考手册没有提到 bsrli
名称。
AVX512 load/store 内在函数将使用 void*
而不是 __m128i*
,这是另一个不错的变化。
所以基本上英特尔做事的方式有所不同,因为旧方法不是最优的,而不是因为他们必须这样做。
Intel's intrinsic guide 似乎在与直接值进行神秘的区分。他们将一些标记为常量,而另一些则不是常量。实际上,这两种类型都需要是编译时常量,否则编译器会报错。我只是想知道为什么要区分?我缺少什么?
以下是英特尔所说的示例:
_mm_blend_epi16 (__m128i a, __m128i b, const int imm8)
_mm_srli_si128 (__m128i a, int imm8)
假设您认为 const
有所改进,只是英特尔的旧东西不如他们的新东西写得好。
注意blend_epi16
是SSE4.1,而srli_si128
是SSE2。可能他们决定在为 SSE4.1 添加内在函数时强调参数需要是编译时常量这一点。
256 位版本的 AVX2 内在函数使用常量:__m256i _mm256_srli_si256 ( __m256i a, const int imm)
。这基本上证实了他们只是还没有想到 const
,因为他们开始对同一指令使用 const
。
另请注意,他们对 psrldq
instruction 的 _mm_srli_si128
名称非常不满意,因此他们为其引入了一个新名称:_mm_bsrli_si128
应该在新代码中优先使用,以使更清楚的是它是字节移位,而不是 128 位宽的移位。这与 _mm_srli_epi64
有很大不同。不幸的是,说明参考手册没有提到 bsrli
名称。
AVX512 load/store 内在函数将使用 void*
而不是 __m128i*
,这是另一个不错的变化。
所以基本上英特尔做事的方式有所不同,因为旧方法不是最优的,而不是因为他们必须这样做。