作为学术研究的一部分,我进行了以下实验:
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;
}
所以步骤是:
结果: Results
请帮助我更好地了解结果。 为什么在短数量样本后,响应时间会下降?
注意: MSR寄存器0x1a4的值为0xF(但行为与0x0相同) 我已经选择了随机的步骤来避免&#34; stride&#34;预取。 是否有任何其他硬件(或软件)预取器可以对这些结果负责?