AVX2 等效于 std::clamp

Posted

技术标签:

【中文标题】AVX2 等效于 std::clamp【英文标题】:AVX2 equivalent of std::clamp 【发布时间】:2020-09-02 00:01:55 【问题描述】:

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

有没有办法用 AVX2 做到这一点?

【问题讨论】:

【参考方案1】:

使用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 以查找内在函数。

【讨论】:

以上是关于AVX2 等效于 std::clamp的主要内容,如果未能解决你的问题,请参考以下文章

使用 AVX2 支持编译并运行

AVX2 和 AVX-512 有啥区别?

C# 等效于 Java 标点正则表达式

等效于 Riverpod 中的 ChangeNotifierProvider 小部件

NSTimer 等效于 Javascript

复合赋值运算符