2012-04-30 30 views
0

我是新來的並行編程和openmp的世界,所以這可能是一個徒勞無益的問題,但我不能真正拿出好的答案,我經歷過,所以我希望有人能夠在這個問題上提出一些看法。C/OpenMP - 與threadprivate和指針向量的問題

我想要實現的是爲每個線程分配一個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

看那OpenMP documentation關於什麼用threadprivate條款發生了:

在首次進入到並行區域,數據在THREADPRIVATE變量和公共塊中應假定爲未定義,除非在PARALLEL指令中指定了COPYIN子句

無法保證在並行區域的matrix變量中將存儲什麼值。

+0

非常感謝。我完全忽略了這一點。 – c3900

0

OpenMP只能將已知存儲大小的變量私有化。那就是你可以有一個數組的私人副本,如果它被定義爲double matrix[N][M]。在你的情況下,不僅是未知的存儲空間(一個指針不存儲指向它的元素的數量),而且你的矩陣不是內存中的連續區域,而是一個指向動態分配行列表的指針。

你最終會得到的是頂級指針的私人副本,而不是矩陣數據本身的私人副本。