2012-04-30 4 views
0

저는 병렬 프로그래밍과 openmp의 세계에 익숙하지 않으므로 이것은 쓸데없는 질문 일 수 있습니다. m 경험하기 때문에 누군가가 문제에 관해 밝힐 수 있기를 바랍니다.C/OpenMP - threadprivate 및 포인터 벡터 문제

달성하려고하는 것은 다음 병렬 섹션을 처리 할 모든 스레드에 대해 dinamically 할당 된 행렬 (정수)의 개인 복사본을 갖는 것입니다.하지만 실행 흐름이 해당 영역에 들어가 자마자 기발한 private 행렬은 null 값을 가지고 있습니다.

이 지시어에는 제한이 있습니까? 모든 것이 1 차원 동적 배열로 잘 작동하는 것처럼 보입니다.

코드의 조각은 다음 중 하나입니다

...에 관한 OpenMP documentation에서

#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

봐 무엇 threadprivate 절을 발생합니다 병렬 영역, 데이터

첫 번째 항목에 PARALLEL 지시문에 COPYIN 절이 지정되어 있지 않으면 THREADPRIVATE 변수 및 공통 블록을 정의하지 않아야합니다.

병렬 영역의 변수 matrix에 어떤 값이 저장 될지에 대한 보장이 없습니다.

+0

대단히 감사합니다. 나는 그것을 간과했다. – c3900

0

OpenMP는 알려진 저장소 크기의 변수 만 민영화 할 수 있습니다. 즉, double matrix[N][M]과 같이 정의 된 배열의 복사본을 가질 수 있습니다. 귀하의 경우에는 기억 크기가 알려지지 않았을뿐 아니라 (포인터가 가리키는 요소의 수를 저장하지 않음) 또한 행렬이 메모리의 연속 영역이 아니라 동적으로 할당 된 행의 목록에 대한 포인터가됩니다.

최종 결과는 매트릭스 데이터 자체의 개인 복사본이 아닌 최상위 포인터의 개인 복사본이있는 것입니다.