使用 AVX2 C++ 选择性加载
Selective load using AVX2 C++
我正在尝试使用 AVX2 实现以下目标,但花了半天时间还是无法实现。
我尝试使用 maskload 和其他东西,但未能解决问题。
我有两个双精度数组 a 和 b。
double a[] = {-1000.00, 0.00, 2000.00, 3500.00};
double b[] = {1.25, 1.636, -2.50, 3.25};
我只想将 b
中的那些值加载到 __m256d
中,a
中的对应值不为零,否则设置为 0。
类似于:
double c[4];
for(int i=0; i<4; ++i)
{
if a[i] == 0
c[i] = 0;
else
c[i] = b[i];
}
有人可以帮忙吗?
编辑:这是一个更大问题的一部分,不只有 4 个值,因此我不想像这里那样计算另一个数组并将该数组加载到寄存器中。
由于b
的条目可以无条件加载,所以应该清零的条目可以用掩码清零:
__m256d zero = _mm256_setzero_pd();
__m256d c = _mm256_and_pd(b, _mm256_cmp_pd(zero, a, _CMP_NEQ_UQ));
使用 _CMP_NEQ_UQ
意味着 a
中的 NaN 不会将条目归零,而使用 _CMP_NEQ_OQ
零和 NaN 都会将条目归零。
我正在尝试使用 AVX2 实现以下目标,但花了半天时间还是无法实现。 我尝试使用 maskload 和其他东西,但未能解决问题。
我有两个双精度数组 a 和 b。
double a[] = {-1000.00, 0.00, 2000.00, 3500.00};
double b[] = {1.25, 1.636, -2.50, 3.25};
我只想将 b
中的那些值加载到 __m256d
中,a
中的对应值不为零,否则设置为 0。
类似于:
double c[4];
for(int i=0; i<4; ++i)
{
if a[i] == 0
c[i] = 0;
else
c[i] = b[i];
}
有人可以帮忙吗?
编辑:这是一个更大问题的一部分,不只有 4 个值,因此我不想像这里那样计算另一个数组并将该数组加载到寄存器中。
由于b
的条目可以无条件加载,所以应该清零的条目可以用掩码清零:
__m256d zero = _mm256_setzero_pd();
__m256d c = _mm256_and_pd(b, _mm256_cmp_pd(zero, a, _CMP_NEQ_UQ));
使用 _CMP_NEQ_UQ
意味着 a
中的 NaN 不会将条目归零,而使用 _CMP_NEQ_OQ
零和 NaN 都会将条目归零。