4

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

我需要确定我的线程被安排在哪个物理 CPU/插槽(不是逻辑核心)上,并且不能一直这样做。

只有在线程实际被重新调度时,唤醒例程才能以某种方式对 TLS 进行必要的更新?

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

4

1 回答 1

1

根据我在Linux Kernel Development, Third Edition中读到的内容,内核没有为您提供所需的服务或接口。使用pthread_setaffinity(如上面@osgx所建议的那样,或者,在最近的 linux 内核实现中,pthread_setaffinity_np)或在开始时为每个 cpu 套接字缓存一个 TLS 密钥(如上面@caf所建议的那样)可能是在这个方向上使用的最佳方法.

于 2012-12-08T20:08:54.523 回答