2017-10-16 52 views
1

按照libgomp手冊,形式代碼:無法理解libgomp實現FOR結構

#pragma omp parallel for 
for (i = lb; i <= ub; i++) 
    body; 

成爲

void subfunction (void *data) 
{ 
    long _s0, _e0; 
    while (GOMP_loop_static_next (&_s0, &_e0)) 
    { 
    long _e1 = _e0, i; 
    for (i = _s0; i < _e1; i++) 
     body; 
    } 
    GOMP_loop_end_nowait(); 
} 

GOMP_parallel_loop_static (subfunction, NULL, 0, lb, ub+1, 1, 0); 
subfunction (NULL); 
GOMP_parallel_end(); 

我做了一個非常微小的程序調試只是爲了看看此實現原理:

int main(int argc, char** argv) 
{ 
    int res, i; 
    # pragma omp parallel for num_threads(4) 
    for(i = 0; i < 400000; i++) 
     res = res*argc; 

    return 0; 
} 

接下來,我跑了GDB,並設置斷點 「GOMP_parallel_loop_static」 和「GOMP _parallel_end」。開始時,圖書館沒有裝入,所以他們正在等待。到時候一跑了GDB內部測試程序,我得到下面的結果:

(gdb) run 2 1 6 5 4 3 8 7 
Starting program: ./test 2 1 6 5 4 3 8 7 
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib/x86_64-linux- 
gnu/libthread_db.so.1". 
[New Thread 0x7ffff73c9700 (LWP 5381)] 
[New Thread 0x7ffff6bc8700 (LWP 5382)] 
[New Thread 0x7ffff63c7700 (LWP 5383)] 

Thread 1 "test" hit Breakpoint 2, 0x00007ffff7bc0c00 in GOMP_parallel_end() from /usr/lib/x86_64-linux-gnu/libgomp.so.1 

正如你所看到的,它達到了第二個斷點,在「GOMP_parallel_end」,但不是第一個。我想知道如果libgomp手冊清楚地顯示「GOMP_parallel_loop_static」是第一個,這怎麼可能。

謝謝。

+0

您以錯誤的順序得到了'main'的形參'argv'和'argc'。 – tschwinge

回答

1

海灣合作委員會文件的這部分內容並沒有真正定期更新,所以最好只將其看作是近似實際發生的情況。如果您對這一級別的細節感興趣,我建議您查看由-fdump-tree-all和類似選項生成的調試文件。

使用最近的GCC版本,您的示例將生成__builtin_GOMP_parallel的調用,該調用映射到GOMP_parallel。那個人最後在內部叫GOMP_parallel_end,所以這就是你所看到的,我想。

void 
GOMP_parallel (void (*fn) (void *), void *data, unsigned num_threads, unsigned int flags) 
{ 
    num_threads = gomp_resolve_num_threads (num_threads, 0); 
    gomp_team_start (fn, data, num_threads, flags, gomp_new_team (num_threads)); 
    fn (data); 
    ialias_call (GOMP_parallel_end)(); 
} 

當然,更新文檔的補丁很樂意接受。 :-)