文章目录

  • 一、CPU线程与OS线程
    • 1. CPU中的thread
    • 2. OS中的thread
  • 二、HT/SMT技术
    • 1. 定义
    • 2. 原理
    • 3. 带来的问题
  • 三、SIMT与SIMD
    • 1. SIMT
    • 2. SIMD
    • 3. 对比

一、CPU线程与OS线程

1. CPU中的thread

CPU中的线程来自同步多线程(SMT,Simultaneous Multi-threading)的概念,最早Intel使用了这种技术时候就叫做SMT,但后面改叫做HT (Hyper Threading)。

经常看到的2C4T的意思就是2核4线程。1个内核中的thread是对称的和对等的,在软件上没有任何区别,BIOS也只有通过一些特殊手段才能区分。4个thread调度起来没有本质区别,它们都有自己的APIC ID。用Local APIC寄存器发出IPI(Inter-Processor Interrupts),指定APIC ID的线程即被调度执行相应地址的指令了,也可以广播IPI让所有的thread都去执行指定任务。

操作系统并不探测CPU中thread的数量,而是通过广播IPI让各个thread自己来签到,再由BIOS通过APIC报告给OS的。

2. OS中的thread

OS中的线程有自己的栈空间,和同一进程中的其他线程共享地址空间。

操作系统中的进程可以很多,进程中的线程就更多了,常常有几十个上百个。而CPU的Thread就那么固定几个,是稀缺资源。两者都叫Thread是因为他们都是调度的基本单位。操作系统负责把它产生的软Thread调度到CPU中的硬Thread。

二、HT/SMT技术

1. 定义

把所有一个物理核心上有多个虚拟核心的技术都叫做HT/SMT,初衷是通过提升CPU核心后端执行单元的利用率,来提升整体的并行性能。

相比于增加物理核心,使用SMT来的更加廉价。因为SMT提供的是虚拟核心,所有虚拟核心共享很大一部分的资源,通常加入SMT技术只需要在前端额外增加一部分资源(毕竟两个任务是两个上下文)就可以。

2. 原理

除了频率以外,要提升CPU的单核性能,第一个常见手段就是尽可能的缩短每个指令执行的周期。第二个常见手段就是指令级并行(ILP),只要两个指令之间没有依赖(彼此不依赖对方执行后的数据)和冲突(不共享资源,不是一类操作)就可以并发执行,从而缩短总的执行时间。

显然,如果在一个CPU核心同时执行几组任务,那么CPU至少具备多组执行端口。所以现代的CPU要提升单核性能,都会尽可能的把后端的执行端口数目变多,并且尽可能的在单位时间内读入更多指令,从而促进指令间的并发。

实际的任务里,指令之间的依赖冲突关系是错综复杂的,不可能完美的将指令均匀的分组到每一个端口上。随着单核性能的不断提升,后端执行资源也越来越丰富,这种执行端口闲置的情况就会越来越明显,造成资源浪费。这时候,为了将这些资源物尽其用,SMT就应运而生了。SMT的思路是这样的,既然一个任务填不满后端的资源,那么我们就找不只一个任务来填就好了,不同任务之间的相互依赖和冲突情况很低,放到一起来执行正合适去填满后端资源,所以可以用不同的任务尽可能填满后端资源。

上图表示了在一个CPU核心上虚拟出两个虚拟核心,同时执行两个任务,从而缩短了执行时间。我们可以通过引入更多的虚拟核心,来进一步压榨利用率,只不过随着SMT虚拟的核心增多,提升的比率是在下降的。

3. 带来的问题

a. 多线程维护开销:一个物理核心如果引入多个线程,那么是要协调、隔离多个线程的,这会引入额外的开销。所以如果一个核心有两个线程,那么两个线程的总执行时间会更快,但是如果细分到每一个线程的执行时间,会比分别执行来的慢一些。

