并行化循环

时间:2013-11-19 05:57:07

标签: c loops openmp

我想用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,它会起作用吗?或者还有其他(更好的)方法吗?

1 个答案:

答案 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子句。