Parallel processing 每个内核的最佳线程数

Parallel processing 每个内核的最佳线程数,parallel-processing,cpu,Parallel Processing,Cpu,假设我有一个4核CPU,我想在最短的时间内运行一些进程。该进程是理想的并行化进程,因此我可以在无限多个线程上运行它的块,每个线程占用的时间相同 由于我有4个内核,我不希望通过运行比内核更多的线程来提高速度,因为单个内核在给定时刻只能运行单个线程。我对硬件了解不多,所以这只是一个猜测 在比内核更多的线程上运行并行化进程是否有好处?换句话说,如果我使用4000个线程而不是4个线程来运行进程,进程是否会更快、更慢或在大约相同的时间内完成?理想情况是每个核心1个线程,只要没有任何线程阻塞 有一种情况可能

假设我有一个4核CPU,我想在最短的时间内运行一些进程。该进程是理想的并行化进程,因此我可以在无限多个线程上运行它的块,每个线程占用的时间相同

由于我有4个内核,我不希望通过运行比内核更多的线程来提高速度,因为单个内核在给定时刻只能运行单个线程。我对硬件了解不多,所以这只是一个猜测


在比内核更多的线程上运行并行化进程是否有好处?换句话说,如果我使用4000个线程而不是4个线程来运行进程,进程是否会更快、更慢或在大约相同的时间内完成?

理想情况是每个核心1个线程,只要没有任何线程阻塞


有一种情况可能不是这样的:内核上运行着其他线程,在这种情况下,更多的线程可能会给程序带来更多的执行时间。

实际性能将取决于每个线程的执行时间。例如,如果线程根本不做I/O,也不使用系统服务(即,它们100%受cpu限制),那么每个核心1个线程是最佳的。如果线程执行任何需要等待的操作,那么您必须进行实验以确定最佳线程数。4000个线程将产生巨大的调度开销,因此这可能也不是最优的。

如果您的线程不执行I/O、同步等操作,并且没有其他运行,那么每个核心1个线程将获得最佳性能。然而,情况很可能并非如此。添加更多线程通常会有所帮助,但过了一段时间后,它们会导致性能下降

不久前,我在一台2核四核机器上进行性能测试,该机器在Mono上运行ASP.NET应用程序,负载相当可观。我们使用了最小和最大线程数,最后我们发现,对于特定配置中的特定应用程序,最佳吞吐量介于36到40个线程之间。那些边界之外的任何东西都表现得更糟。吸取的教训?如果我是你,我会用不同数量的线程进行测试,直到你找到适合你的应用程序的线程


有一件事是肯定的:4k线程将花费更长的时间。这是大量的上下文切换。

4000个线程一次相当高

答案是肯定的和否定的。如果您在每个线程中执行大量阻塞I/O,那么肯定的,您可能会显示出显著的加速,每个逻辑核最多可以执行3或4个线程

然而,如果你没有做很多阻塞的事情,那么线程的额外开销只会使它变慢。因此,使用一个剖面仪,查看瓶颈在每个可能平行的部分中的位置。如果您正在进行繁重的计算,那么每个CPU超过1个线程将无济于事。如果你正在做大量的内存传输,这也不会有帮助。如果您正在进行大量的I/O操作,例如磁盘访问或internet访问,那么多线程将在一定程度上有所帮助,或者至少使应用程序更具响应性。

基准测试

我会开始增加一个应用程序的线程数,从1开始,然后到100左右,对每个线程数运行三个五个测试,并为自己构建一个运行速度与线程数的关系图

您应该知道,四线程的情况是最佳的,之后运行时略有上升,但可能不是。这可能是因为您的应用程序带宽有限,也就是说,加载到内存中的数据集非常大,会出现大量缓存未命中等情况,因此2个线程是最佳的


在测试之前,您无法知道。从计算和内存限制的角度来看(科学计算),4000个线程将使应用程序运行非常缓慢。问题的一部分是上下文切换的开销非常高,而且很可能是内存局部性非常差


但这也取决于您的体系结构。我听说尼亚加拉处理器应该能够使用某种先进的流水线技术在一个内核上处理多个线程。但是,我没有使用这些处理器的经验。

大量线程(“线程池”)与每个内核一个线程的一个例子是在Linux或Windows中实现web服务器

由于套接字是在Linux中轮询的,因此许多线程可能会增加其中一个线程在正确时间轮询正确套接字的可能性,但总体处理成本将非常高

在Windows中,服务器将使用I/O完成端口(IOCP)实现,这将使应用程序事件驱动:如果I/O完成,操作系统将启动一个备用线程来处理它。当处理完成时(通常使用请求-响应对中的另一个I/O操作),线程返回IOCP端口(队列)等待下一次完成

如果没有I/O完成,则没有要执行的处理,也没有启动线程


事实上,在IOCP实现中,微软建议每个核心不超过一个线程。任何I/O都可以连接到IOCP机制。如有必要,IOC也可以由应用程序发布。

我同意@Gonzalo的回答。我有一个不做I/O的进程,下面是我的发现:

请注意,所有线程都在一个数组上工作,但范围不同(两个线程不访问相同的索引),因此如果它们在不同的数组上工作,结果可能会有所不同

1.86机器是带有SSD的macbook air。另一个mac是带有普通硬盘的iMac(我想是7200 rpm)。windows机器也有7200 rpm硬盘


在这个测试中,最佳数量等于机器中的磁芯数量。

我知道这个问题已经很老了,但自2009年以来,情况发生了变化

现在需要考虑两件事:内核的数量和线程的数量
man ps
sudo apt-get install htop
yum install htop
dnf install htop      [On Fedora 22+ releases]