据推测,有一个库或简单的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到CPU编号或关联掩码等构建一个表(std :: map?).
如果您在主线程上执行此操作,请不要忘记将sched_setaffinity设置回所有CPUS!
现在,您可以在需要时再次CPUID并查找您所在的核心.
但我会问你为什么需要这样做; 通常你想通过sched_setaffinity来控制,而不是找出你所在的核心(甚至那是一个非常罕见的想要/需要的东西).(这就是为什么我不知道究竟什么从CPUID中取出的关键细节,对不起!)
更新:刚从litb的响应中了解到sched_getcpu.好多了!(我的Debian/etch libc太老了,不过它).