AVX2 相当于 std::clamp
AVX2 equivalent of std::clamp
给定 1 到 16 之间的精度 p
,我想将 AVX2 整数寄存器限制在 -p/2
和 p/2
之间。我目前在非 AVX2 整数上使用 std::clamp
执行此操作。
有没有办法用 AVX2 做到这一点?
使用 x = min(max(x, lower_limit), upper_limit)
的标准方式实现饱和钳位,使用您想要的任何整数宽度。或者让一个编译器auto-vectorizestd::clamp
给你
8、16、32都方便; AVX2 没有为 64 位整数打包 min/max,但您可以用 vpcmpgtq
模拟它。 AVX512 有 vpmaxsq
。仅使用 SSE2,只有 min/max 操作的几个大小/符号组合可用。 SSE4.1 修复了这个问题,所以 AVX2 有符号和无符号的所有 3 种尺寸。
例如,对于 8 位整数,_mm256_max_epi8
for signed-integer max on __m256i
vectors.
请参阅 Intel's intrinsics guide 以查找内部函数。
给定 1 到 16 之间的精度 p
,我想将 AVX2 整数寄存器限制在 -p/2
和 p/2
之间。我目前在非 AVX2 整数上使用 std::clamp
执行此操作。
有没有办法用 AVX2 做到这一点?
使用 x = min(max(x, lower_limit), upper_limit)
的标准方式实现饱和钳位,使用您想要的任何整数宽度。或者让一个编译器auto-vectorizestd::clamp
给你
8、16、32都方便; AVX2 没有为 64 位整数打包 min/max,但您可以用 vpcmpgtq
模拟它。 AVX512 有 vpmaxsq
。仅使用 SSE2,只有 min/max 操作的几个大小/符号组合可用。 SSE4.1 修复了这个问题,所以 AVX2 有符号和无符号的所有 3 种尺寸。
例如,对于 8 位整数,_mm256_max_epi8
for signed-integer max on __m256i
vectors.
请参阅 Intel's intrinsics guide 以查找内部函数。