我的意思是,在操作系统的实现中,什么机制可以完成这项工作?例如,在Linux内核中?或者,正如我们所知,有一些工具可以方便地实现这一点,比如Windows任务管理器,但是内部机制是什么呢?
发布于 2013-03-13 18:45:14
快速回答
在Linux中,需要查看的是sched_setaffinity()或pthread_setaffinity_np()。
较长的应答
您需要合理地注意核心亲和性(即指定某个核心的进程/线程)。现代的CPU和OSes做了各种各样的事情,使得在一般情况下没有必要摆弄核心亲和力,如果你摆弄并弄错了,它们可能会开始对你不利。
示例
在双芯片i7平台上,它确实会变得相当复杂。在这样的平台上,超线程意味着BIOS报告16个核心,其中只有8个是真实的。将两个线程绑定到一个核心及其超线程的另一个自我很容易导致两个缓慢的线程。
此外,内存通常在两个芯片之间交错,一次4kpage (另一种BIOS设置)。因此,将线程绑定到特定的核心可能会使其进一步远离正在操作的数据;这可能会使两个芯片之间的QPI链路过载,并使所有操作变慢。顺便说一句,你也可以在本地为芯片分配内存,看看this。这是一个复杂的话题,但你也可能不得不接受它。
一般来说,线程及其内存跨机器内核、芯片和SIMM的最佳部署是特定于每台PC的。例如,假设一台机器中有两个i7s;最佳部署取决于插入了多少内存SIMM。这些都是操作系统很清楚的事情,它通常会在移动线程方面做得很好,以获得最佳性能。
你必须有一个非常特殊的环境,在那里你会发现自己做分发更好。除非你有一个非常固定的硬件配置,否则你必须编写你的应用程序,这样它就可以在每次运行时确定它自己的最佳部署。这是大量的编程工作。
摘要
简而言之,通常最好的办法就是不去管它。
英特尔做了什么
让我们退后一步,看看英特尔目前的设计背后隐藏着什么哲学,其中存在两个或更多芯片。
英特尔认为,一般来说,计算机在不同的数据集上一次完成许多不同的任务,线程和进程之间只有少量的数据共享。这允许他们使用QPI来综合SMP架构,将它们的CPU绑定到一个公共内存映射中(否则它将是严格的NUMA,而不是SMP)。在一般情况下,这会提供出色的性能。当然,AMD早在几年前就得出了同样的结论,并使用Hypertransport来实现它。
重要的是,就应用程序和操作系统而言,它也提供了简单性,因为整个机器中的每个内核都可以看到整个内存,即使只是间接地通过QPI。
规则的例外
然而,如果应用程序的本质是一个由每个核心上的线程处理的海量数据集,那么QPI上的内存远程可能会成为一个问题。该体系结构必须跨所有CPU维护缓存一致性,因此QPI链路最终可能会受到内存访问和缓存一致性流量的影响。例如,在我使用的平台上,QPI只有19 to /s,而每个CPU的三个内存条都有25 to/s。这种情况在英特尔较新的芯片上可能有所改变。
在这种情况下,将这两个芯片视为NUMA架构可能会更好。这可以通过分配数据集NUMA的两个副本来完成,这样每个CPU都有它自己的副本。还可以让线程只处理本地内存。这减轻了QPI链接的负担。
绕过芯片行为的工作
如果一个人在这种程度上进行优化,那么他很快就会开始不喜欢现代CPU架构中内置的泛化。例如,缓存对加载什么数据、何时加载以及何时更新RAM和其他缓存做出假设。一般来说,这是很好的,但有时人们知道更好。
对我来说,最好的CPU是PlayStation3中使用的Cell处理器,它的8个数学核心中没有缓存,所以没有缓存一致性,什么都没有。程序员唯一的责任是让DMA引擎(我希望Intel也包括在内)在正确的时间将数据移动到正确的位置,以便由正确的代码处理。或者,可以将数据留在原来的位置,然后将代码DMA到数据。它非常复杂,需要大量的脑力,但如果做对了,你可以获得巨大的数学性能(200GFLOPs在2005年;远远领先于英特尔)。
究竟哪种哲学是正确的呢?嗯,英特尔正在抨击Core这个和Xeon那个,而Cell正在垂死/死亡。事实证明,没有多少程序员能够通过自己控制一切来获取最佳性能。
https://stackoverflow.com/questions/15364805
复制相似问题