如何让我的pthreads在每次内核重新调度时执行一个函数?pthread唤醒执行
我需要确定我的线程在哪个物理CPU /套接字(不是逻辑核心)上进行调度,并且无法一直这样做。
只有当线程实际上正在重新计划时,wakeup例程才能以某种方式挂钩以便对TLS进行必要的更新?
至于为什么我需要这个:我有每个线程每70ns执行一次AMO appx的代码,如果地址没有缓存在另一个套接字上,那么在两个套接字上部署相同的代码会产生15倍的性能影响,因为频繁的缓存失效。我打算专门为此分配内存,只能在运行相同L3缓存的线程之间共享内存。所以我需要确定我正在运行哪个套接字并寻址正确的内存块。我明显可以调用sched_getcpu
并将其与/proc/cpuinfo
中的物理CPU ID进行比较,但这是一个相当大的开销。我不能为每个线程分配线程专用内存,但是太昂贵了。
我不相信pthreads模型具有这样的功能。而且,说实话,我认为如果你需要知道你在运行什么样的CPU,那么就有更大的设计问题。 – twalberg
@twalberg补充说明。 –
如果您不希望内核将您的线程移动到其他CPU,请使用sched_setaffinity(或pthread_setaffinity)将它修复在某个CPU子集上。 – osgx