0

您好,我一直在尝试在 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

我的理解不正确吗?还是我的程序错了?

4

0 回答 0