多核处理器真的并行执行工作吗?



我处理线程和相关主题,如:进程,上下文切换…我明白,在一个多核处理器的系统上,多个进程的实际工作是不真实的。由于进程上下文的切换,我们对这样的工作只有一个错觉。

但是,运行在多核处理器上的一个进程中的线程呢?它们是真的同时起作用,还是只是一种错觉?具有2个硬件核心的处理器可以同时在两个线程上工作吗?如果不是,多核处理器又有什么意义呢?

与2硬件处理器核可以工作在两个线程一次吗?

是的,…

…但是,想象一下你回到维多利亚时代,雇佣一群职员来执行复杂的计算。他们需要的所有数据都在一本书里,他们应该把所有的结果都写回同一本书里。

书就像计算机的存储器,而职员就像单个的中央处理器。因为只有一个职员可以使用这本书在任何给定的时间,那么它可能看起来好像是没有意义的不止一个,…

…除非你给每个职员一个记事本。他们可以去本子,复制一些数字,然后在他们自己的记事本上工作一段时间,然后再从记事本上复制部分结果到本子上。这使得其他职员可以在任何一个职员在看书的时候做一些有用的工作。

记事本就像计算机的一级缓存——相对较小的高速内存区域,与单个CPU相关联,保存从主存读取或需要写回主存的数据副本。计算机硬件根据需要自动在主存和缓存之间复制数据,因此程序甚至不必知道缓存的存在。(参见https://en.wikipedia.org/wiki/Cache_coherence)

但是,程序员应该意识到:如果您可以构建您的程序,使不同的线程将大部分时间用于读写私有变量,而相对较少的时间用于访问与其他线程共享的变量,那么大多数私有变量访问将不会超过L1缓存,并且线程将能够真正并行运行。另一方面,如果所有线程都试图同时使用相同的变量,或者如果所有线程都试图迭代大量数据(大到无法全部放入缓存中),那么它们并行工作的能力就会大大降低。

参见:

https://en.wikipedia.org/wiki/Cache_hierarchy

多核实际上并行执行工作(至少在所有主流现代CPU架构上)。进程有一个或多个线程。操作系统调度器将活动任务(通常是线程)调度到可用的内核。当活动任务多于可用内核时,操作系统使用抢占,以便在每个内核上并发执行任务。

在实践中,软件应用程序可以执行同步,这可能导致一些核心在给定的一段时间内处于非活动状态。硬件操作也可能导致这种情况(例如。等待内存数据被检索,执行原子操作)。

此外,在现代处理器上,物理内核通常被分割成多个硬件线程,每个线程可以执行不同的任务。这被称为SMT(又名超线程)。在最近的x86处理器上,同一个核心的2个硬件线程可以同时并行执行2个任务。任务可以共享部分物理内核,例如执行单元,因此对于某些任务(通常是那些没有完全使用处理器内核的任务),使用2个硬件线程可能比1个更快。

拥有两个不能真正并行运行但以低粒度并发运行的硬件线程仍然有利于性能。事实上,很长一段时间(过去十年)都是如此。例如,当一个任务被延迟绑定(如。等待从RAM检索数据),则可以安排另一个任务来做一些工作,从而提高整体效率。这是SMT的最初目标。对于同一核心上的被抢占的任务也是如此(尽管粒度需要大得多):一个进程可以执行网络操作并被抢占,这样另一个进程可以在再次被抢占之前完成一些工作,因为从网络接收数据。