在不同级别的缓存中创建40-60%的缓存未命中

时间:2018-12-17 23:53:20

标签: x86-64 cpu-cache

我正在尝试在L1和L2高速缓存中创建许多高速缓存未命中,如果可能的话会破坏高速缓存。下面的示例是我正在处理的代码的一部分。在此代码中,c_size是L1,L2和L3缓存的大小。在我的系统上,我的L1,L2,L3分别为32Kb,256Kb和2048kb。高速缓存行为64字节。我的目标是在读取或/和写入内存时创建缓存未命中。我曾尝试使用不同的数组大小,但是却很少遇到缓存未命中(少于预期)的情况。目标是50%。我不确定我做得不好。请,有人可以解释如何实现这一目标吗?

 // allocate memory at an aligned address
  int PAGE_SIZE = getpagesize();
  int n_pages = c_size / PAGE_SIZE;
  if (c_size % PAGE_SIZE != 0) n_pages++;
  size_t alloc_size = n_pages * PAGE_SIZE;
  void *x = mmap ((void *)mmap_addr, alloc_size, PROT_READ|PROT_WRITE,
             MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -1, (off_t)0);
  if (x == MAP_FAILED || x != mmap_addr) {
  fprintf(stderr, "Could not allocate memory at %p: %s\n", mmap_addr, 
  strerror(errno));
  exit (1);

  }


  char *addr;
  int rand_t,rval;
  uint64_t urand;
  int i,j;
  unsigned int A[32768];
  uint64_t temp = 0xff000000ul << 24;

  if (access_type == Write){
  for(i = 0; i < 64; i++){
  rand_t = rand();
  A[i]=rand_t & temp;
  rval = rand_t & temp; // random byte 
  addr = (char *) (mmap_addr+(rand_t % c_size));
 //*addr = rval;
*addr = A[i];

 //asm("rdrand %r14");
  //printf("%p:\t%x\tmem:%hhx\n", addr, rval, *addr);
}

0 个答案:

没有答案