在 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 很可能存在数据竞争。
如果它确实导致了核心转储,那么您最初关于锁定的假设可能是正确的。从可见的代码来看,我看不出有什么明显的错误。我可能会删除共享子句,因为它是多余的,但我不希望这会产生影响。
我想并行化函数 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 很可能存在数据竞争。
如果它确实导致了核心转储,那么您最初关于锁定的假设可能是正确的。从可见的代码来看,我看不出有什么明显的错误。我可能会删除共享子句,因为它是多余的,但我不希望这会产生影响。