C 如何在Linux系统中体验缓存未命中和命中?
您好,我一直在尝试在Linux中体验缓存未命中和命中。 为此,我用C编写了一个程序,其中我测量了执行指令printf()的CPU周期时间。第一部分测量未命中所需的时间,第二部分测量命中所需的时间。以下是给定的程序:C 如何在Linux系统中体验缓存未命中和命中?,c,linux,caching,cpu,side-channel-attacks,C,Linux,Caching,Cpu,Side Channel Attacks,您好,我一直在尝试在Linux中体验缓存未命中和命中。 为此,我用C编写了一个程序,其中我测量了执行指令printf()的CPU周期时间。第一部分测量未命中所需的时间,第二部分测量命中所需的时间。以下是给定的程序: #include <stdint.h> #include <stdio.h> #include <string.h> #include <sched.h> #include <sys/types.h> #include &
#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:
miss
hit
我的理解不对吗?或者我的程序错了?你认为应该在这里缓存什么?我认为函数printf()会被缓存,这样终端2就不必像终端1一样等待第一个printf()。你能打印增量吗?可能这两个终端是从两个不同的核心运行的。
Terminal 1:
miss
hit
Terminal 2:
miss
hit