2012-01-31 142 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附近找到一些东西。

再一次它取决于很多事情,所以我很快就飞过了发生的事情。