以下循环遍历图的所有边,确定末端节点是否属于同一组,然后将边权重添加到该组的总边权重中。
// 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 语句中的代码是一个关键部分,如果线程在中间被中断,可能会导致竞争条件和错误结果(对吗?)。
如果+=
可以原子地进行操作,我相信问题已经解决(正确吗?)。但是,我查看了该atomic
指令,其中指出:
不幸的是,原子性设置只能指定给通常可以编译为单个处理器操作码的简单表达式,例如递增、递减、异或等。例如,它不能包含函数调用、数组索引、重载运算符、非 POD 类型或多个语句。
我应该用什么来正确地并行化这个循环?