2013-03-12 70 views
1

我的意思是,在一个操作系统的实现中,什么机制可以完成这项工作?例如在Linux内核中?或者,我们都知道有一些工具可以方便地实现这一点,比如Windows任务管理器,但内部机制是什么?如何在多核环境中将进程/线程指定给某个核心?

+0

你问有关如何以编程设置的亲和力,或如何亲和力在内核中实现?目前尚不清楚。 – 2013-03-12 15:16:28

+0

感谢您的关注。我的意思是如何亲和力在内核中实现。 – troore 2013-03-13 14:31:31

回答

1

快速解答

在Linux上用了sched_setaffinity()或pthread_setaffinity_np(),你需要看看。

再回应

你需要合理的谨慎与核心相关性(即指定进程/线程的某些核心)。现代的CPU和操作系统可以做各种事情,以避免在一般情况下不需要核心关联,如果你弄错了并且弄错了它们,它们可能会开始对付你。

在双芯片i7平台就可以得到相当复杂的确实。在这样的平台上,超线程意味着BIOS报告16个内核,其中只有8个是真实的。将两个线程绑定到一个核心以及它的超线程后备自我很容易导致两个缓慢的线程。

另外内存通常在两个芯片之间交错,每次4k页(另一个BIOS设置)。因此,将线程绑定到特定内核可以使其远离正在运行的数据;这可能会使两个芯片之间的QPI链接超载并使所有内容放慢速度。顺便说一句,你也可以分配一个芯片的本地内存,看看this。这是一个复杂的话题,但你也可能不得不接受。

一般来说,线程及其内存在机器内核,芯片和SIMM上的最佳部署是特定于每台PC的。例如,考虑一台机器中的两个i7;最佳的部署取决于已插入多少内存SIMM。这些是操作系统很清楚的事情,它通常在移动线程以获得最佳性能方面做得相当不错。

你必须有一个非常特殊的设置环境,你会发现自己做分销更好。除非你有一个非常固定的硬件配置,否则你必须编写你的应用程序,以便它在每次运行时都能确定自己的最佳部署。这是很多编程工作。

摘要

总之,它通常最好适可而止。

什么英特尔已经做

让我们退后一步了一下,看的背后是英特尔目前的设计,其中两个或更多芯片都存在什么样的理念。

英特尔决定,一般情况下,计算机在不同的数据集上一次完成许多不同的任务,只需要在线程和进程间共享适度的数据。这允许他们综合使用QPI的SMP架构将它们的CPU绑定到一个公共存储器映射中(否则它将严格为NUMA,而不是SMP)。在一般情况下,这可以提供出色的性能。当然,AMD早在几年前就得出了相同的结论,并且使用Hypertransport来实现它。

重要的是它还提供了简单,只要应用程序和操作系统而言,因为整个机器的每个核心可以通过QPI看到整个的记忆,哪怕只是间接的。

规则的例外

然而,如果应用程序的性质是通过在每个核中的线程正在处理大规模数据集然后内存在QPI该遥远可能是一个问题。架构必须保持所有CPU的高速缓存一致性,因此QPI链路可能最终会因内存访问和高速缓存一致性流量而崩溃。例如,在我使用QPI的平台上,只有19GB/s,而每个CPU对其三个内存组都有25GB/s。这可能已经改变了来自英特尔的更新芯片。

在这种情况下,它可能会更好,如果他们NUMA架构来处理两个芯片。这可以通过分配数据集NUMA的两个副本来完成,以便每个CPU都拥有自己的副本。也可以让线程只处理本地内存。这减轻了QPI链接的负担。

工作回合芯片的行为

如果一个人是在以优化到这个程度,然后一个迅速开始不喜欢内置于现代CPU体系结构的概括。例如,缓存会对要加载什么数据以及何时加载以及何时更新RAM和其他缓存做出假设。一般来说这很好,但有时候一个人会更好。

对我来说最好的CPU却是在游戏机3中使用在其八个数学Cell处理器内核它没有缓存,所以没有高速缓存一致性,什么都没有。程序员有责任获取DMA引擎(我希望Intel会包括这些引擎),以便在正确的时间将数据移动到正确的位置,并由正确的代码进行处理。或者可以将数据保留在原来的位置,并将代码直接写入数据。它非常复杂并且需要大量的大脑能力,但是要做到正确,并且可以获得巨大的数学表现(2005年200GFLOPs;英特尔领先英里)。

至于哪种哲学是正确的?那么,英特尔正在抨击Core和Xeon,而Cell则奄奄一息。事实证明,有很多程序员可以通过自己控制一切来提取峰值性能。

+0

非常感谢这两个接口和附加信息。 sched_setaffinity()或pthread_setaffinity_np()的实现必须告诉我正在探索的内容。 – troore 2013-03-13 14:46:13

+0

不用担心,祝你好运:) – bazza 2013-03-13 22:31:33

+1

至于OS内部亲和性的实现,以及调度程序为每个线程维护的数据块。其中包含优先级,拥有进程,内存所有权等数据。每当调度程序确定一个线程已准备好运行(例如信号量可用)时,它就会确定哪个内核不忙,并在那里启动线程。设置亲和力是程序干预和控制锻炼的手段。两个程序设置相同的亲和力将运行缓慢! – bazza 2013-03-13 22:38:04