首页 > 解决方案 > 使用 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非零的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 个值,因此我不想像这里一样计算另一个数组并将该数组加载到寄存器中。

标签: c++avx2

解决方案


由于b可以无条件加载 的条目,因此可以使用掩码将应清零的条目清零:

__m256d zero = _mm256_setzero_pd();
__m256d c = _mm256_and_pd(b, _mm256_cmp_pd(zero, a, _CMP_NEQ_UQ));

使用_CMP_NEQ_UQ意味着 NaN ina不会将条目归零,而同时使用_CMP_NEQ_OQ零和 NaN 会将条目归零。


推荐阅读