并行编程将两个数字数组相乘
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 处理器。
我有以下 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 处理器。