【问题标题】:pthread_join is being a bottleneckpthread_join 是一个瓶颈
【发布时间】: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


【解决方案1】:

在 Linux 上,clock() 测量综合 CPU 时间。 它不测量挂墙时间。

这就解释了为什么你会得到~640 ms = 16 * 40ms。 (如 cmets 中所指出的)

要测量挂墙时间,你应该使用类似的东西:

【讨论】:

  • clock_gettime(CLOCK_REALTIME, ...) 获得纳秒级分辨率。
  • 谢谢,添加回答。
【解决方案2】:

通过创建一些线程,您会增加系统开销:创建时间、调度时间。创建线程需要分配堆栈等;调度意味着更多的上下文切换。另外,pthread_join suspends execution of the calling thread until the target thread terminates。这意味着您希望线程 1 完成,当他完成时,您会尽快但不是立即重新安排,然后您等待线程 2,等等...

现在您的计算机的内核很少,例如 1 个或 2 个,而您正在创建 16 个线程。充其量您的程序的 2 个线程将同时运行,只需添加它们的时钟测量值,您就可以在 400 ms 周围找到一些东西。

再一次,这取决于很多事情,所以我很快就了解了正在发生的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 2011-01-31
    相关资源
    最近更新 更多