并行编程将两个数字数组相乘

parallel programming multiplying two arrays of numbers

我有以下 C++ 代码,可将两个大数组元素相乘

double* pA1 = { large array };
double* pA2 = { large array };
for(register int r = mm; r <= count; ++r)
{
    lg += *pA1-- * *pA2--;  
}

有什么方法可以实现代码的并行性吗?

我想回答我自己的问题。看起来我们可以像下面这样使用 openMP。但是,速度增益并不多(2 倍)。我的电脑有16核。

// need to use compile flag /openmp
double dot_prod_parallel(double* v1, double* v2, int dim)
{
    TimeMeasureHelper helper;

    double sum = 0.;
    int i;
# pragma omp parallel shared(sum)
    {
        int num = omp_get_num_threads();
        int id = omp_get_thread_num();
        printf("I am thread #  % d of % d.\n", id, num);

        double priv_sum = 0.;
# pragma omp for
        for (i = 0; i < dim; i++)
        {
            priv_sum += v1[i] * v2[i];
        }

#pragma omp critical
        {
            cout << "priv_sum = " << priv_sum << endl;
            sum += priv_sum;
        }
    }
    return sum;
}

这是一个更简单的替代 OpenMP 实现(在 many-core 平台上速度更快):

double dot_prod_parallel(double* v1, double* v2, int dim)
{
    TimeMeasureHelper helper;
    double sum = 0.;

    #pragma omp parallel for reduction(+:sum)
    for (int i = 0; i < dim; ++i)
        sum += v1[i] * v2[i];

    return sum;
}

GCC 和 ICC 能够在 -O3 中向量化此循环。 Clang 13.0 无法做到这一点,即使使用 -ffast-math 甚至使用显式 OpenMP SIMD 指令以及循环平铺也是如此。这似乎是与 OpenMP 相关的 Clang 优化器的错误...请注意,您可以使用 -mavx 来使用 AVX 指令集,它的速度可以是 SSE(默认)的两倍。它适用于几乎所有最新的 x86-64 PC 处理器。