汇编和多核之间有什么关系?

时间:2013-03-16 14:17:16

标签: linux windows assembly x86 cpu

这很难说/请问所以请耐心等待:

当我们看到汇编的输出时,这就是将在CPU的核心上执行的操作。但是,如果CPU有多个内核 - 是否所有程序集都在同一个内核上执行?来自同一程序的程序集将在什么时候开始在不同的核心上执行?

所以如果我有(assembly pseudo):

ADD x, y, z
SUB p, x, q

我如何知道ADD和SUB是否会在同一个核心上执行?这与亲和力有关吗?我认为亲和力只是将进程固定到CPU而不是核心?

我问这个是因为我想尝试理解你是否可以合理地预测连续的汇编指令是否在同一个核上执行,以及我是否可以控制它们只在同一个核上执行。我试图理解如何决定将相同的程序代码从一个核心更改为另一个核心?

如果程序集可以改变从CPUA Core1到Core2的执行(即使使用关联性),那么QPI链接速度是否会生效 - 以及缓存是否在不同的CPU核心之间共享?

3 个答案:

答案 0 :(得分:2)

这是一个粗略的概述,希望能为您提供所需的详细信息。

  1. 汇编代码被翻译成机器代码;即二进制数据,由CPU运行。

  2. CPU与多核处理器上的核心相同;即CPU与处理器(芯片)不同。

  3. 每个CPU都有一个指令指针,指向下一个要执行的指令。对于每个执行的指令,这都会递增。

  4. 因此,在多核处理器中,每个核心都有一个指令指针。为了支持比可用CPU(或核心)更多的进程,操作系统将中断运行进程并定期存储其状态(包括指令指针)。然后它将恢复已经中断的进程的状态并让它们执行一点。

    继续执行的核心取决于操作系统的决定,并由正在运行的线程的亲和力控制(也可能是其他一些设置)。

    所以要回答你的问题,无法知道两个相邻的汇编语句是否会在同一个核心上运行。

答案 1 :(得分:2)

我说的主要是Linux;但我想我所说的应该适用于其他操作系统。但是,如果无法访问Windows源代码,任何人都无法可靠地说明其在详细信息中的行为

我认为你对计算机正在做的事情的“抽象”是不充分的。基本上,(单线程)进程(或只是一个线程)正在一些“虚拟”CPU上运行,其指令集是无特权的x86机器指令,通过系统调用进入内核的能力得到增强(通常通过特殊指令)比如SYSENTER)。因此,从应用程序的角度来看,system callslinux kernel是“原子的”。请参阅thisthat个答案。

事实上,处理器正在(在任意时刻)获得一些中断(在Linux上,cat /proc/interrupts重复两次,延迟一秒会显示它被中断的频率,基本上每秒数千次),这些中断由内核处理。内核正在调度任务(例如线程或进程)premptively(它们可以随时被内核中断和重启)。

从应用程序的角度来看,中断并不存在(但内核可以将信号发送到进程)。

核心,中断和缓存由硬件和/或内核处理,因此从应用程序的角度来看,它们并不存在 - 除了“减慢”进程。 cache coherency主要在硬件中处理,而out-of-order execution使得给定的 - 甚至微小二进制程序执行时间不可预测。 (换句话说,你不能静态地预测一些给定的例程或循环需要多少毫秒;你只能动态测量它;阅读更多关于worst-case execution time的信息。)

阅读Advanced Linux Programming书和Linux Assembly Howto会有所帮助。

答案 2 :(得分:1)

您通常无法预测每条指令的执行位置。只要一个单独的线程连续执行,它就会在同一个内核/处理器内部运行,但你无法预测线程将被切换到哪个指令。根据系统的工作量和优先级等因素,操作系统做出决定,决定何时将其重新打开,以及在哪个核心/处理器上放置它。

您通常可以特别向操作系统请求线程应该始终在同一个核心上运行,这称为亲和性。这通常是一个坏主意,只有在绝对必要时才应该这样做,因为它可以根据工作负载灵活地决定在哪里做什么。亲和力几乎总会导致性能下降。

请求处理器亲和性是一项非凡的请求,需要非凡的证据才能获得更好的性能。不要试图超越操作系统;操作系统了解您不了解的当前运行环境。