2017-04-13 80 views
1

我很久以前在編寫C++程序時使用了OpenMP。突然,一個問題出現在我的腦海裏。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。它檢索一個指向線程局部結構的指針。

#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 

的數據結構tsstruct gomp_team_state的是,除其他外,contains

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

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

每當#pragma omp parallel被使用時,編譯器提取並行部分的主體成一子功能併產生複雜一套函數調用最終導致gomp_team_start(),其中contains

#ifdef LIBGOMP_USE_PTHREADS 
void 
gomp_team_start (void (*fn) (void *), void *data, unsigned nthreads, 
       unsigned flags, struct gomp_team *team) 
{ 

    [...] 

    ++thr->ts.level; 
    if (nthreads > 1) 
    ++thr->ts.active_level; 
+1

謝謝!所以這是openmp運行時庫如何跟蹤活動級別的嵌套。當然,用於openmp的預編譯器知道在構造導致gomp_teat_start()的複雜函數調用時嵌套了多少個循環。 總之,active_level在運行時計數。靜態地,openmp預編譯器對循環執行分析並且可以找到循環計數 – syko

+0

這並沒有真正回答這個問題,因爲它涉及並行區域的嵌套而不是循環,除非問題被嚴重地提出。 –

+0

@HristoIliev我對這個問題的解釋是,「嵌套級別」無法引用全局(callstack)或局部(單個函數內)的循環級別的C語言。 C語言不會全局跟蹤它。編譯器對函數中的本地嵌套級別具有普通訪問權限,但程序員也是如此。所以這必須是一個全局的OpenMP概念,OpenMP中唯一類似的概念是'omp_get {_active} _level()'的返回值。我指出它計數'#pragma omp parallel'的水平,但'parallel'經常(但並非總是)與'for'實例關聯。 –