用 AVX2 有条件地选择一个常数值

Posted

技术标签:

【中文标题】用 AVX2 有条件地选择一个常数值【英文标题】:Conditionally choose a constant value with AVX2 【发布时间】:2016-04-18 03:25:29 【问题描述】:

我正在寻找一种基于 AVX2 值的特定条件来选择 AVX2 常量的无分支方式。

我现在正在做的伪代码:

condition = _mm256_cmp_gt(value, limit);
result = _mm256_or(_mm256_and(condition, constant_a), 
                   _mm256_andnot(condition, constant_b));

还有比这更有效的吗?

【问题讨论】:

尝试用g++ -S -O2 -mavx编译#include<x86intrin.h> __m256 f(__m256 x,__m256 y,__m256 z,__m256 t)return(x<y)?z:t;(或者改成与__m256不同的类型,我不知道_mm256_cmp_gt是什么),你就会得到你问题的答案。 【参考方案1】:

您可以使用“混合”指令,例如_mm256_blendv_epi8:

condition = _mm256_cmpgt_epi32(value, limit);
result = _mm256_blendv_epi8 (constant_a, constant_b, condition);

(请注意,_epi8 内在函数可用于任何元素宽度,因为它只是根据掩码内容逐字节地从 A 和 B 中选择。)

【讨论】:

很好的解决方案,更简洁

以上是关于用 AVX2 有条件地选择一个常数值的主要内容,如果未能解决你的问题,请参考以下文章

使用 AVX2 C++ 的选择性加载

如何用表格查重复

使用 SIMD,我如何有条件地仅移动 alpha 通道值为 255 的像素?

AVX2中有序数组的高效稳定总和

填写常数值,当dplyr中满足条件时加1

有条件地选择要继承的类