在 openMP 中使用锁转储核心

core dumped using lock in openMP

我想并行化函数 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]));
}

似乎最可能的原因是 S 中存在数据竞争(可能有一些嵌入状态)。

一种测试方法是使用 n 个锁,但只使用一个线程。如果这不会导致核心转储,那么 S 很可能存在数据竞争。

如果它确实导致了核心转储,那么您最初关于锁定的假设可能是正确的。从可见的代码来看,我看不出有什么明显的错误。我可能会删除共享子句,因为它是多余的,但我不希望这会产生影响。