• FMT(fine-grained multithreading)又叫交叉多线程或指令交错多线程

–       每个时钟周期都进行线程的切换,多个线程交替执行,同一个周期只从一个线程发射指令到功能部件

–       理论上,FMT通过有效的调度可以完全隐藏存储延时,即在存储操作完成之前不从同一个线程取指

  • CMT(coarse-grained multithreading)又叫阻塞多线程或块交错多线程

–       连续执行一个线程的指令,直到遇到长延时操作才切换到另一个线程,也是同一个周期只能从一个线程发射指令

–       在线程切换发生之前,一个线程可以全速运行

–       CMT中的线程切换时机非常重要

  • SMT(simultaneous multithreading) 同时多线程(SMT)

–       每个周期把来自多个线程的指令发射到多个功能部件去执行,已经没有线程切换的概念

–       能够同时开发单个应用中的指令级并行和多个应用间的线程级并行

–       Intel的超线程(Hyper-Threading,简称HT)技术就是SMT的一种变体,并被应用在Xeon处理器和Pentium4处理器中

下面对比他们的不同,以下图为例:

此图含义:从上到下为时钟周期,4个方块为4个发射槽。

  FMT一个周期只允许一个线程发射指令。分析前2个时钟周期,第一个时钟周期线程4占有,它只发射一条指令,如 a=3;第二个时钟周期,切换到线程2,线程2发射2条可以并行执行的指令,如 a=b+c,d=e+f;之后切换到线程3...如此往复。

  CMT个周期也只允许一个线程发射指令。但是与FMT不同的是只有遇到长延时操作才切换到另一个线程。故一个线程可以较长时间占有发射槽。

FMT和CMT通过线程切换可以隐藏存储延时,因此减少了发射槽的垂直浪费。但由于FMT和CMT在同一个时钟周期里只能从一个线程发射指令,因此指令级并行不足造成的水平浪费仍然存在。

  SMT能够减少发射槽的水平浪费和垂直浪费(1)每个周期可以发射来自不同线程的指令去执行,通过线程级并行来弥补单线程指令级并行的不足,从而减少水平浪费(2)当某个线程因为长延时操作导致无法发射指令时,可以选择发射其他线程的指令,通过隐藏延时来减少垂直浪费,SMT的图分析不予赘述。

浅析FMT,CMT, SMT区别的更多相关文章

  1. 浅析scrapy与scrapy_redis区别

    最近在工作中写了很多 scrapy_redis 分布式爬虫,但是回想 scrapy 与 scrapy_redis 两者区别的时候,竟然,思维只是局限在了应用方面,于是乎,搜索了很多相关文章介绍,这才搞 ...

  2. JSTL解析——007——fmt标签库02

    各位亲们,近期事情比较多,没更新,come on! 1.<fmt:bundle>/<fmt:message>/<fmt:param>资源国际化标签 java中使用R ...

  3. 如何用json 与jsonp 的区别去回答你的面试官?

    常常 有面试官这样问我们,虽然用过无数次,但是回答不上岂不是尴尬,那我们浅析一下它们的区别? 1. json JSON是一种基于文本的数据交换格式,用于描述复杂的数据,举个例子: var nax=[ ...

  4. 11.javaweb国际化标签库

    一.国际化标签库 1,格式化标签库提供的标签 2,标签详解 2.1<fmt:setLocale>标签 下面设置不同的区域,并在设置的区域下显示日期 2.2<fmt:requestEn ...

  5. Go中的日志及第三方日志包logrus

    有别的语言使用基础的同学工作中都会接触到日志的使用,Go中自然也有log相关的实现.Go log模块主要提供了3类接口,分别是 "Print .Panic .Fatal ",对每一 ...

  6. Golang Learn Log #0

    Print/Printf 区别 Print: 可以打印出字符串, 和变量 fmt.Println(var) //right fmt.Println("string") //righ ...

  7. 浅析匿名函数、lambda表达式、闭包(closure)区别与作用

    浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ...

  8. JavaScript中const、var和let区别浅析

    在JavaScript中有三种声明变量的方式:var.let.const.下文给大家介绍js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始 ...

  9. C#中ref和out的区别浅析

    这篇文章主要介绍了C#中ref和out的区别浅析,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢,需要的朋友可以参考下   在C#中通过使用方法来获取返回值时,通 ...

随机推荐

  1. DRS是啥你都不知道?不是吧,不是吧

    前言 最近写了很多数据库相关的文章,大家基本上对数据库也有了很多的了解,数据库本身有所了解了,我们是不是应该回归业务本身呢? 大家去了解过自己企业数据库的部署方式么?是怎么部署的,又是部署在哪里的?部 ...

  2. python eval函数,将列表样式的字符串转化为列表

    python eval函数,将列表样式的字符串转化为列表 >>> str_1 = '[1,2,3,4,5,6]'>>> type(str_1)<type 's ...

  3. 服务器创建tensorflow环境,nni自动调参记录

    一.anaconda安装记录 1.1 下载安装脚本:wget https://repo.anaconda.com/archive/Anaconda3-5.2.0-Linux-x86_64.sh 1.2 ...

  4. 【高性能Mysql 】读书笔记(二)

    第4章 Schema 与数据类型优化 本文为<高性能Mysql 第三版>第四章读书笔记,Mysql版本为5.5 选择优化的数据类型 选择合适数据类型的三个原则 更小的通常更好 - 速度更快 ...

  5. SSRF漏洞简单分析

    什么是SSRF漏洞 SSRF(服务器端请求伪造)是一种由攻击者构造请求,服务器端发起请求的安全漏洞,所以,一般情况下,SSRF攻击的目标是外网无法访问的内部系统. SSRF漏洞形成原理. SSRF的形 ...

  6. Android 性能优化 ---- 内存优化

    1.Android内存管理机制 1.1 Java内存分配模型 先上一张JVM将内存划分区域的图 程序计数器:存储当前线程执行目标方法执行到第几行. 栈内存:Java栈中存放的是一个个栈帧,每个栈帧对应 ...

  7. 一张图就可以完美解决Java面试频次最高、GG最高的题目!快点收藏

    如果要问Java面试频次最高的题目,那么我想应该是HashMap相关了. 提到HahMap,必然会问到是否线程安全?然后牵扯出ConcurrentHashMap等,接着提及1.7和1.8实现上的区分, ...

  8. js中实现继承的方法

    目录 借用构造函数 组合继承 原型式继承 寄生式继承 寄生组合式继承 借用构造函数 这种技术的基本思想很简单,就是在子类型构造函数的内部调用超类型的构造函数.另外,函数只不过是在特定环境中执行代码的对 ...

  9. MSSQL系列 (二):表相关操作、列操作、(唯一、主键、默认、检查、外键、非空)约束、临时表

    1.创建表 --创建学生班级表 create table StuClass ( ClassId int primary key, --班级ID 主键约束 ClassName nvarchar(30) ...

  10. 浅谈Python中的深浅拷贝的区别

    深.浅拷贝总结 深拷贝 拷贝可变数据类型,如列表容器: a = [1, 2, [3, 4]] b = copy.deepcopy(a) a 与 b 所指的列表容器的空间地址不一致,即 id(a) != ...