如何从用户空间应用程序(Linux,C)中获取CPU内核号?

据推测,有一个库或简单的asm blob,可以得到我正在执行的当前CPU的数量。

使用sched_getcpu来确定调用线程正在运行的CPU。 请参阅man getcpu (系统调用)和man sched_getcpu (库包装器)。 但是,请注意它说:

放置在CPU中的信息只能保证在调用时是最新的:除非使用sched_setaffinity(2)修复了CPU亲和性,否则内核可能随时更改CPU。 (通常这不会发生,因为调度程序试图最小化CPU之间的移动以保持高速缓存热,但是这是可能的。)当CPU和节点不再是当前的CPU和节点时,调用者必须准备好处理情况。

您需要执行以下操作:

  • 调用sched_getaffinity并确定CPU位
  • 迭代CPU,对每一个做sched_setaffinity(我不确定是否在sched_setaffinity之后,你保证在CPU上,或者需要明确的产出?)
  • 执行CPUID(asm指令)…有一种方法可以从其中一个输出中获取唯一的每个内核ID(请参阅英特尔文档 )。 我隐约记得这是“APIC ID”。
  • 从APIC ID建立一个表(一个std :: map?)到一个CPU号或亲和性掩码或其他东西。
  • 如果你在主线程上做了这个,不要忘记把sched_setaffinity设置回所有CPUS!

现在,只要需要,您可以再次使用CPUID,然后查找您所在的核心。

但我会问,你为什么需要这样做; 通常你想通过sched_setaffinity来控制,而不是找出你正在使用哪个核心(甚至这是一个非常罕见的想要/需要)。 (这就是为什么我不知道要从CPUID拉出什么关键细节,对不起!)

更新:刚刚从litb的回应中了解到sched_getcpu。 好多了! (我的Debian /蚀刻libc是太旧了,虽然)。

我不知道有什么要得到你当前的核心ID。 使用内核级别的任务/进程迁移,不能保证在任何时间长度内都不会保持不变,除非您以某种形式的实时模式运行。

如果你想在一个特定的核心,你可以使用sched_setaffinity()函数或taskset命令来启动你的程序。 我相信这些需要提升权限才能工作。 在你的程序中,你可以运行sched_getaffinity()查看之前设置的掩码,并用它作为你正在执行的核心的最佳猜测。

 sysconf(_SC_NPROCESSORS_ONLN);