我将Linux内核2.6.32移植到Intel(R)Xeon(R)CPU E31275 @ 3.40GHz.如果我在BIOS中启用超线程,我可以看到8个CPU内核(CPU0~CPU7).大多数中断发生在CPU 4中,并且该核心的CPU使用率远高于其他中断(几乎是其他中断的两倍).我不太了解它,因为我认为我没有设置任何IRQ绑定操作.
如果我在BIOS中禁用超线程,那么一切正常.IRQ已经平衡,所有内核(CPU0~CPU3)的CPU使用率也几乎是平衡的.
有人可以解释一下吗?它与BIOS有关吗?我应该在内核中做一些特殊设置吗?
不同的进程可以同时运行RDTSC吗?还是这是只有一个内核可以同时运行的资源?TSC位于每个内核中(至少您可以针对每个内核分别进行调整),因此应该可行。但是超级跑步呢?
我该如何测试?
我有一个带有4个HT内核(8个逻辑CPU)的Intel CPU,并构建了两个简单的进程。
第一个:
int main()
{
for(int i=0;i<1000000;++i)
for(int j=0;j<100000;++j);
}
Run Code Online (Sandbox Code Playgroud)
第二个:
int main()
{
while(1);
}
Run Code Online (Sandbox Code Playgroud)
两者都编译时gcc没有特殊选项。(即默认值为-O0:无优化调试模式,将变量保留在内存中而不是寄存器中。)
当我在第一个逻辑CPU(CPU0)上运行第一个时,并且当其他逻辑CPU的负载费用接近0%时,此第一个进程的执行时间为:
real 2m42,625s
user 2m42,485s
sys 0m0,070s
Run Code Online (Sandbox Code Playgroud)
但是,当我在CPU4上运行第二个进程(无限循环)时(CPU0和CPU4在同一内核上,但不在同一硬件线程上),第一个进程的执行时间为
real 2m25,412s
user 2m25,291s
sys 0m0,047s
Run Code Online (Sandbox Code Playgroud)
我期望更长的时间,因为在同一核心上有两个进程,而不是只有一个。但这实际上更快。为什么会这样?
编辑:P状态驱动程序是intel_pstate。使用来固定C状态processor.max_cstate=1 intel_idle.max_cstate=0。将调速器设置为性能(cpupower frequency-set -g performance),禁用涡轮增压(cat /sys/devices/system/cpu/intel_pstate/no_turbo给出1)
在玩超频和运行刻录测试时,我注意到,启用超线程时,AVX优化版LINPACK测量的多线程浮点吞吐量低于禁用超线程的浮点数.这是在Ivy Bridge i7(3770k)上.我还注意到,尽管我在较低的核心电压下运行CPU,但是使用超线程禁用LINPACK导致更高的核心温度.所有这些让我相信,如果没有超线程,管道利用率实际上更高.
我很好奇:这只是LINPACK算法固有的东西导致管道停顿或SMT效率低下的问题,或者当两个线程发出宽SIMD指令时,英特尔的SMT实现是否合法地调度流水线?如果是这样,那么Haswell已经解决了这个问题,还是将来会在未来的英特尔架构中解决?这是AVX512容易出现的问题吗?
最后,在使用AVX进行英特尔系统编程时,是否有任何好的步骤可以避免使用SMT进行低效的流水线分配?
超线程技术是英特尔推出的一种同步多线程技术.
这些资源包括执行引擎,缓存和系统总线接口; 资源共享允许两个逻辑处理器更有效地相互协作,并允许停滞的逻辑处理器从另一个逻辑处理器借用资源.
在具有超线程的Intel CPU中,一个CPU内核(具有多个ALU)可以在同一时钟执行来自2个线程的指令.两个线程共享:存储缓冲区,缓存L1/L2和系统总线.
但是如果两个线程在一个Core上同时执行,则thread-1存储原子值,而thread-2加载此值,将用于此交换的内容:共享存储缓冲区,共享缓存L1/L2还是通常的缓存L3?
如果两个线程来自同一个进程(相同的虚拟地址空间)和两个不同进程(不同的虚拟地址空间),会发生什么?
Sandy Bridge Intel CPU - 缓存L1:
低12位 - 对于确定当前设定数值很重要
4 KB - 标准页面大小
超线程CPU是实现并行还是并发(上下文切换)?
我的猜测是没有并行性,只有上下文切换的并发性.
我注意到JVM线程由于某些原因在Linux下作为进程运行(如果我错了,请纠正我).此外,事实上英特尔的超线程仅为属于同一进程的两个线程提供了额外的并行化.
这是否意味着单个多线程JVM程序不会从Linux下的超线程中获利,因为它的线程不是来自CPU的线程"观点"?
所以我正在运行一个在我的i7笔记本电脑上没有并行化的cpu密集型任务.
KSysGuard报告说我使用了12.5%的可用CPU.
如果我禁用超线程,我可能会获得有意义的性能提升?它需要刷新一个新的BIOS,所以在我过分参与这个想法之前我想要一个意见......
谢谢,
ñ
我读到多线程是一个单核可以管理多个线程(不是并行)的功能,好处是CPU一直在工作。对于超线程,单个核心创建 2 个虚拟核心,每个物理核心占用 2 个线程,其好处与多线程相同。
为什么很多人说超线程比多线程更好?
Ryzen CPU 使用超线程还是多线程?
cpu multithreading cpu-architecture hyperthreading amd-processor
hyperthreading ×10
intel ×3
linux ×3
x86 ×3
cpu ×2
avx ×1
concurrency ×1
java ×1
jvm ×1
linux-kernel ×1
multicore ×1
performance ×1
rdtsc ×1
scheduling ×1
x86-64 ×1