我想用OpenMP并行化以下代码:
for(i=0; i<n; i++)
{
int sum=0;
for(j=0; j<m; j++)
{
sum += A[i][j]*x[j];
}
y[i]=sum
}
如果我只是在顶部添加#pragma omp parallel for
,它会起作用吗?或者还有其他(更好的)方法吗?
答案 0 :(得分:2)
您的外部循环#pragma omp parallel for
没问题,您应该使用以下代码获得预期的结果:
#pragma omp parallel for private(i, j, sum) shared(y, n, m, A, x)
for(i=0; i<n; i++)
{
int sum=0;
for(j=0; j<m; j++)
{
sum += A[i][j]*x[j];
}
y[i]=sum
}
请注意,为了获得任何形式的显着改进,您的n
变量必须非常大。由于线程开销和称为False Sharing的现象,小的n
值实际上会降低您的性能。
作为最后一点,如果您的最终目的是总结 y
- 您可以使用OpenMP reduction子句。