2017-10-12 6 views
1

프로그램 실행이 omp sections 지시문에 도달하면 다음 omp section 지시문으로 정의 된 프로그램 세그먼트가 사용 가능한 스레드간에 병렬 실행되도록 배포됩니다.원래 스레드는`omp section` 지시어에 의해 정의 된 프로그램 세그먼트 중 하나를 실행합니까?

  • 원래 스레드 omp sectionsomp section 지시문에 의해 정의 된 프로그램 세그먼트들 중 하나를 실행하는 스레드들 중 하나에 도달하기 전에 실행 즉, 스레드는?

  • omp section 지시어로 정의 된 프로그램 세그먼트를 모두 실행 한 후에 원래 스레드 만 존재하고 계속 실행됩니까?

다음 예제에서 어떤 스레드가 원래 스레드입니까, 1 또는 2입니까?

#pragma omp sections 
{ 

    # pragma omp section 
    { printf("thread 1 here\n"); } 
    # pragma omp section 
    { printf("thread 2 here\n"); } 

} 

감사합니다.

답변

1

코드 예가 ​​불완전합니다. 순진하게 마무리합시다.

int main() 
{ 
    #pragma omp sections 
    { 
     #pragma omp section 
     { printf("thread 1 here\n"); } 
     # pragma omp section 
     {printf("thread 2 here\n"); } 
    } 
} 

여기에는 하나의 스레드 만 있습니다. #pragma omp section 만 추가 스레드를 생성하지 않습니다.

당신은 병렬 구조 내에서 sections를 사용 : 동일하다

#pragma omp parallel 
{ 
    #pragma omp sections 

#pragma omp parallel sections 

parallel 구조가 스레드 팀을 작성합니다. 모든 스레드는 sections 구조까지 실행되며, 여기서 각 section 블록은 팀의 스레드 중 하나에 의해 실행됩니다.

스레드가 병렬 섹션을 떠나/입력에 대해 이야기 :

  • 은 예, parallel 구조를 발견 스레드는 팀의 실행의 일부가 될 것입니다. 사실 스레드 번호가 0 인 마스터 스레드가됩니다. 팀이 sections 구성으로 실행되는 경우 섹션 실행에 참여합니다. 그러나 모든 섹션을 실행한다는 보장은 없으며 모든 스레드에 대해 섹션이 충분하지 않을 수도 있습니다. 팀 내의 섹션에서 스레드로의 스케줄링 방법은 구현에 따라 정의됩니다.

  • 예, parallel 영역의 끝에서 원래 스레드는 외부 코드의 실행을 계속할 유일한 스레드입니다.

+0

감사합니다. 현재 스레드의 스레드 ID 번호를 어떻게 얻습니까? – Ben

+0

'omp_get_thread_num()' – Zulan

+0

마스터가 섹션 중 하나를 실행하도록 "장려"하기 위해 비틀기위한 OpenMP 노브가 있습니까? 마스터가 병렬 블록의 끝에 조인을 수행하므로 작업 스레드가 각 섹션을 실행할 수 있도록 마스터 스레드가 일시 중단되고 (자발적으로 CPU 슬라이스를 버리는 것) 최적이 아닙니다. – igaz