我在 Linux 上使用 libnuma。我的线程应该知道它们正在运行的节点/核心。是否有可能以某种方式获取当前线程的节点/核心?我已经浏览了文档,但我没有找到这样的功能......
最佳答案
一种更轻量级的方法是使用 RDTSCP 指令(在支持它的 x86 系统上——它将在/proc/cpuinfo 的“flags”字段中列为“rdtscp”)。
RDTSCP 指令在一对 32 位寄存器(%eax 和 %ebx)中返回时间戳计数器值,但也在 %ecx 寄存器中返回 IA32_TSC_AUX MSR 的内容。 IA32_TSC_AUX MSR 的内容在理论上是任意的,但每个识别“rdtscp”处理器标志的 Linux 版本都会在每个逻辑处理器上预加载 IA32_TSC_AUX 寄存器,其中包含逻辑处理器编号的编码(%ecx 的位 11:0 ) 和“节点号”(%ecx 的第 21:12 位)。该指令以原子方式获取 TSC 和 IA32_TSC_AUX 寄存器,因此可以保证在同一内核上获取 TSC 值和 IA32_TSC_AUX 值(如果 TSC 在不同内核上具有不同的偏移量,这一点至关重要)。
这种方法的好处在于 RDTSCP 是一种用户空间机器语言指令,因此您无需与内核或任何库进行交互。在最近的系统上,开销低于 50 个周期。我使用的套路是:
unsigned long tacc_rdtscp(int *chip, int *core)
{
unsigned long a,d,c;
__asm__ volatile("rdtscp" : "=a" (a), "=d" (d), "=c" (c));
*chip = (c & 0xFFF000)>>12;
*core = c & 0xFFF;
return ((unsigned long)a) | (((unsigned long)d) << 32);;
}
关于c++ - NUMA 获取当前节点/核心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16862620/