我有以下代码:

[...]

#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会导致分段错误,但是从任务声明中去掉shared(tForTasks)就可以了。我做错什么了吗?
我没有提供更多的代码,因为它似乎与问题无关(如果需要什么,请告诉我)。对于1到16之间的任何数量的线程,我都有分段错误。没有共享(tForTasks),我就没有它。
谢谢

最佳答案

根据OpenMP规范(link?)。因此,它可以比task数组存活并在其销毁后运行。因此,当您声明它tForTasks时,任务可以引用未初始化或已解除分配的内存提升分段错误。当省略shared规范时,数组将作为shared复制到每个任务,因为它是在并行区域中声明的。但在这种情况下,一个线程将看不到其他线程对firstprivate的写操作。
一种解决方案是动态分配数组,并在任务完成后释放它。

08-27 00:51