选择用于并行处理数据的最佳线程数


问题内容

假设我有一个处理100万个句子的任务。

对于每个句子,我都需要对其进行处理,而这与处理它们的顺序无关。

在我的Java程序中,我从我的主要工作分区中划分出一组期货,并带有一个可调用对象,该可调用对象定义了要在大量句子上完成的工作单元,并且我正在寻找一种优化线程数量的方法分配大量的句子来工作,然后重新组合每个线程的所有结果。

在我看到收益递减之前,我可以使用的最大线程数将使我在速度方面达到最佳性能?

另外,是什么原因导致分配更多线程(即可以一次执行更多线程)的逻辑不正确?


问题答案:

在实践中,可能很难找到最佳线程数,并且即使每次运行程序,该线程数也可能会有所不同。因此,从理论上讲,最佳线程数将是您计算机上具有的 内核
数。如果您的内核是“超线程”(如英特尔所说),则每个内核可以运行2个线程。然后,在这种情况下,最佳线程数是计算机上内核数的两倍。

Also, what causes the logic that the more threads allocated, i.e. 
more being able to be done at once, to be incorrect?

分配更多线程导致并发完成更多工作的原因是错误的,因为每个内核一次只能运行1个(如果内核为“超线程”,则为2个线程)。

因此,假设我有一台没有超线程的四核计算机。在这种情况下,我最多可以同时运行4个线程。因此,我的最大吞吐量应该通过4个线程来实现。假设我尝试在同一设置上运行8个线程。在这种情况下,内核将来回调度这些线程(通过上下文切换),并
阻塞 一个线程以使另一个线程运行。因此,最多可以同时运行4个线程的工作。

有关此的更多信息,使用Linux内核查找“上下文切换”将非常有帮助。这将为您提供有关此主题的所有信息。

另外,请注意,在称为“用户级线程”和“内核级线程”的线程之间存在差异。如果您进一步研究此主题,则这是一个重要的区别,但这不在此问题的范围内。