• 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. python虚拟环境 + 批量pip + 换源

    python虚拟环境 + 批量pip + 换源 虚拟环境 曾经我是一个小白,不管运行什么项目都用一个环境,后来项目多了,有的是Django1.11的有的是Django2的,有的项目只能在3.6上运行, ...

  2. MySQL入门(alter语法 与 外键)

    MySQL入门(三) 字段的修改.添加.与删除 修改表字段使用alter table语句,谨记! create table tf1( id int primary key auto_increment ...

  3. 【python】Anaconda4 linux/windos安装

    一.什么是Anaconda 二.Win10 安装Anaconda 三.Linu 安装Anaconda ------------------------------------------------- ...

  4. Linux find 查找 并删除文件 杀掉进程

    find 默认在当前 即 . 目录下查找 du 文件名 / 目录 # 查看文件占用内存大小 1. 按照文件名查找 find / -name qwe # qwe为文件名 find / -name *qw ...

  5. 线性dp 之 麻烦的聚餐

    题目描述 为了避免餐厅过分拥挤,FJ要求奶牛们分3批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想,所有第3批就餐的奶牛排在队尾,队伍的前端由设定为第1批就餐的奶牛占据,中间的位置就归第2 ...

  6. 高效C++:继承和实现

    如何正确的使用继承和实现是本章说明的重点. 确定public继承的关系是is-a public继承等同于is-a 对public继承,所有base的特性,在derived上都适用 避免遮掩继承而来的名 ...

  7. 设计模式:composite模式

    目的:使容器和内容具备一致性 实现:将对象组合成树形结构以表示“部分-整体”的层次结构 实例:文件夹中可以包含文件夹也可以包含文件 例子: class Item //接口定义 { public: vi ...

  8. 3c数码商城

    目标:2020样卷 已完成:增删改查 未完成:有些小知识点不在意丢失,因此导致有些未完善 解决方案:写代码时不要走心,专心一点,减少失误,减少时间,增加效率,使自己的项目看起来更优秀,注意小知识的掌握 ...

  9. INS(Instagram)如何绑定谷歌二次验证码/谷歌身份验证/双重认证?

    1.打开Ins,找到双重验证界面   打开Ins,点击右上角“三”-“设置”-“安全”-“双重验证”-“选择安全验证方式”-“身份验证应用”-“立即开启”-“手动设置”-“复制密钥”-“输入验证码” ...

  10. 解决用vscode开发arduino时Serial未定义

    在工作目录编辑c_cpp_properties.json文件 添加defines字段 { "configurations": [ { "name": " ...