Memory 衡量银行间拷贝对NUMA机器的性能影响

Memory 衡量银行间拷贝对NUMA机器的性能影响,memory,linux-kernel,cpu-usage,numa,Memory,Linux Kernel,Cpu Usage,Numa,我有一台64位NUMA机器,有两个银行。我知道,如果一个银行的CPU试图访问另一个银行的内存,会有性能损失。我想通过一些示例代码来度量它。我试着写下(CPU1和CPU7在不同的银行) 定义GNU源 #包括 #包括 #包括 #包括 #包括 #定义BUFSZ 1048576*500 #定义SCRATCHSZ 1048576*10 int main() { 字符*划痕; char*buf; char*buf2; 结构时间值tv1,tv2; cpu设置亲缘关系掩码; CPU_零(&affinity_掩码

我有一台64位NUMA机器,有两个银行。我知道,如果一个银行的CPU试图访问另一个银行的内存,会有性能损失。我想通过一些示例代码来度量它。我试着写下(CPU1和CPU7在不同的银行)

定义GNU源
#包括
#包括
#包括
#包括
#包括
#定义BUFSZ 1048576*500
#定义SCRATCHSZ 1048576*10
int main()
{
字符*划痕;
char*buf;
char*buf2;
结构时间值tv1,tv2;
cpu设置亲缘关系掩码;
CPU_零(&affinity_掩码);
CPU_集(1和关联_掩码);
if(sched_setaffinity(0,sizeof(cpu_set_t)和affinity_mask)){
返回-1;
}
buf=malloc(BUFSZ);
buf2=malloc(BUFSZ);
scratch=malloc(SCRATCHSZ);
/*让页面错误发生*/
memset(buf,0,BUFSZ);
memset(buf2,0,BUFSZ);
/*清除cpu缓存*/
memset(scratch,0,SCRATCHSZ);
gettimeofday(&tv1,NULL);
memcpy(buf2、buf、BUFSZ);
gettimeofday(&tv2,NULL);
printf(“总时间1=%f useconds\n”,
(双人)(tv2.tv_usec-tv1.tv_usec)+
(双倍)(tv2.tv_sec-tv1.tv_sec)*1000000);
自由基(buf2);
自由(划痕);
CPU_零(&affinity_掩码);
CPU_集(7,和关联_掩码);
if(sched_setaffinity(0,sizeof(cpu_set_t)和affinity_mask)){
返回-1;
}
buf2=malloc(BUFSZ);
scratch=malloc(SCRATCHSZ);
memset(buf2,0,BUFSZ);
memset(scratch,0,SCRATCHSZ);
gettimeofday(&tv1,NULL);
memcpy(buf2、buf、BUFSZ);
gettimeofday(&tv2,NULL);
printf(“总时间2=%f useconds\n”,
(双人)(tv2.tv_usec-tv1.tv_usec)+
(双倍)(tv2.tv_sec-tv1.tv_sec)*1000000);
免费(buf);
自由基(buf2);
自由(划痕);
返回0;
}
在执行此命令时:

prmpt:>。/a.out总时间1=169583.000000秒总时间2= 129527.000000秒

这不是我所期望的。时间2必须大于时间1,因为在时间2的情况下,CPU7试图从不同的存储库访问内存。
有什么想法吗?

为2个节点添加cpulist。我们可以看到cpu1和CPU7位于不同的节点上。cat/sys/devices/system/node/node1/cpulist 0-5,12-17 cat/sys/devices/system/node/node0/cpulist 6-11,18-23为2个节点添加cpulist。我们可以看到cpu1和CPU7位于不同的节点上。cat/sys/devices/system/node/node1/cpulist 0-5,12-17 cat/sys/devices/system/node/node0/cpulist 6-11,18-23
#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define BUFSZ 1048576*500
#define SCRATCHSZ 1048576*10
int main()
{
  char *scratch;
  char *buf;
  char *buf2;
  struct timeval  tv1, tv2;
  cpu_set_t affinity_mask;

  CPU_ZERO(&affinity_mask);
  CPU_SET(1, &affinity_mask);
  if (sched_setaffinity(0, sizeof(cpu_set_t), &affinity_mask)) {
    return -1;
  }

  buf = malloc(BUFSZ);
  buf2 = malloc(BUFSZ);
  scratch = malloc(SCRATCHSZ);

  /* Let page fault happen */
  memset(buf, 0, BUFSZ);
  memset(buf2, 0, BUFSZ);
  /* clear the cpu cache */
  memset(scratch, 0, SCRATCHSZ);

  gettimeofday(&tv1, NULL);
  memcpy(buf2, buf, BUFSZ);
  gettimeofday(&tv2, NULL);
  printf ("Total time 1 = %f useconds\n",
           (double) (tv2.tv_usec - tv1.tv_usec)  +
           (double) (tv2.tv_sec - tv1.tv_sec)*1000000);

  free(buf2);
  free(scratch);

  CPU_ZERO(&affinity_mask);
  CPU_SET(7, &affinity_mask);
  if (sched_setaffinity(0, sizeof(cpu_set_t), &affinity_mask)) {
    return -1;
  }
  buf2 = malloc(BUFSZ);
  scratch = malloc(SCRATCHSZ);

  memset(buf2, 0, BUFSZ);
  memset(scratch, 0, SCRATCHSZ);

  gettimeofday(&tv1, NULL);
  memcpy(buf2, buf, BUFSZ);
  gettimeofday(&tv2, NULL);

  printf ("Total time 2 = %f useconds\n",
          (double) (tv2.tv_usec - tv1.tv_usec)  +
          (double) (tv2.tv_sec - tv1.tv_sec)*1000000);

  free(buf);
  free(buf2);
  free(scratch);
  return 0;
}