我是并行编程和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);
}
....
答案 0 :(得分:0)
关于threadprivate
子句发生的事情,请查看OpenMP documentation:
在第一次进入并行区域时,THREADPRIVATE变量和公共块中的数据应该是未定义的,除非在PARALLEL指令中指定了COPYIN子句
无法保证在并行区域的matrix
变量中存储什么值。
答案 1 :(得分:0)
OpenMP只能对已知存储大小的变量进行私有化。也就是说,如果数组定义为double matrix[N][M]
,则可以拥有数组的私有副本。在你的情况下,不仅存储大小未知(指针不存储它指向的元素的数量),而且你的矩阵不是内存中的连续区域,而是指向动态分配行列表的指针。
你最终得到的是拥有顶级指针的私有副本,而不是矩阵数据本身的私有副本。