2017-01-16 69 views
2

我想測量每個線程花費大量代碼的時間。我想看看我的負載平衡策略是否同等地將工人組塊分割開來。 通常情況下,我的代碼如下所示:如何測量openmp中每個線程的執行時間?

#pragma omp parallel for schedule(dynamic,chunk) private(i) 
for(i=0;i<n;i++){ 
//loop code here 
} 

UPDATE 我使用OpenMP 3.1用gcc

+0

什麼是你的編譯器(gcc/linux下,ICC,窗戶,MacOS的)和OpenMP實現?有一些openmp分析器/跟蹤解決方案...你是否想在每個「for」循環中測量線程時間,或者只需要關於線程的聚合信息? (爲什麼不在這裏添加timer_start和timer_stop以及線程本地存儲?) – osgx

+0

這更多的是測量每個線程完成每個迭代塊的時間。循環編碼看起來很有趣,你能發展嗎? – Marouen

+1

您應該使用明確支持OpenMP的性能分析工具,如Score-P/Vampir,Allinea MAP,HPCToolkit。 – Zulan

回答

2

您可以只打印每個線程的時間這樣(沒有測試過,甚至沒有編譯):

#pragma omp parallel 
{ 
    double wtime = omp_get_wtime(); 
    #pragma omp for schedule(dynamic, 1) nowait 
    for (int i=0; i<n; i++) { 
     // whatever 
    } 
    wtime = omp_get_wtime() - wtime; 
    printf("Time taken by thread %d is %f\n", omp_get_thread_num(), wtime); 
} 

NB的nowait比刪除barrierfor循環結束,否則這不會有任何興趣。

病程的同時,使用適當的分析工具是一種更好的方法......

+0

工作得很好,只需在wtime中糾正小寫字母t即可。謝謝。 – Marouen