AVX2 相当于 std::clamp

AVX2 equivalent of std::clamp

给定 1 到 16 之间的精度 p,我想将 AVX2 整数寄存器限制在 -p/2p/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 以查找内部函数。