AVX2等同于std :: clamp

问题描述

鉴于精度p在1到16之间,我想将AVX2整数寄存器限制在-p/2p/2之间。我目前在非AVX2整数上使用std::clamp进行此操作。

是否可以通过AVX2做到这一点?

解决方法

使用x = min(max(x,lower_limit),upper_limit)使用所需的任意宽度的整数来实现饱和钳位。或者让编译器为您自动向量化std::clamp

8、16或32很方便; AVX2没有64位整数的最小/最大压缩值,但是您可以使用vpcmpgtq来模拟它。 AVX512具有vpmaxsq。仅使用SSE2,就只能使用最小/最大操作的几个大小/符号组合。 SSE4.1修复了该问题,因此AVX2具有签名和未签名的所有3种大小。

例如,对于8位整数,_mm256_max_epi8用于__m256i向量上的有符号整数最大值。

请参见Intel's intrinsics guide来查找内在函数。