• 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. web 安全之页面解析的流程学习

    0x00 任务内容: 理解域名解析的整个过程 理解 web 页面请求的整个流程,绘制流程图(nginx 处理的 11 个过程) 学习 http 协议中的字段及含义 学习 http 请求方法以及返回状态 ...

  2. Python之爬虫(十七) Scrapy框架中Spiders用法

    Spider类定义了如何爬去某个网站,包括爬取的动作以及如何从网页内容中提取结构化的数据,总的来说spider就是定义爬取的动作以及分析某个网页 工作流程分析 以初始的URL初始化Request,并设 ...

  3. How to start MySQL on Linux

    启动MySQL数据库 service mysql start 查看MySQL进程 ps -ef |grep mysql 查看MySQL端口号 cd /etc/init.d/ netstat -atnp ...

  4. 从JDK源码理解java引用

    目录 java中的引用 引用队列 虚引用.弱引用.软引用的实现 ReferenceHandler线程 引用队列的实现 总结 参考资料 java中的引用 JDK 1.2之后,把对象的引用分为了四种类型, ...

  5. 一文快速掌握华为云IPv6基础知识及使用指南

    随着5G.物联网等新兴技术领域的发展,IP空间需求巨大,IPv6成为万物互联的基础,势在必行:华为云作为IPv6成熟商用开拓者,针对金融.广电.媒资等不同行业推出IPv6解决方案,助力企业平滑升级到I ...

  6. /dev/mapper/VolGroup00-LogVol00 满了,根目录存储垃圾文件导致磁盘满了

    登录系统,df -H 发现磁盘存储快满了 解决办法 1. 使用命令查出根目录下大的垃圾文件 使用 du -sh /* | sort -nr 查看根目录下的的大文件,找的不要的 rm -rf 使用 fi ...

  7. noi linux gedit 配置(c++环境)

    基本配置 方法一 查看所有命令: gsettings list-recursively | grep -i gedit 命令解释 gsettings set org.gnome.gedit.prefe ...

  8. Mock分页

    前后端分离开发时,一般会使用mock. 因为mock是用node运行的,行为与调用后台一致. 这样,不需要等后台写好,只要有接口文档,前端可以自己调接口,这样联调时遇到的问题会少很多,可以加快整体开发 ...

  9. Inoreader - 在线Rss阅读器

  10. 使用 Github Actions 自动部署 Angular 应用到 Github Pages

    前言 最近在学习 Angular,一些基础的语法也学习的差不多了,就在 github 上新建了一个代码仓库,准备用 ng-zorro 搭个后台应用的模板,方便自己以后写些小东西时可以直接使用.前端项目 ...