我试图了解多核系统是如何工作的,以及如何为具有多核的系统编写高效的程序。我知道这是个很难的话题,但我对最快的解决方案很感兴趣。
首先,我试图了解线程是如何工作的。很明显,在大多数情况下多线程可以显着地提高性能。根据这页面,这就是多线程的工作方式:

但是为什么在N线程之间切换比只一个一个地运行N线程要快呢?线程如何在只有一个CPU的系统上工作?
接下来,点或多核编程是什么?我假设重点是在内核之间拆分线程,并在它们之间拆分任务?但是,如何在4CPU的系统上平分8个线程呢?
我是否必须使用(cpu_affinity)将threads/processes拆分为处理器亲和力?我可以使用系统上的pthread_create和4个CPU创建4个线程来在每个CPU上运行每个线程吗?
超线程化是如何起作用的,它到底有什么帮助?如何将CPU缓存编程用于多核系统?
为什么像MySQL这样的大型老项目很难充分利用多CPU系统的优势呢?
我对这个问题的理论感兴趣,也对Linux系统的实际解决方案/示例/项目/书籍/文章感兴趣(使用C)。
我知道这是一个越来越重要的话题,我希望我不仅仅是一个感兴趣的人。
发布于 2012-05-13 21:06:07
切换N个线程和一个接一个运行N个线程之间的区别是,当线程暂时不能取得进一步的进展时会发生什么。如果您切换了N个线程,而其中一个线程暂时无法向前推进,假设它正在等待从磁盘读取数据,则另一个线程可以向前推进。如果您完全按顺序运行它们,那么当线程等待磁盘I/O完成时,CPU将被浪费。
超线程通过允许您更充分地利用CPU核心执行资源而有所帮助。例如,如果线程没有做任何浮点运算,那么该核心的浮点单元就会被浪费掉。使用超线程,另一个线程可以使用这些执行单元.
在一个典型的现代核心上,操作需要很多时钟周期,许多操作一次正在进行中。这意味着核心通常有许多额外的执行资源,在任何特定的时刻都无法使用。超线程允许使用更高比例的执行资源(桶移位器、加法器、逻辑单元、分支单元等)。通常,超线程可以提高10%到15%的性能.好处并不大,因为线程还会窃取彼此的执行资源,污染对方使用缓存,等等。
CPU缓存是自动使用的,您通常不需要做任何特殊的事情来使用它。也许最常见的例外是处理错误共享或缓存ping-ponging。
https://stackoverflow.com/questions/10575208
复制相似问题