据推测,有一个库或简单的asm blob,可以得到我正在执行的当前CPU的数量。
使用sched_getcpu
来确定调用线程正在运行的CPU。 请参阅man getcpu
(系统调用)和man sched_getcpu
(库包装器)。 但是,请注意它说:
放置在CPU中的信息只能保证在调用时是最新的:除非使用sched_setaffinity(2)修复了CPU亲和性,否则内核可能随时更改CPU。 (通常这不会发生,因为调度程序试图最小化CPU之间的移动以保持高速缓存热,但是这是可能的。)当CPU和节点不再是当前的CPU和节点时,调用者必须准备好处理情况。
您需要执行以下操作:
现在,只要需要,您可以再次使用CPUID,然后查找您所在的核心。
但我会问,你为什么需要这样做; 通常你想通过sched_setaffinity来控制,而不是找出你正在使用哪个核心(甚至这是一个非常罕见的想要/需要)。 (这就是为什么我不知道要从CPUID拉出什么关键细节,对不起!)
更新:刚刚从litb的回应中了解到sched_getcpu。 好多了! (我的Debian /蚀刻libc是太旧了,虽然)。
我不知道有什么要得到你当前的核心ID。 使用内核级别的任务/进程迁移,不能保证在任何时间长度内都不会保持不变,除非您以某种形式的实时模式运行。
如果你想在一个特定的核心,你可以使用sched_setaffinity()
函数或taskset
命令来启动你的程序。 我相信这些需要提升权限才能工作。 在你的程序中,你可以运行sched_getaffinity()
查看之前设置的掩码,并用它作为你正在执行的核心的最佳猜测。
sysconf(_SC_NPROCESSORS_ONLN);