Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ NUMA获取当前节点/核心_C++_Linux_Numa - Fatal编程技术网

C++ NUMA获取当前节点/核心

C++ NUMA获取当前节点/核心,c++,linux,numa,C++,Linux,Numa,我在Linux上使用libnuma。我的线程应该知道它们正在运行的节点/核心。是否可以以某种方式获取当前线程的节点/核心?我已经阅读了文档,但没有找到这样的函数…您需要使用系统调用。正如手册页所说: 确定正在运行调用线程的CPU和NUMA节点 所以,这应该符合你的目的。需要包括,内核版本大于2.6.19,对于x86_64,i386 arch。我找到了以下解决方案: #include <stdio.h> #include <utmpx.h> int main(void)

我在Linux上使用libnuma。我的线程应该知道它们正在运行的节点/核心。是否可以以某种方式获取当前线程的节点/核心?我已经阅读了文档,但没有找到这样的函数…

您需要使用系统调用。正如手册页所说:

确定正在运行调用线程的CPU和NUMA节点

所以,这应该符合你的目的。需要包括
,内核版本大于2.6.19,对于x86_64,i386 arch。

我找到了以下解决方案:

#include <stdio.h>
#include <utmpx.h>

int main(void) {
  printf("CPU: %d\n", sched_getcpu());
  return 0;
}

更轻量级的方法是使用RDTSCP指令(在支持它的x86系统上——它将在/proc/cpuinfo的“flags”字段中列为“RDTSCP”)

RDTSCP指令返回一对32位寄存器(%eax和%ebx)中的时间戳计数器值,但也返回%ecx寄存器中IA32_TSC_AUX MSR的内容。IA32_TSC_AUX MSR的内容在理论上是任意的,但每个识别“rdtscp”处理器标志的Linux版本都会在每个逻辑处理器上预加载IA32_TSC_AUX寄存器,并使用逻辑处理器编号(第11:0位为%ecx)和“节点编号”(第21:12位为%ecx)的编码。该指令以原子方式获取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);;
}
无符号长TACCrdtscp(int*芯片,int*核心)
{
无符号长a、d、c;
__非挥发性(“rdtscp”):“=a”(a),“=d”(d),“=c”(c));
*芯片=(c&0xFFF000)>>12;
*核心=c&0xFFF;

return((unsigned long)a)|((unsigned long)d)谢谢,应该可以,但是我没有运行它。没有,文档说应该用syscall()直接调用它。所以我用和sched_getcpu()…sched_getcpu()尝试了另一种解决方案是获取cpuid的最稳定的方法。因为,您显式地查找cpu和节点id,这就是为什么我用getcpu()回答。实际上,getcpu()没有libc包装器,您需要使用syscalls()系统调用。这是sched_getcpu()优于getcpu()的另一个原因,还有可移植性问题。
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);;
}