Parallel processing 线程越多,速度越慢,即使有足够的CPU内核

Parallel processing 线程越多,速度越慢,即使有足够的CPU内核,parallel-processing,Parallel Processing,我得到了一个可以启动任意数量线程的应用程序,每个线程执行相同的任务:遍历一个包含5000条消息的向量,然后处理其中的每一条 在线程之间,没有资源竞争,根本没有竞争条件。在我运行应用程序的盒子上有4个cpu核。在我运行应用程序时,没有其他进程正在执行任何CPU消耗任务 然而,我得到的结果如下 如果只有一个线程在运行,那么线程需要0.45秒来处理这5000条消息 如果有4个线程在运行,那么每个线程大约需要0.55秒来处理这些消息,增幅超过20% 如果有更多的消息要处理,比如150000条消息,那么运

我得到了一个可以启动任意数量线程的应用程序,每个线程执行相同的任务:遍历一个包含5000条消息的向量,然后处理其中的每一条

在线程之间,没有资源竞争,根本没有竞争条件。在我运行应用程序的盒子上有4个cpu核。在我运行应用程序时,没有其他进程正在执行任何CPU消耗任务

然而,我得到的结果如下

如果只有一个线程在运行,那么线程需要0.45秒来处理这5000条消息

如果有4个线程在运行,那么每个线程大约需要0.55秒来处理这些消息,增幅超过20%

如果有更多的消息要处理,比如150000条消息,那么运行1个线程或4个线程的处理时间没有差别

我不明白是什么原因导致时间增加,因为有4个线程在运行,有4个CPU内核,足够4个线程

为什么在处理时间更长的情况下没有时间增加


我使用Linux2.6.26进行了测试。自2.6.18以来,调度程序已得到改进。我也用2.6.18做了同样的测试,当有4个线程在运行时,结果更糟,这证明调度程序做了改进

线程在IO绑定进程中带来最大的好处。但是,根据您描述的设置,性能下降20%可能是您的线程在某些库/系统调用中遇到争用的迹象。

线程并不能神奇地使您的应用程序更快。我理解这一点。但在我的例子中,每个线程应该能够在不同的内核上运行,并且根本不存在争用条件。所有线程的运行速度应该和只有线程运行时一样快,不是吗?有没有检测争用的方法?“新建”操作是否算作“系统调用上的争用”?如果执行大量分配,“新建”肯定是一个多线程瓶颈。避免这种情况的最好方法是每个线程有一个堆。请看,我使用valgrind(callgrind)来运行我的应用程序,我所能看到的是每次调用的计时都会增加。我使用valgrind(callgrind)来运行我的应用程序,callgrind的结果以百分比表示,因此如果一个线程调用十个方法,结果将是method1消耗总时间的10%,方法2消耗了20%的时间。当我将线程数从1增加到4时,结果几乎没有变化,这意味着每次调用花费的时间增加了相同的百分比。如果存在争用,我应该能够看到某些方法消耗更多的时间。如果“new”是问题所在,我应该能够看到“new”操作消耗更多的时间,但我没有看到。我还做了一个简单的测试,分别在1个线程和4个线程中运行“new char[100]”100万次。时间是一样的,这意味着“新”不是问题所在。大概我不确定。太多的秘密。