了解多核SMP系统[已关闭]

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

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

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

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

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

hyper-threading如何帮助并且它有什么帮助?我们如何为多核系统使用CPU缓存编程?

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

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

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

解决方法:

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

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

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

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

上一篇:关于python多处理的初学者问题?


下一篇:python – 线程可以切换CPU吗?