2012-01-31 104 views
2

我有一個應用程序,其中pthread_join是瓶頸。我需要幫助來解決這個問題。pthread_join正在成爲瓶頸

void *calc_corr(void *t) { 
     begin = clock(); 
     // do work 
     end = clock(); 
     duration = (double) (1000*((double)end - (double)begin)/CLOCKS_PER_SEC); 
     cout << "Time is "<<duration<<"\t"<<h<<endl; 
     pthread_exit(NULL); 
} 

int main() { 
     start_t = clock(); 

     for (ii=0; ii<16; ii++) 
      pthread_create(&threads.p[ii], NULL, &calc_corr, (void *)ii); 

     for (i=0; i<16; i++) 
      pthread_join(threads.p[15-i], NULL); 

     stop_t = clock(); 

     duration2 = (double) (1000*((double)stop_t - (double)start_t)/CLOCKS_PER_SEC); 
     cout << "\n Time is "<<duration2<<"\t"<<endl; 

     return 0; 
} 

在線程功能打印的時間爲40毫秒範圍 - 60ms的其中在主功能打印的時間是在650ms - 670ms。具有諷刺意味的是,我的串行代碼在650ms - 670ms時間內運行。我能做些什麼來減少pthread_join所花費的時間?

在此先感謝!

+4

16 * 40ms = 640ms。我懷疑這是巧合。你有多少個核心? – ildjarn 2012-01-31 22:30:20

+0

打印出calc_corr中的所有開始和結束時鐘,並查看第一次開始時鐘和最後一次結束時鐘之間的區別。我敢打賭,你會發現大部分時間都花在等待至少一個或多個線程上。 – Arelius 2012-01-31 22:31:51

+0

我有8個內核,我使用pthread_setaffinity_np爲每個內核綁定2個線程。 – akhil28288 2012-01-31 22:32:08

回答

10

在Linux上,clock()測量組合CPU時間。 它不測量掛牆時間。

這就是爲什麼你得到~640 ms = 16 * 40ms。 (在評論中指出)

要測量牆的時候,你應該可以使用像這樣的東西:

+0

或'clock_gettime(CLOCK_REALTIME,...)'分辨率爲納秒。 – 2012-01-31 22:33:58

+0

謝謝,補充說,回答。 – Mysticial 2012-01-31 22:35:59

+0

謝謝。我會試試這個。 – akhil28288 2012-01-31 22:36:59

1

通過創建一些線程您要添加的開銷到您的系統:創建時間,計劃時間。創建線程需要分配堆棧等;調度意味着更多上下文切換另外,pthread_join suspends execution of the calling thread until the target thread terminates。這意味着你想爲線程1完成,當他你儘可能快地但不是即刻重新調度,然後你等待線程2,等等...

現在你的計算機有幾個核心,像一個或2個,並且你正在創建16個線程。程序中至多有2個線程會同時運行,只需添加他們的時鐘測量值,您就可以在400 ms附近找到一些東西。

再一次它取決於很多事情,所以我很快就飛過了發生的事情。