[英]Best way to Parallelizing matrix vector multiplication using openMP
我有以下代码,我使用 openMP 对其进行了并行化:
#pragma omp parallel shared(matrix, result, vector) private(i, j)
{
#pragma omp for schedule(static)
for (i = 0; i < n; i++)
{
for (j = 0; j <= i && j < n; k++)
{
result[i] += matrix[i * n + j] * vector[j];
}
}
}
如果使用局部临时变量对j
循环的结果求和,可能有助于编译器优化代码。 您的编译器也可能会这样做,但如果不这样做,它会快得多。
始终在所需的最小范围内使用变量,这也有助于编译器进行优化。
确保您的编译器可以有效地矢量化您的代码:使用适当的编译器标志,如果您使用指针,请通过使用restrict
关键字或添加#pragma ivdep
(英特尔编译器)、 #pragma gcc ivdep
告诉编译器没有循环携带依赖(GCC)、 #pargma loop(ivdep)
(MSVC)、 #pragma clang loop vectorize(assume_safety)
(clang) 在内循环之前。
所以,你的代码应该是这样的:
#pragma omp parallel for shared(matrix, result, vector) schedule(static)
for (size_t i = 0; i < n; i++)
{
double sum=0;
#pragma GCC ivdep
for (size_t j = 0; j <= i; j++) //as suggested by @tstanisl
{
sum += matrix[i * n + j] * vector[j];
}
result[i] += sum;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.