如何使用 OpenMP 在一段时间内并行化代码

How to parallelise a code inside a while using OpenMP

我正在尝试并行化 heat_plate 算法,但我被卡在了这段代码中:

while(1)
{
.....
.....

#pragma omp parallel shared(diff, u, w) private(i, j, my_diff)
{
  my_diff = 0.0;
  #pragma omp for 
    for (i = 1; i < M - 1; i++) 
    {
      for (j = 1; j < N - 1; j++)
      {
        if ( my_diff < fabs (w[i][j] - u[i][j]))
        {
          my_diff = fabs (w[i][j] - u[i][j]);
        }
      }
    }
    #pragma omp critical
    {
      if (diff < my_diff)
      {
        diff = my_diff;
      }
    }
}

....
....
}

不仅我无法让它并行工作,而且实际上需要更长的时间才能完成

编辑:

程序并行运行 .

预先感谢您的帮助。

在 OpenMP 中此数据依赖项:

for (i = 1; i < M - 1; i++) 
  for (j = 1; j < N - 1; j++)
    if ( my_diff < fabs (w[i][j] - u[i][j]))
        my_diff = fabs (w[i][j] - u[i][j]);

通常使用 OpenMP reduction feature 解决,在您的情况下,这将避免 critical 区域(在并行 for 之后),从而提高并行化的整体性能。因此,如果您应用该功能,您的代码将如下所示:

#pragma omp parallel shared(u, w) private(i, j)
{
  #pragma omp for reduction(max:diff)
  for (i = 1; i < M - 1; i++) 
     for (j = 1; j < N - 1; j++)
        if ( diff < fabs (w[i][j] - u[i][j]))
             diff = fabs (w[i][j] - u[i][j]);
}

反过来,您可以将两个 pragma 合并为一个:

  #pragma omp parallel for reduction(max:diff) shared(u, w) private(i, j)
  for (i = 1; i < M - 1; i++) 
     for (j = 1; j < N - 1; j++)
        if ( diff < fabs (w[i][j] - u[i][j]))
             diff = fabs (w[i][j] - u[i][j]);