【发布时间】:2012-01-31 22:27:24
【问题描述】:
我有一个应用程序,其中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;
}
thread函数打印的时间在40ms - 60ms的范围内,而main函数打印的时间在650ms - 670ms。具有讽刺意味的是,我的串行代码在 650ms - 670ms 时间内运行。我可以做些什么来减少pthread_join所花费的时间?
提前致谢!
【问题讨论】:
-
16 * 40ms = 640ms。我怀疑这是巧合。你有多少个核心?
-
打印出所有在 calc_corr 中记录的开始和结束时间,看看第一次记录在 begin 和最后一次记录在 end 之间的区别。我敢打赌,您会发现大部分时间都花在等待至少一个或多个线程上。
-
我有 8 个内核,我使用 pthread_setaffinity_np 为每个内核绑定 2 个线程。
-
你有几个核心? ......其中有多少可以使用?您是否验证了不同的线程没有有效地运行序列化?也就是说,您可能还想打印不同线程的开始/结束时间。考虑到首先启动的线程比其他线程有更多的工作机会,按照它们启动的顺序收集线程也是值得的。
-
您的主要时间计算也为 16 个线程进行 cout 打印付出了开销。您不应该在时间戳内完成任何打印
标签: c++ multithreading performance pthreads