0

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

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

我不知道这个指令有什么限制吗?一维动态数组似乎一切正常。

代码片段如下...

#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);
   }
   ....
4

2 回答 2

0

查看OpenMP 文档,了解该threadprivate子句会发生什么:

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

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

于 2012-04-30T15:48:23.040 回答
0

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

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

于 2012-05-04T22:32:54.383 回答