使用 AVX2 有条件地选择一个常数值
Conditionally choose a constant value with AVX2
我正在寻找一种基于 AVX2 值的特定条件来选择 AVX2 常量的无分支方式。
我现在正在做的伪代码:
condition = _mm256_cmp_gt(value, limit);
result = _mm256_or(_mm256_and(condition, constant_a),
_mm256_andnot(condition, constant_b));
还有比这更高效的吗?
您可以使用 "blend" 指令,例如_mm256_blendv_epi8:
condition = _mm256_cmpgt_epi32(value, limit);
result = _mm256_blendv_epi8 (constant_a, constant_b, condition);
(请注意,_epi8
内部函数可用于任何元素宽度,因为它只是根据掩码内容逐字节地从 A 和 B 中进行选择。)
我正在寻找一种基于 AVX2 值的特定条件来选择 AVX2 常量的无分支方式。
我现在正在做的伪代码:
condition = _mm256_cmp_gt(value, limit);
result = _mm256_or(_mm256_and(condition, constant_a),
_mm256_andnot(condition, constant_b));
还有比这更高效的吗?
您可以使用 "blend" 指令,例如_mm256_blendv_epi8:
condition = _mm256_cmpgt_epi32(value, limit);
result = _mm256_blendv_epi8 (constant_a, constant_b, condition);
(请注意,_epi8
内部函数可用于任何元素宽度,因为它只是根据掩码内容逐字节地从 A 和 B 中进行选择。)