作为学术研究的一部分,我进行了以下实验:
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;
}
所以步骤是:
- 分配了长范围的内存(使用 mmap())。
- clflush() 整行(带有 for 循环)
- 运行随机线(步长在 3 到 23 之间)并测量响应时间。
结果: 结果
请帮助我更好地理解结果。为什么在少量样本后,响应时间会急剧下降?
注意:MSR 寄存器 0x1a4 的值为 0xF(但行为与 0x0 相同)我选择了随机步骤来避免“跨步”预取器。是否有任何其他硬件(或软件)预取器可以对这些结果负责?