2016-10-06 2 views
0

다음 예제를 고려하면 OpenMP는 buff1buff2에 저장된 주소를 결정해야합니다. 그러나 buff1buff2에 저장된 주소는 작업을 실행하는 스레드의 ID (myid)에 따라 결정됩니다. 문제를 어떻게 해결할 수 있습니까? 어떤 해결책을 부탁드립니다. 나는 기억을 할당 할 수 없다.스레드 개인 저장소에 대한 OpenMP 태스크 종속성

mystruct* buff1; 
mystruct* buff2; 
#pragma omp task depend(in: data[0:1000]) depend(inout: buff1[0:0]) 
{ 
    int myid=omp_get_thread_num(); 
    buff1=buffers[myid]; 
    processA(data, buff1); 
} 
#pragma omp task depend(in: data[0:1000]) depend(inout: buff2[0:0]) 
{ 
    int myid=omp_get_thread_num(); 
    buff2=buffers[myid]; 
    processB(data, buff2); 
} 
#pragma omp task depend(in: data[0:1000]) depend(inout: buff1[0:0]) depend(inout: buff2[0:0]) 
{ 
    processC(data, buff1, buff2); 
} 

답변

0

작업 종속성은 작업 생성시 등록됩니다. 작업 실행을 시작하기 전에이 작업을 수행해야하므로 요청하는 작업을 수행 할 수 없습니다.

buff1buff2 이상의 종속 관계를 직접 가리키는 내용이 아닌 직접 정의한다고 생각하십니까?

mystruct* buff1; 
mystruct* buff2; 
#pragma omp task depend(in: data[0:1000]) depend(inout: buff1) shared(buff1) 
{ 
    int myid=omp_get_thread_num(); 
    buff1=buffers[myid]; 
    processA(data, buff1); 
} 
#pragma omp task depend(in: data[0:1000]) depend(inout: buff2) shared(buff2) 
{ 
    int myid=omp_get_thread_num(); 
    buff2=buffers[myid]; 
    processB(data, buff2); 
} 
#pragma omp task depend(in: data[0:1000]) depend(inout: buff1, buff2) // shared(buff1, buff2) ??? 
{ 
    processC(data, buff1, buff2); 
} 

그것은이 두 조항의 의미의 차이를 주목해야합니다 : depend(inout: buff1)depend(inout: buff1[0:0]). 첫 번째 것은 &buff1 이상의 종속성을 정의하고 두 번째 것은 &buff1[0] = &(*(buff1 + 0)) = buff1 이상의 종속성을 정의합니다. 일반적으로 첫 번째 작업은 작업이 포인터 자체의 값을 생성 할 때 사용되며 일반적으로 shared 절과 함께 사용됩니다. 반면 두 번째 작업은 작업에서 해당 포인터가 가리키는 데이터를 수정할 때 사용됩니다.

마지막으로 buff1buff2 변수의 데이터 공유를 지정하지 않았습니다. 이러한 변수에 대한 작업의 변경 사항이 외부에서 볼 수 있어야하는 경우이 변수에 공유로 주석을 추가해야합니다.