2017-04-13 7 views
1

오랜 시간 전에 OpenMP를 사용하여 C++ 프로그램을 작성했습니다. Suddnely, 질문이 내 마음에 들어온다.OpenMP는 중첩 된 루프 인스턴스의 수를 어떻게 알 수 있습니까?

"OpenMP는 얼마나 많은 루프 인스턴스가 중첩되어 있는지 알 수 있습니까?"

컴파일러에서 명시 적으로 계산합니까?

+0

'#pragma omp for collapse (n)'은 [specification] (http://www.openmp.org/wp-content/uploads/openmp-4.5.pdf)를 참조하십시오. –

답변

2

OpenMP 런타임은 스레드 로컬 변수에서이 정보를 추적합니다.

아마도 가장 인기있는 OpenMP 구현 중 하나 인 libgomp은 오픈 소스 일 것입니다. 즉, 문서뿐만 아니라 소스 코드도 완전히 읽을 수 있다는 의미입니다.

omp_get_level()의 구현 here이다

int 
omp_get_level (void) 
{ 
    return gomp_thread()->ts.level; 
} 

gomp_thread()의 구현 here이다. 스레드 로컬 구조에 대한 포인터를 검색합니다.

[...] 
    /* Nesting level. */ 
    unsigned level; 

    /* Active nesting level. Only active parallel regions are counted. */ 
    unsigned active_level; 
    [...] 

언제 #pragma omp parallel 사용은, 컴파일러가 서브 기능에 평행 한 단면의 몸체를 추출하고 복잡한를 생성

#if defined __nvptx__ 
extern struct gomp_thread *nvptx_thrs __attribute__((shared)); 
static inline struct gomp_thread *gomp_thread (void) 
{ 
    int tid; 
    asm ("mov.u32 %0, %%tid.y;" : "=r" (tid)); 
    return nvptx_thrs + tid; 
} 
#elif defined HAVE_TLS || defined USE_EMUTLS 
extern __thread struct gomp_thread gomp_tls_data; 
static inline struct gomp_thread *gomp_thread (void) 
{ 
    return &gomp_tls_data; 
} 
#else 
extern pthread_key_t gomp_tls_key; 
static inline struct gomp_thread *gomp_thread (void) 
{ 
    return pthread_getspecific (gomp_tls_key); 
} 
#endif 

데이터 구조 tscontains 타인의 사이 struct gomp_team_state 인 궁극적으로 gomp_team_start()으로 이어지는 함수 호출 모음.이 중 contains :

+1

감사합니다! 그래서 openmp 런타임 라이브러리가 중첩의 활성 레벨을 추적하는 방법입니다. 물론 openmp의 사전 컴파일러는 gomp_teat_start()로 이어지는 컴파일 된 함수 호출을 생성 할 때 중첩 된 루프의 수를 알고 있습니다. 요약하면 active_level은 런타임에 계산됩니다. 정적으로, openmp pre-compiler는 루프에 대한 분석을 수행하고 루프 카운트를 찾을 수 있습니다. – syko

+0

질문이 잘못 제기되지 않는 한 병렬 영역의 중첩 및 루프가 아니기 때문에 이것은 실제로 질문에 대답하지 않습니다. –

+0

@HristoIliev 질문에 대한 나의 해석은 "중첩 수준"은 전역 (콜 스택) 또는 로컬 (단일 함수 내)의 C 언어 용 'for'루프 수준을 참조 할 수 없다는 것입니다. C 언어는이를 전 세계적으로 추적하지 않습니다. 컴파일러는 함수 내에서 로컬 중첩 수준에 쉽게 액세스 할 수 있지만 프로그래머도 마찬가지입니다. 그래서 이것은 글로벌 OpenMP 개념이었으며, OpenMP에서 유일하게 비슷한 개념은'omp_get {_active} _level()'의 반환 값입니다. 나는 그것이 '#pragma omp parallel'레벨을 계산한다는 것을 지적했지만,'parallel'은'for' 인스턴스와 관련된 빈번 (항상 그런 것은 아니지만!)입니다. –