【发布时间】:2015-04-17 07:39:21
【问题描述】:
如何估算值得生成新线程的最少工作量?我主要对 C++11 std::thread 感兴趣。
详细说明。我试图加速我们的应用程序,因此我继续并行化一个低级函数,该函数在循环中执行非常少且简单的操作(例如不等式和赋值)。不过,此功能在应用程序中是最耗时的。因此,我尝试并行化循环,为循环的两个连续索引生成两个线程,但这会降低性能(我不能准确地说出减速因素,但它可能是 100 倍左右)。
【问题讨论】:
-
你看过openmp吗? bisqwit.iki.fi/story/howto/openmp 我发现它通常比在一个全新的线程中生成更容易使用,特别是如果你只需要在这里和那里加速循环。
-
两个连续的索引 听起来很像 虚假共享> 或缓存抖动。您的处理器缓存根本不会喜欢它,可能永远不会有任何加速。更好地将循环分成连续的区域并将线程分配给这些区域。例如。前半部分到第一个线程,后半部分到第二个线程。
-
不要产生新线程,将任务分配给现有线程。如果您关心性能,请重复使用您的线程。
-
@BasinhetVeld 这将是我的下一次尝试,谢谢。
-
@PaoloM 您可以实现
std::function对象的线程安全、可等待队列,并让线程从该队列中拉出并执行该对象。
标签: c++ multithreading c++11 stdthread