2017-10-06 8 views
2

OpenMP 사양 문서에 "스레드가 작업 구성을 만났을 때
작업을 즉시 실행하도록 선택하거나 실행을 지연 할 때까지 스레드가 실행을 지연합니다. 나중에 시간 ". 그러나이 명세는이 선택이 어떻게 이루어 졌는지를 말하지 않는다.OpenMP - 스레드가 작업 연기시기와 즉시 실행시기를 결정하는 방법

스레드가 작업을 즉시 실행할시기와 실행을 연기 할시기를 어떻게 결정합니까? 구현에 따라 다르면 gcc 같은 컴파일러가 어떻게 이것을 해결합니까?

답변

3

표준에서 오는 두 가지 조건이 있습니다

  1. if 조항이 존재하고 false 평가, 새로운 작업이 현재의 thread에 의해 현재 실행되는 undeferred 작업있다가 (이전 작업은 입니다.).

  2. final 절은 새 작업을하고 모두가 최종 을 포함 자식 작업을합니다. 작업이 포함 된이 미확인이고 스레드가 발생하여 즉시 실행됩니다..

위 느슨하게 또한 활성 스레드 팀이 없다 (GOMP_TASK_UNDEFERRED)

  • 경우, 즉 즉시 작업을 실행 (현재 마스터에서) the standard

    GCC에서 복사 작업이 병렬 영역 외부에서 생성되고 있습니다.

  • 현재 스레드 팀의 작업 수는 64 * 팀의 스레드 수보다 큽니다.

다음을 참조하십시오. task.c, GOMP_task을 찾으십시오.

LLVM OpenMP 런타임은 최대 크기를 갖는 작업 대기열을 사용하고이 양도 큐가 가득 차면 작업을 즉시 실행합니다. 기본 크기는 256 (1 << 8)이지만 두 배가되는 조건이있는 것 같습니다. 팀 내에서 작업 대기열이 얼마나 정확하게 구성되었는지는 확실하지 않습니다.

다음을 참조하십시오. kmp_tasking.cpp, TASK_NOT_PUSHED을 찾습니다.