AVX2中_mm256_cmp_ps与_mm256_blend_ps实现投影最大值对报错问题
解决AVX2中_mm256_blend_ps的类型不匹配问题
你遇到的错误核心是函数参数类型不兼容:_mm256_blend_ps的第三个参数要求是编译期常量整数,用来静态指定哪些通道需要混合;但_mm256_cmp_ps返回的是运行时生成的向量掩码(__m256类型,每个通道为全0或全1的float值),无法直接转换为整数参数。
正确的替换方案是使用_mm256_blendv_ps——这个函数专门设计用来接收向量类型的掩码参数,能根据掩码每个通道的结果动态选择对应位置的元素。
修正后的代码如下:
inline void invoke_cmp_blend(__m256& a0, __m256& a1, __m256& b0, __m256& b1, __m256& out0, __m256& out1) { auto proj = &_mm256_div_ps; auto proj_a = proj(a0, a1); auto proj_b = proj(b0, b1); auto mask_ab = _mm256_cmp_ps(proj_a, proj_b, _CMP_LT_OS); out0 = _mm256_blendv_ps(a0, b0, mask_ab); out1 = _mm256_blendv_ps(a1, b1, mask_ab); }
补充说明
_mm256_blendv_ps的逻辑是:掩码中每个通道若为全1(对应_CMP_LT_OS判定为真的情况),则取第二个输入向量(b0/b1)的对应元素;若为全0,则取第一个输入向量(a0/a1)的对应元素,完全匹配你基于投影值比较结果选择元素的需求。
内容的提问来源于stack exchange,提问作者Tom Huntington
相关产品推荐
相关产品推荐

