【发布时间】:2012-11-19 15:35:45
【问题描述】:
如何让我的 pthread 每次被内核重新调度时执行一个函数?
我需要确定我的线程被安排在哪个物理 CPU/插槽(不是逻辑核心)上,并且不能一直这样做。
是否可以以某种方式挂钩唤醒例程,以便仅在线程实际被重新调度时才对 TLS 进行必要的更新?
至于我为什么需要这个:我的代码每线程每 70ns 执行 AMOs appx缓存失效。我打算专门为此分配内存,它只在运行相同 L3 缓存的线程之间共享。所以我需要确定我在哪个套接字上运行并寻址正确的内存块。我显然可以调用sched_getcpu 并将其与/proc/cpuinfo 中的物理CPU ID 进行比较,但这是一个相当大的开销。不过,我负担不起为每个线程分配线程专用内存,太贵了。
【问题讨论】:
-
我不相信 pthreads 模型有这样的功能。而且,老实说,我认为如果您需要知道自己运行的 CPU 是什么,则存在更大的设计问题。
-
@twalberg 添加了解释。
-
如果您不希望内核将您的线程移动到其他 cpu,请使用 sched_setaffinity(或 pthread_setaffinity)将其修复在某个 cpu 子集上。
-
是的,我想到了。问题是我无法控制在我的 cpuset 上安排的其他内容。如果我能有效地识别我当前的 CPU,我宁愿不走那条路。也许
cpuid2xAPIC 字段可以用于那个...... -
getcpu()系统调用是sched_getcpu()的基础(您也可以直接调用它)被实现为 vsyscall,因此它可以非常快 - 它不必进入内核模式。读取/proc/cpuinfo显然很慢,但您可以在启动时读取一次并将逻辑->物理转换缓存在一个小数组中。
标签: c linux pthreads scheduling