gpt4 book ai didi

c - 为什么这段与 OpenMP 并行化的代码不能正常工作?

转载 作者:行者123 更新时间:2023-12-04 14:57:42 28 4
gpt4 key购买 nike

我正在尝试将这段 C 代码与 OpenMP 并行化:

for (i = 0; i < openSetSize; i++) {
tmpF = arrayCells[openSet[i]].f;
if (tmpF <= arrayCells[openSet[best]].f && tmpF <= arrayCells[bestPath[0]].f){
isThereBest = true;
best = i;
}
}

我这样试过:

#pragma omp parallel {

int best_private = 0;
#pragma omp for nowait
for (int i = 0; i < openSetSize; i++) {
double tmpF = arrayCells[openSet[i]].f;
if (tmpF <= arrayCells[openSet[best_private]].f && tmpF <= arrayCells[bestPath[0]].f) {
isThereBest = true;
best_private = i;
}
}

#pragma omp critical
{
if(best_private > best){
best = best_private;
}
}
}

但性能一点也不令人满意(在 omp 版本上花费了更多时间)。

有没有人有更好的提示?或者知道我哪里错了吗?非常感谢

最佳答案

我看到的唯一问题是所有线程都在写入共享变量 isThereBest

最简单的解决方案是为每个线程提供变量的私有(private)版本,就像您对变量 best 所做的那样:

#pragma omp parallel
{
bool isThereBest_private = false;
int best_private = 0;

#pragma omp for nowait
for (int i = 0; i < openSetSize; i++) {
double tmpF = arrayCells[openSet[i]].f;
if (tmpF <= arrayCells[openSet[best_private]].f && tmpF <= arrayCells[bestPath[0]].f) {
isThereBest_private = true;
best_private = i;
}
}

#pragma omp critical
{
if ( isThereBest_private ) {
isThereBest = true;
if ( best_private > best ) {
best = best_private;
}
}
}

但是,更简洁的解决方案是改用 reduction 子句,这会使整个 omp critical 构造变得多余:

#pragma omp parallel for reduction(||:isThereBest) reduction(max:best)
for (int i = 0; i < openSetSize; i++) {
double tmpF = arrayCells[openSet[i]].f;
if (tmpF <= arrayCells[openSet[best]].f && tmpF <= arrayCells[bestPath[0]].f) {
isThereBest = true;
best = i;
}
}

使用 reduction 子句代替 omp critical 结构也可能会提高性能。

关于c - 为什么这段与 OpenMP 并行化的代码不能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67626541/

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