我想并行化函数S并锁定每个节点但我不断获得核心转储。我正在尝试在图的每个节点中使用锁。如果我在节点上使用单个锁,它将起作用。
for (l = 0; l < n; l++)
omp_init_lock(&(lock[l]));
#pragma omp parallel for num_threads(16)default(none) private(v)shared(n,Xof,lock)
for(v = 0; v < n; v++) {
omp_set_lock(&(lock[v]));
if(Xof[v] == NYC)
{
S(v);
}
omp_unset_lock(&(lock[v]));
}
答案 0 :(得分:0)
似乎最可能的原因是S内存在数据竞争(可能有一些嵌入状态)。
测试它的一种方法是使用n个锁但只使用一个线程。如果这不会导致核心转储,则S很可能会发生数据竞争。
如果它确实导致核心转储,那么由锁定引起的初始假设可能是真的。从可见的代码中,我没有看到任何明显错误。我可能会删除共享条款,因为它是多余的,但我不希望这会产生影响。