gpt4 book ai didi

c++ - 如何使用 OpenMP 并行更新总和

转载 作者:搜寻专家 更新时间:2023-10-31 00:40:58 25 4
gpt4 key购买 nike

以下循环遍历图的所有边,确定端节点是否属于同一组,然后将边权重添加到该组的总边权重。

// TODO: parallel
FORALL_EDGES_BEGIN((*G)) {
node u = EDGE_SOURCE;
node v = EDGE_DEST;
cluster c = zeta[u];
cluster d = zeta[v];
if (c == d) {
// TODO: critical section
intraEdgeWeight[c] += G->weight(u, v);
} // else ignore edge
} FORALL_EDGES_END();

我想将它与 OpenMP 并行化。我认为 if 语句中的代码是一个关键部分,如果线程在中间被中断,可能会导致竞争条件和错误结果(正确吗?)。

如果 += 操作可以自动进行,我相信问题就解决了(对吗?)。但是,我有 looked up atomic 指令,它声明:

Unfortunately, the atomicity setting can only be specified to simple expressions that usually can be compiled into a single processor opcode, such as increments, decrements, xors and the such. For example, it cannot include function calls, array indexing, overloaded operators, non-POD types, or multiple statements.

我应该使用什么来正确并行化这个循环?

最佳答案

atomic update 接受的语法是:

x++;

x--;

++x;

--x;

x binop= expr;

x = x binop expr;

其中 x 是一个标量 l-value 表达式,expr 是任何表达式,包括函数调用,唯一的限制是它必须是标量类型。编译器会注意将中间结果存储在临时变量中。

有时查阅标准文档比阅读 Internet 上的教程更好。遵守 OpenMP 3.1 标准示例 A.22.1c:

float work1(int i)
{
return 1.0 * i;
}
...
#pragma omp atomic update
x[index[i]] += work1(i);

关于c++ - 如何使用 OpenMP 并行更新总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13857316/

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