1

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

    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 循环)
  3. 运行随机线(步长在 3 到 23 之间)并测量响应时间。

结果: 结果

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

注意:MSR 寄存器 0x​​1a4 的值为 0xF(但行为与 0x0 相同)我选择了随机步骤来避免“跨步”预取器。是否有任何其他硬件(或软件)预取器可以对这些结果负责?

4

0 回答 0