您好,我一直在尝试在 Linux 中体验缓存未命中和命中。为此,我用 C 语言编写了一个程序,我在其中测量了 CPU 周期中执行printf()指令的时间。第一部分测量未命中所需的时间,第二部分测量命中所需的时间。这是给定的程序:
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <sched.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
uint64_t rdtsc() {
uint64_t a, d;
asm volatile ("mfence");
asm volatile ("rdtsc" : "=a" (a), "=d" (d));
a = (d<<32) | a;
asm volatile ("mfence");
return a;
}
int main(int argc, char** argv)
{
size_t time = rdtsc();
printf("Hey ");
size_t delta1 = rdtsc() - time;
printf("delta: %zu\n", delta1);
size_t time2 = rdtsc();
printf("Hey ");
size_t delta2 = rdtsc() - time2;
printf("delta: %zu\n", delta2);
sleep(100);
}
现在我想展示两个进程(两个终端)在公共中有缓存。所以我认为在两个终端上运行这个程序会导致:
Terminal 1:
miss
hit
Terminal 2:
hit
hit
但现在我有类似的东西:
Terminal 1:
miss
hit
Terminal 2:
miss
hit
我的理解不正确吗?还是我的程序错了?