b. 资源冲突:SMT核心中,因为多个逻辑核心会共享很多资源,如果两个线程的性质比较接近,总是在使用类似的资源,那么它们会遭遇资源冲突。程度轻一点的情况下,互相等待一下就好,多牺牲一点单线程性能,还能保证多线程效率。而差一点的情况就是资源冲突反而导致性能下降。最典型的冲突就是缓存的冲突,一个线程可以用100%的缓存,而超过一个线程使用同一个缓存,可用缓存就不是100%,会导致大量开销极大的缓存-内存换入换出。只要有一个线程是非常吃缓存的,那么加入SMT不但不会提升总的执行效率,反而会降低整体的效率。SMT非常忌讳不同线程的资源冲突,一但冲突SMT就很容易引入反面效果。比如在很多云服务器、HPC服务器上,SMT通常是关闭的,就是因为资源冲突。

c. 线程安全问题:两个线程在同一个核心内执行,是需要严格隔离它们的上下文的,线程A不能访问修改其他线程的资源。线程隔离是一个非常复杂和繁琐的过程,如果隔离不彻底,那么会导致执行错误、以及隐私泄漏的问题。Intel前两年Skylake爆发的若干安全漏洞,就是因为线程隔离不到位造成的。

d. 导致功耗增加:SMT整体的思路是略微牺牲单核性能/能耗比,换取大多数情况下的多线程时的单核性能和能耗比,那么对应的加入SMT后单核的能耗比会有些许倒退。由于引入SMT会导致核心设计更加复杂,静态功耗、漏电会更难控制,这对于移动设备是致命的。这也是为什么SMT在PC和服务器上大行其道这么多年,手机上几乎看不到的原因。

三、SIMT与SIMD

1. SIMT

SIMT:single instruction,multiple threads。SIMT类似CPU上的多线程。最简单的理解SIMT的是想象有这样一个多核系统,每一个core有自己的寄存器文件、自己的ALU、自己的data cache,但是没有独立的instruction cache、独立的解码器、独立的Program Counter register,命令是从单一的instruction cache同时被广播给多个SIMT core的。即所有的core是各有各的执行单元,数据不同,执行的命令却是相同的。

2. SIMD

SIMD:single instruction, multiple data。Flynn分类法中的一种并行计算机。这种方法是指对多个进行同样操作的处理元素同时进行同等操作。这种机器利用了数据级别的并行性,而不是并发性(不是多线程那种)。SIMD允许使用单一命令对多个数据值进行操作,仅需要一个核心,只有一个进程在运行,多个计算共用一个ALU,只不过一次操作多个数据而已。这是一种增加CPU的计算能力的便宜的方法。仅需要宽的ALU和较小的控制逻辑。

3. 对比

a. SIMD跟SIMT不是一个数量级的,SIMD仅仅需要寄存器位数多一点,然后ALU宽一点,一次能处理的数据量很有限。SIMT在GPU上,GPU是有成百上千的单独的计算单元的。硬件实现上,明显GPU更复杂,成本也更高。

b. SIMD是一个线程,在一个核心上。SIMT是多个线程,多个核心上运行的线程。SIMT是真正的并行,各个线程的逻辑都可以有一定的区别;SIMD仅仅能进行简单的加减乘除运算而已。

c. SIMD是CPU上用的,SIMT是GPU上用的。SIMD更像是CPU的一个小扩展,SIMT是GPU上并发性的核心保证。


以上内容来源于网络知识总结,如有侵权请私信联系立即删除:)

