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

时间:2009-01-29 13:04:33

标签: linux multicore smp

据推测,有一个库或简单的asm blob可以获取我正在执行的当前CPU的编号。

4 个答案:

答案 0 :(得分:21)

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

  

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

答案 1 :(得分:5)

您需要执行以下操作:

  • 调用sched_getaffinity并识别CPU位
  • 迭代CPU,为每个人执行sched_setaffinity (我不确定在sched_setaffinity之后你是否可以保证在CPU上,或者 需要明确屈服?)
  • 执行CPUID(asm指令)...有一种方法可以从其中一个输出中获取唯一的每核ID(参见Intel docs)。我含糊地回忆起它是“APIC ID”。
  • 从APIC ID构建一个表(一个std :: map?)到一个CPU号或亲和力掩码等。
  • 如果您在主线程上执行此操作,请不要忘记将sched_setaffinity设置回所有CPUS!

现在,您可以在需要时再次CPUID并查找您所在的核心。

但我会问你为什么需要这样做;通常你想通过sched_setaffinity来控制,而不是找出你所在的核心(甚至那是一个非常罕见的想要/需要的东西)。 (这就是为什么我不知道什么是完全退出CPUID的关键细节,抱歉!)

更新:刚从litb的回复中了解到了sched_getcpu。好多了! (我的Debian / etch libc太旧了,但不能拥有它。)

答案 2 :(得分:2)

我不知道有什么可以获得您当前的核心ID。使用内核级别的任务/进程迁移,除非您以某种形式的实时模式运行,否则无法保证它在任何时间内都保持不变。

如果您想要使用特定核心,可以使用sched_setaffinity()函数或taskset命令启动您的程序。不过,我认为这些需要提升权限。在您的程序中,您可以运行sched_getaffinity()以查看先前设置的掩码,并将其用作您正在执行的核心的最佳猜测。

答案 3 :(得分:-1)

sysconf(_SC_NPROCESSORS_ONLN);