了解多核SMP系统

时间:2012-05-13 20:59:54

标签: c linux multithreading multicore

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

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

enter image description here

但为什么在 N 线程之间切换要比逐个运行 N 线程更快?如何在只有一个CPU的系统上进行线程处理?

接下来,什么是点或多核编程?我认为重点是在核心之间拆分线程并在它们之间拆分任务?但是,如何在4个CPU的系统上平分8个线程呢?

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

processor affinity如何帮助,它有什么帮助?我们如何为多核系统使用 CPU缓存编程?

为什么像MySQL这样的大型项目如此难以充分利用多CPU系统的优势?

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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

CPU缓存会自动使用,您通常无需执行任何特殊操作即可使用它。也许最常见的例外是处理错误共享或缓存ping-ponging。