提问人:Vladislav Kogan 提问时间:11/15/2022 最后编辑:Peter CordesVladislav Kogan 更新时间:11/15/2022 访问量:533
AVX2 _mm256_cmp_pd返回数字值
AVX2 _mm256_cmp_pd to return number values
问:
我的目标是将比较矢量化,以便将来将它们用作掩码。
问题是 _mm256_cmp_pd 返回 NaN 而不是 1.0。在 AVX2 中进行比较的正确方法是什么?
AVX2 代码:
__m256d _numberToCompare = _mm256_set1_pd(1.0);
__m256d _compareConditions = _mm256_set_pd(0.0, 1.0, 2.0, 3.0);
__m256d _result = _mm256_cmp_pd(_numberToCompare, _compareConditions, _CMP_LT_OQ); //a < b ordered (non-signalling)
alignas(8) double res[4];
_mm256_store_pd(&res[0], _result);
for (auto i : res) {
std::cout << i << '\t';
}
__m256d _result2 = _mm256_cmp_pd(_numberToCompare, _compareConditions, _CMP_LE_OQ); //a <= b ordered (non-signalling)
alignas(8) double res2[4];
_mm256_store_pd(&res2[0], _result2);
for (auto i : res2) {
std::cout << i << '\t';
}
std::cout << '\n';
预期结果(我会在标量代码中得到的结果):
0 0 1 1
0 1 1 1
实际结果:
-nan -nan 0 0
-nan -nan -nan 0
- 为什么比较的结果是NaN?
- 获得预期结果的正确方法是什么?
答:
3赞
chtz
11/15/2022
#1
广告 1:结果是一个位掩码(二进制表示 true 或 false),可以与按位运算符一起使用。0xffff'ffff'ffff'ffff
0
广告 2:如果你真的想要,你可以计算(但通常,直接使用位掩码更有效)。_result = _mm256_and_pd(_result, _mm256_set1_pd(1.0))
1
0
还要注意的是,参数是按“big-endian”顺序排列的,即地址最高的元素是第一个参数(不要问我为什么英特尔决定这样做)——如果你更喜欢 little-endian,你可以改用。_mm256_set_pd
_mm256_setr_pd
上一个:C++ if 语句读数小于 等于
下一个:优化 if 语句中的条件
评论
-0.0
)blendvpd
_mm
_mm256