2011-12-12 4 views
6

OpenMP with C++ 프로그램이 있습니다. 병렬 영역 내에는 #pragma omp task을 포함하는 병렬 영역이 있습니다. 이제 실행중인 스레드가 만나는 조건에 따라 병렬 영역을 종료하는 방법을 알고 싶습니다.OpenMP에서 병렬 영역을 조건부로 종료하려면 어떻게합니까?

#pragma omp parallel 
{ 
#pragma omp task 
{ 
    //upon reaching a condition i would like to break out of the parallel region. (all threads should exit this parallel region) 
} 

} 

답변

5

병렬 구조를 조기에 종료 할 수 없습니다. OpenMP에는 이것에 대한 구조가 없으며 병렬 영역에 단 하나의 종료점 만있을 수 있습니다 (따라서 영역 밖으로 분기하지 않음 ...).

나는 그 일을 성취하기 위해 유일하게 (가볍고 올바른) 방법은 작업이 끝났음을 나타내는 변수를 가지고 스레드가 그 변수를 규칙적으로 검사하도록하는 것이라고 생각한다. (원자 적 지침 및/또는 플러시를 사용하여 정확한 가시성을 보장한다) . 변수가 작업이 완료되었음을 나타내면 스레드는 남은 작업을 건너 뛸 수 있습니다 (작업이 완료되면 분기되지 않은 if 본문에 나머지 작업을 넣음).

다른 스레드를 일시 중단하고 블록 끝으로 설정하는 시스템 특정 코드를 작성할 수도 있습니다 (예 : 스택 및 명령 포인터 조작 ...)하지만 그렇게하는 것은 바람직하지 않습니다. 매우 부서지기 쉬운).

당신이하고 싶은 일에 대해 조금 더 이야기한다면 (그리고 왜 이것을 필요로하는지), 당신을 도울 수 있습니다 (예 : 이것을 할 필요가없는 디자인을 내놓음으로써) .

관련 문제