当前位置:  开发笔记 > 运维 > 正文

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

如何解决《如何从用户空间应用程序(Linux,C)中获取CPU核心编号?》经验,为你挑选了2个好方法。

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



1> Johannes Sch..:

使用sched_getcpu以确定在其上调用线程运行的CPU.请参阅man getcpu(系统调用)和man sched_getcpu(库包装器).不过,请注意它的内容:

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



2> timday..:

你需要做一些事情:

调用sched_getaffinity并识别CPU位

迭代CPU,对每一个进行sched_setaffinity(我不确定sched_setaffinity之后是否保证在CPU上,或者需要显式生成?)

执行CPUID(asm指令)...有一种方法可以从其中一个输出中获取唯一的每核ID(参见英特尔文档).我依旧回忆起它是"APIC ID".

从APIC ID到CPU编号或关联掩码等构建一个表(std :: map?).

如果您在主线程上执行此操作,请不要忘记将sched_setaffinity设置回所有CPUS!

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

但我会问你为什么需要这样做; 通常你想通过sched_setaffinity来控制,而不是找出你所在的核心(甚至那是一个非常罕见的想要/需要的东西).(这就是为什么我不知道究竟什么从CPUID中取出的关键细节,对不起!)

更新:刚从litb的响应中了解到sched_getcpu.好多了!(我的Debian/etch libc太老了,不过它).

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有