c++ - NUMA 获取当前节点/核心

标签 c++ linux numa

我在 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/

相关文章:

linux - 从 Bash 输出中隐藏 "Directory and Bash Directory"

linux -/proc/iomem 的内容

c - fread 成多个变量

c++ - 使用 move_pages() 移动大页面?

c - 如何强制两个进程在同一个CPU上运行?

c# - 从安全的角度来看,在 Windows 中使用管道是否被认为是危险的?

c++ - C++ 中的 Memory Tracker 在 vector 初始化期间进入无限循环

c++ - 如何在 rtl 对齐中打开右侧的子菜单?

cpu-architecture - 本地 CPU 可能会降低远程 CPU 的数据包接收性能

c++ - 将类构造函数重载放在同一类的另一个重载中