OpenMP范围 - seg。 share()错误

时间:2014-05-07 10:34:18

标签: c multithreading parallel-processing task openmp

我有以下代码:

[...]

#pragma omp parallel
{
   #pragma omp single firstprivate(nodes)
   {

      [...] /* Do some calculation to find out the value of "nodes" */

      double *tForTasks[nodes];

      for(node=0; node < nodes ; node++){

         #pragma omp task private(l, k ,j) shared(tForTasks)
         {
            [...] /* Piece of iterative kernel that writes on tForTasks and on private data structures */
         }
    }
}

[...]

我发现将 tForTasks 定义为共享会导致分段错误,但从任务声明中取出 shared(tForTasks)就可以了。有什么我做错了吗?

我没有提供更多代码,因为它似乎与问题无关(如果需要,请告诉我)。我有1到16之间任意数量的线程的分段错误。没有 shared(tForTasks),我从来没有。

由于

1 个答案:

答案 0 :(得分:1)

根据OpenMP规范(链接?),task子句不是单个区域的一部分。因此,它可以比tForTasks数组更长久并在其销毁后运行。因此,当您声明它shared时,任务可以引用未初始化或取消分配的内存引发分段错误。省略shared规范时,数组将作为firstprivate复制到每个任务,因为它是在并行区域中声明的。但在这种情况下,线程不会从其他线程看到对tForTasks的写入。

一种解决方案是动态分配数组并在任务完成后释放它。