CPU线程与超线程技术相关推荐

  1. CPU,核心,线程,超线程技术以及它们之间的关系

    CPU,核心,线程,超线程技术以及它们之间的关系 总结: 1.CPU就是处理器.(物理核心) 2.我们任务管理器下看到的CPU总数,是你的CPU物理核心数用超线程技术虚拟出来的核心数. 3.线程数就是 ...

  2. cpu线程_CPU核数和线程数有什么用?什么意思?CPU核数和线程的关系与区别

    我们在组装电脑选购硬件的时候,大多数的人群更在乎CPU的性能,除了考虑架构.工艺.单核性能等,还需要考虑核心和线程数量,CPU从早期的单核,发展到现在的双核.多核,除了核心数量之外,还有线程数量.那么 ...

  3. 【C++多线程编程学习(1)】-CPU个数、CPU核心数、CPU线程数

    转自:CPU个数.CPU核心数.CPU线程数(by kimsimple) CPU个数即CPU芯片个数. CPU核心数是指物理上,也就是硬件上存在着几个核心.比如,双核就是包括2个相对独立的CPU核心单 ...

  4. CPU知识(CPU个数、CPU核心数、CPU线程数、多核CPU等)

    CPU知识(CPU个数.CPU核心数.CPU线程数.多核CPU等 CPU个数.CPU核心数.CPU线程数 多核CPU 单核多CPU与多核单CPU 今天看到服务器中有8核8线程和8核16线程的区分,觉得 ...

  5. 【CPU线程和进程绑核】

    CPU线程和进程绑核 前言 一.进程绑核C语言实现 二.线程绑核C语言实现 三. shell命令绑核 前言 提示:这里可以添加本文要记录的大概内容: CPU绑定指的是在多核CPU的系统中将进程或线程绑 ...

  6. 物理CPU数、CPU核心数、CPU线程数

    Windows系统中,在cmd中输入命令"wmic". >wmic wmic:root\cli> 输入命令"cpu get Name",获取物理CP ...

  7. CPU个数、CPU核心数、CPU线程数

    核心概念 CPU个数:CPU芯片个数 CPU的核心数:是指硬件上存在着几个核心. 比如,双核就是包括2个相对独立的CPU核心单元组,四核就包含4个相对独立的CPU核心单元组. 线程数:一种逻辑的概念, ...

  8. cpu线程_进程/线程上下文切换会用掉你多少CPU?

    进程是操作系统的伟大发明之一,对应用程序屏蔽了CPU调度.内存管理等硬件细节,而抽象出一个进程的概念,让应用程序专心于实现自己的业务逻辑既可,而且在有限的CPU上可以"同时"进行许 ...

  9. cpu线程_记w3wp占用CPU过高解决过程Dictionary线程安全

    项目上线以来一直存在一个比较揪心的问题,和一个没有信心处理的BUG,那就是在应用程序启动时有可能会导致cpu跑满99%或持续在一个值如50%左右,这样一来对服务器的压力是非常大的,经常出现服务器无法远 ...

  10. java对cpu线程的要求_java-CPU份额对线程有什么影响

    我的问题更多地在Java线程方面.但是对于OS级别的线程,它可能也更通用. JAVA特定:ThreadPool Tuning Size的意义是什么(公式)?带有容器的冲击性能及其在发动机罩下的行为. ...

最新文章

  1. bmp文件头_「正点原子FPGA连载」第十九章SD卡读BMP图片LCD显示
  2. rsync源目录写法的一点小细节
  3. html region 折叠,js代码折叠的方法//#region 代码 //#endregion
  4. php微信支付na,虚拟支付
  5. Asp.net based Web Application部署后的问题
  6. java编译找不到符号 int age=in.nexint()_Java报错找不到符号,小白自学求大佬解决...
  7. careyshop-商城框架系统
  8. OOM分析(1) Android 源,如何分析android的OOM,与java静态代码分析工具
  9. 对比学习在NLP和多模态领域的应用
  10. GitHub正则表达式学习笔记
  11. 欧拉定理、费马小定理及其拓展应用
  12. ai人工智能的本质和未来_人工智能简介:这就是未来
  13. USB协议(1)USB基础知识
  14. Java学习实战教程之mysql优化
  15. 计算机没有显卡驱动,电脑没有显卡怎么办
  16. 什么是视频比特率:完整指南
  17. Linux下安装YASM--编译x264
  18. python binascii.b2a_hex_python标准模块介绍- binascii 二进制和ASCII转换
  19. Java基础学习——操作系统批处理(操作系统命令)
  20. Java项目部署到云服务器的思路

热门文章

  1. linux通过无线网卡上网,Linux使用4G/5G无线网卡模块上网
  2. 云存储及分布式文件系统
  3. 花一天时间体验 wintogo 到最终放弃
  4. 【IT职业】IT人的职业规划
  5. 源码:Spark SQL 分区特性第一弹
  6. Dr.com校园网客户端故障解决方法
  7. Choerodon猪齿鱼实践之集群管理(一)
  8. 从嗤之以鼻到“奇迹” 前淘宝工程师详解12306技术
  9. 联想电脑如何关闭/开启windows自动更新
  10. Flutter语言开发的高仿抖音App源码