2015-02-09 25 views
1

我想并行化函数S并锁定每个节点,但我一直在获取核心转储。我试图在图的每个节点中使用一个锁。如果我在我的节点上使用单个锁,它将起作用。在openMP中使用lock转储的核心

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

你是如何申报锁定的? 是否有其他地方你正在访问可能导致数据竞争的共享状态? – user2548418 2015-02-10 01:35:20

+0

omp_lock_t lock [n]; (l = 0; l dibid 2015-02-10 07:12:14

+0

问题是,当我使用一个单一的锁,我没有得到任何核心转储 – dibid 2015-02-10 07:12:38

回答

0

这似乎是最可能的原因是,有一个数据的比赛中S.

(也许有一些嵌入式状态)

测试,这将是使用N-锁,但只有一个线程的方法。如果这不会导致核心转储,那么S最有可能有数据竞争。

如果它确实会导致核心转储,那么您最初的假设是由于锁定而导致的。从可见的代码中,我没有看到任何明显的错误。我可能会删除共享条款,因为它是多余的,但我不认为会产生影响。

+0

谢谢,/我用一个线程试了一下,它工作。 S()中应该有一个数据竞赛, – dibid 2015-02-10 19:25:33