C / OpenMP - 与threadprivate和指针向量的问题

时间:2012-04-30 15:40:48

标签: openmp

我是并行编程和openmp世界的新手,所以这可能是一个徒劳的问题,但我无法真正找到我正在经历的好答案,所以我希望有人能够阐明了这个问题。

我想要实现的是为每个将处理以下并行部分的线程拥有一个dinamically分配的矩阵(整数)的私有副本,但是一旦执行流程进入所述区域,就会引用据说私有矩阵保持空值。

我不知道这条指令有任何限制吗?对于单维动态数组,一切似乎都能正常工作。

代码片段如下......

#define n 10000
int **matrix;
#pragma omp threadprivate(matrix)

int main()
{

    matrix = (int**) calloc(n, sizeof(int*));
    for(i=0;i<n;i++) matrix[i] = (int*) calloc(n, sizeof(int));
    AdjacencyMatrix(n, matrix);

    ...

   /* Explicitly turn off dynamic threads */
   omp_set_dynamic(0);
   #pragma omp parallel
   {    
      // From now on, matrix is NULL... 
      executor_p(matrix, n);
   }
   ....

2 个答案:

答案 0 :(得分:0)

关于threadprivate子句发生的事情,请查看OpenMP documentation

  

在第一次进入并行区域时,THREADPRIVATE变量和公共块中的数据应该是未定义的,除非在PARALLEL指令中指定了COPYIN子句

无法保证在并行区域的matrix变量中存储什么值。

答案 1 :(得分:0)

OpenMP只能对已知存储大小的变量进行私有化。也就是说,如果数组定义为double matrix[N][M],则可以拥有数组的私有副本。在你的情况下,不仅存储大小未知(指针不存储它指向的元素的数量),而且你的矩阵不是内存中的连续区域,而是指向动态分配行列表的指针。

你最终得到的是拥有顶级指针的私有副本,而不是矩阵数据本身的私有副本。