2012-11-19 73 views
4

如何让我的pthreads在每次内核重新调度时执行一个函数?pthread唤醒执行

我需要确定我的线程在哪个物理CPU /套接字(不是逻辑核心)上进行调度,并且无法一直这样做。

只有当线程实际上正在重新计划时,wakeup例程才能以某种方式挂钩以便对TLS进行必要的更新?

至于为什么我需要这个:我有每个线程每70ns执行一次AMO appx的代码,如果地址没有缓存在另一个套接字上,那么在两个套接字上部署相同的代码会产生15倍的性能影响,因为频繁的缓存失效。我打算专门为此分配内存,只能在运行相同L3缓存的线程之间共享内存。所以我需要确定我正在运行哪个套接字并寻址正确的内存块。我明显可以调用sched_getcpu并将其与/proc/cpuinfo中的物理CPU ID进行比较,但这是一个相当大的开销。我不能为每个线程分配线程专用内存,但是太昂贵了。

+1

我不相信pthreads模型具有这样的功能。而且,说实话,我认为如果你需要知道你在运行什么样的CPU,那么就有更大的设计问题。 – twalberg

+0

@twalberg补充说明。 –

+3

如果您不希望内核将您的线程移动到其他CPU,请使用sched_setaffinity(或pthread_setaffinity)将它修复在某个CPU子集上。 – osgx

回答

1

从我读过的Linux Kernel Development, Third Edition,没有服务也没有接口,由内核提供,你想要什么。使用pthread_setaffinity(如上由@osgx建议,或者,在最近的Linux内核中实现,pthread_setaffinity_np),或在开始缓存每个CPU插座TLS密钥(如上由@caf建议)也许是在这个方向使用最好的方法。