gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:39:43 24 4
gpt4 key购买 nike

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

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区域(并行后),从而提高并行化的整体性能。因此,如果您应用该功能,您的代码将如下所示:
#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 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]);

关于c - 如何使用 OpenMP 在一段时间内并行化代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67549478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com