了解内存访问的响应时间

时间:2017-10-25 11:53:20

标签: caching memory response stride

作为学术研究的一部分,我进行了以下实验:

    buff =  mmap(NULL, BUFFSIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | HUGEPAGES, -1, 0);
    lineAddr = buff;
    for (int i = 0; i < BUFFSIZE; i++)
        clflush(&(buff[i]));
    for (int i = 0; i < LINES; i ++){
        srand(rdtscp());
        result = memaccesstime(lineAddr);
        lineAddr = (void*)((uint64_t)lineAddr + (rand()%20+3)*(8*sizeof(void*)));
        resultArr[i] = result;
    }

MemAccessTime函数以cpu ticks返回响应时间。

static inline uint32_t memaccesstime(void *v) {
uint32_t rv;
asm volatile (
  "mfence\n"
  "lfence\n"
  "rdtscp\n"
  "mov %%eax, %%esi\n"
  "mov (%1), %%eax\n"
  "rdtscp\n"
  "sub %%esi, %%eax\n"
  : "=&a" (rv): "r" (v): "ecx", "edx", "esi");
return rv;
}

所以步骤是:

  1. 分配了很长的内存(使用mmap())。
  2. clflush()所有行(带for for循环)
  3. 在随机线上运行(步长在3到23之间)并测量响应时间。
  4. 结果: Results

    请帮助我更好地了解结果。 为什么在短数量样本后,响应时间会下降?

    注意: MSR寄存器0x1a4的值为0xF(但行为与0x0相同) 我已经选择了随机的步骤来避免&#34; stride&#34;预取。 是否有任何其他硬件(或软件)预取器可以对这些结果负责?

0 个答案:

没有答案