每次内核重新安排时,如何让我的pthread执行一个函数?
我需要确定我的线程正在安排在哪个物理CPU /套接字(不是逻辑核心),并且不能一直这样做.
只有当线程实际被重新安排时,唤醒例程是否可以以某种方式挂钩以对TLS进行必要的更新?
至于为什么我需要这个:我有每个线程每70ns执行AMO appx的代码,如果地址没有缓存在另一个套接字上就没问题,在两个套接字上部署相同的代码会因频繁的缓存失效而产生15倍的性能影响.我打算为此分配内存,这只在运行相同L3缓存的线程之间共享.所以我需要确定我正在运行哪个套接字并解决正确的内存块.我显然可以调用sched_getcpu并将其与/ proc / cpuinfo中的物理CPU ID进行比较,但这是一个相当大的开销.我不能为每个线程分配线程专用内存,但是太贵了.
解决方法:
从我在Linux Kernel Development, Third Edition中读到的内容来看,内核提供的服务和接口都不是你想要的.使用pthread_setaffinity(如上面的@osgx所建议,或者,在最近的Linux内核实现中,pthread_setaffinity_np)或者在开始时为每个cpu套接字缓存一个TLS密钥(如上面@caf所建议的那样)可能是在这个方向上使用的最佳方法.