我有一个来自存储库的 OpenMP 代码。碰巧有两个线程根据数据写入同一位置的情况(具体来说是 BFS 图算法)。从功能上讲,它不会影响最后写入的线程,因为相同的值被写入该位置。但他们没有使用任何原子。这是代码的一部分:
int id = h_graph_edges[i];
if(!h_graph_visited[id])
{
h_cost[id]=h_cost[tid]+1; //there may be two threads writing to same h_cost[id]
h_updating_graph_mask[id]=true;
}
此外,代码中没有指定原子或私有。但是我得到了正确的输出。我想知道线程如何管理这种冲突。它如何转换为汇编代码,是否涉及隐式原子?我检查了汇编代码并没有遇到栅栏类型的说明。或者如果它是相同的值,线程实际上是否可以同时写入相同的位置?
谢谢