C 超线程如何影响缓存?

C 超线程如何影响缓存?,c,x86,cpu-cache,microbenchmark,hyperthreading,C,X86,Cpu Cache,Microbenchmark,Hyperthreading,当我使用超线程时,出现了一个非常奇怪的现象。我用c语言来测量l2命中的时间。我在一个程序a中编写了测试时间。当我单独运行它时,它显示每次大约需要26个周期。当我编写另一个程序时,B.将B和A绑定到同一个内核,并以超线程的形式运行。即使在B中只写了一个无用的循环,例如: for(;;){ } 我发现,在这种情况下,当我再次运行程序A时,显示的L2命中时间变为10 代码很长。测试的伪代码如下所示 A: Select 16 cache lines (line 0 -16)in a set.

当我使用超线程时,出现了一个非常奇怪的现象。我用c语言来测量
l2命中的时间。我在一个程序
a
中编写了测试时间。当我单独运行它时,它显示每次大约需要26个周期。当我编写另一个程序时,B.将
B
A
绑定到同一个内核,并以超线程的形式运行。即使在B中只写了一个无用的循环,例如:

for(;;){
}
我发现,在这种情况下,当我再次运行程序
A
时,显示的
L2命中时间变为
10

代码很长。测试的伪代码如下所示

A:

    Select 16 cache lines (line 0 -16)in a set.  // l1 cache is VIPT structure
    Organize the disordered sequence of line0 to line8 into a linked list to prevent prefetching.
    Organize the disordered sequence of line9 to line15 into a linked list to prevent prefetching.
    load line 0 - 8   //Because it is a linked list, it is read serially
    fence()
    t1= rdtscp()
    load line 9 - 15  //Because it is a linked list, it is read serially
     t2 = rdtscp()
    print t2 - t1

B : for(;;){
}
当仅运行时,输出结果平均为200。当B和A使用相同的内核超线程运行时,A的输出结果为90

如果超读的效果使时间变长,我可以理解,可能是干扰,但时间变短的原因是什么

我的服务器配置如下:

 Linux version 4.15.0-122-generic (buildd@lcy01-amd64-010) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12)) #124~16.04.1-Ubuntu SMP

Skylake L2命中延迟约为12个周期。如果您测量的是26,那么您的CPU可能没有提升到与RDTSC参考时钟速度类似的核心时钟速度?(即使这样,也不确切。)启动另一个线程(并运行无限循环)可能会让CPU有更多的时间提升。我认为你是对的。当我单独重新运行时,我将其重置为绑定到核心,现在结果正常。Skylake L2命中延迟约为12个周期。如果您测量的是26,那么您的CPU可能没有提升到与RDTSC参考时钟速度类似的核心时钟速度?(即使这样,也不确切。)启动另一个线程(并运行无限循环)可能会让CPU有更多的时间提升。我认为你是对的。当我单独重新运行时,我将其重置为绑定到核心,现在结果正常。