4

我试图了解多核系统是如何工作的,以及如何为具有多核的系统编写高效的程序。我知道这是一个非常困难的话题,但我对可能的最快解决方案非常感兴趣。

首先,我试图了解线程是如何工作的。很明显,在大多数情况下,多线程可以显着提高性能。根据this page,这就是多线程的工作方式:

在此处输入图像描述

但是为什么在N个线程之间切换比一个接一个地运行N个线程要快呢?线程如何在只有一个 CPU 的系统上工作?

接下来,多核编程有什么意义?我认为重点是在内核之间拆分线程并在它们之间拆分任务?但是我怎样才能在 4 个 CPU 的系统上平均分割 8 个线程呢?

我是否必须使用处理器关联( cpu_affinity ) 在 CPU 之间拆分线程/进程?我可以在具有 4 个 CPU 的系统上使用pthread_create创建 4 个线程以在每个 CPU 上运行每个线程吗?

超线程如何提供帮助以及它是否有帮助?我们如何将CPU 缓存编程用于多核系统?

为什么对于像 MySQL 这样的大型旧项目来说,充分利用多 CPU 系统的优势如此困难?

我对这个问题的理论以及Linux系统的实际解决方案/示例/项目/书籍/文章(使用 C)感兴趣。

我知道这是一个越来越重要的话题,我希望我不仅仅是一个感兴趣的人。

4

1 回答 1

5

切换 N 个线程和一个一个地运行 N 个线程之间的区别在于,当一个线程暂时无法进一步向前推进时会发生什么。如果你切换 N 个线程并且其中一个线程暂时无法向前推进,比如说它正在等待从磁盘读取数据,另一个线程可以向前推进。如果您完全按顺序运行它们,那么当线程等待磁盘 I/O 完成时,CPU 将被浪费。

超线程可以帮助您更充分地利用 CPU 核心执行资源。例如,如果一个线程没有进行任何浮点数学运算,那么该内核的浮点单元就被浪费了。使用超线程,另一个线程可以使用这些执行单元。

在典型的现代内核上,操作需要许多时钟周期,并且一次有许多操作正在进行。这意味着一个核心通常有许多额外的执行资源,它在任何特定时刻都无法使用。超线程允许使用更高百分比的执行资源(桶式移位器、加法器、逻辑单元、分支单元等)。通常,超线程可以将性能提高 10% 到 15%。好处并没有更大,因为线程还互相窃取执行资源,污染彼此对缓存的使用,等等。

CPU 缓存是自动使用的,您通常不需要做任何特别的事情来使用它。也许最常见的例外是处理虚假共享或缓存乒乓。

于 2012-05-13T21:06:07.257 回答