贝壳电子书 > 教育出版电子书 > smt >

第6章

smt-第6章

小说: smt 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!



类为TMT(Temporal MultiThreading,时间多线程),以和SMT相区分。   首先介绍CMT——Coarse…Grained MultiThreading是因为:它是最简单的多线程技术,当单一执行线程遇到长时间的延迟,如Cache Missed时,就进行线程切换,直到原线程等待的操作完成,才切换回去。Coarse…Grained MultiThreading有时也叫Block MultiThreading堵塞多线程或者Cooperative MultiThreading协作多线程。   由于CMT很简单,因此很多处理器都有实现,除了下面列出之外,很多嵌入式微控制器都有实现:   1999年的IBM RS64 III「Pulsar」(单核心/双线程)   2005年Fujitsu SPARC64 VI「Olympus…C」(双核心/4线程)   2006年Intel Itanium 2「Montecito」(双核心/4线程)   2007年Intel Itanium 2「Montvale」(双核心/4线程)   Intel的Itanium 2赫然在目   FMT——Fine…Grained MultiThreading随时可以在每个时钟周期内切换多个线程,以追求最大的输出能力——当然,随时可以切换也是有代价的,它拉长了每个执行线程的平均执行时间。Fine…Grained MultiThreading有时也叫Interleaved MultiThreading交错多线程或者Pre…emptive MultiThreading抢先多线程。   和CMT比起来,FMT要复杂一些,因此相应的处理器就没有那么多,例:   2005年Sun UltraSPARC T1「Niagara」(8核心/32线程)   2007年Sun UltraSPARC T2「Niagara 2」(8核心/64线程)   其实UltraSPARC T2同时还使用了其他的MT技术,才实现了比T1多了一倍的多线程能力,仔细看看上图,T2还使用了什么MT技术(注意第一段的CMT是Chip MultiThreading的意思而不是Coarse…Grained M最典型的:Intel Pentium 4或者Core i7ultiThreading的意思)?   虽然CPU上使用FMT技术的并不 早在NV G40以及ATI R520开始,GPU内部就开始应用了FMT细粒度多线程技术,为了隐含Cache Miss的存储器高延迟,GPU内部的执行单元不停地在工作线程之间切换,提升总的处理能力。不过,G40的FMT实现了具体多少个线程笔者倒不是很清楚,根据资料看应该在100左右。   前面说过,SMT其实和其他两种多线程技术都不同——那两种技术被称之为TMT时间多线程。SMT——Simultaneous MultiThreading具有多个执行单元,可以同时运行多条指令,因此才叫做“同步多线程”!SMT起先源自充分挖掘超标量架构处理器的潜力——超标量的意思就是可以同时执行多个不同的指令。因此SMT具有最大的灵活性和资源利用率,然而实现也最复杂(当然比起多核结构来说就是小意思了)。   2002年Intel Pentium 4 Xeon「Prestonia」(单核心/双线程)   2007年Sun UltraSPARC T2「Niagara 2」(8核心/64线程)   2008年Intel Core i7「Nehalem」(4核心/8线程)   这里又看到了UltraSPARC T2,这是因为它同时采用了FMT和SMT技术:因为UltraSPARC T2具有两个执行单元,每一个线程组使用一个,线程组内则按照T1那样执行4个线程。现代的GPU也采用了类似的混合设计:   不同的流处理器可以同时执行不同的线程,当然同一个流处理器也可以在不同的线程之间切换。   介绍了所有的MT多线程技术种类之后,我们可以来看Intel的HyperThreading超线程技术了,前面说过,Intel具有超线程技术的CPU有:Pentium 4(NetBurst架构)、Core i7(Nehalem架构)、Itanium 2(Mondecito)、Atom(Silverthorne)。我们已经知道具有超线程技术的Pentium 4/Pentium 4 Xeon(不是所有的P4都有超线程技术)采用的是SMT架构,Core i7的则是其改进版本。我们再来看看Itanium 2:Itanium 2 Montecito采用了双核心设计,每核心两个线程;Itanium 2 Montecito的超线程技术采用了CMT架构; 可见,Itanium 2的超线程技术和Pentium 4的SMT不同,它实际上是CMT粗粒度多线程技术。这是因为Itanium 2是In…Order架构的,SMT的原始构想就是充分压榨OOOE(Out…Of…Order Execution)的能力,因此In…Order架构的Itanium 2就没有采用SMT的方式。因为要创建多个线程的代价太大。   那是否In…Order架构的处理器就不能实现SMT了呢?并不是,Intel的Atom就是一个典型的例子: 除了Atom之外,IBM的怪物Power6(起始频率4。7GHz)也采用了基于In…Order架构的SMT技术(Power5的SMT是基于Out…Of…Order):IBM Power6处理器,双核,每核两个线程;Power6:In…Order + SMT,Power5则是Out…Of…Order + SMT。'2'
'编辑本段'超线程“灵魂附体”——同步多线程技术
  在NetBurst微架构后期,Intel为了维持性能上的优势,将Prescott核心的Pentium 4流水线拉长到31级;细化后的流水线可以被分成若干个环节,然后执行不同的任务进程,Intel将其称为“Hyper…Threading Technology(超线程技术,简称HT)”。但过长的流水线需要进行大量的分支预测工作,而且一旦预测失准,就要把当前的工作全部推倒重新来过。这就造成了Pentium 4 HT处理器空有高频率,发热量也大得惊人,性能却提高有限,最终还被扣上了“高频低能”的大帽子。   从原则上来讲HT技术绝对是一项非常有意义的创新和尝试,如果我们假设当初HT遇到的不是流水线冗长Prescott Pentium 4,而是更加精简高效的Core 2 Duo,结果会怎样?   当然,只有14级流水线的Core 2 Duo最终还是与HT擦肩而过(当初的理由是过短的流水线没必要引入超线程技   术);但这并不代表Intel放弃了这方面的努力,现在Nehalem就在尝试做这样的事情。所不同的是,这次的主角有了一个新名字——Simultaneous Multi…Threading(同步多线程,简称SMT)。   新技术允许内核在同一时间运行两个不同的进程,以此来压缩多任务处理时所需要的总时间。这么做有两个好处,其一是提高处理器的计算性能,减少用户得到结果所需的时间;其二就是更好的能效表现,利用更短的时间来完成任务,这就意味着在剩下的时间里节约更多的电能消耗。当然这么做有一个总前提——保证SMT不会重复HT所犯的错误,而提供这个担保的则是在Core微架构中表现非常出色的分支预测设计  1、 Event   用事件(Event)来同步线程是最具弹性的了。一个事件有两种状态:激发状态和未激发状态。也称有信号状态和无信号状态。事件又分两种类型:手动重置事件和自动重置事件。手动重置事件被设置为激发状态后,会唤醒所有等待的线程,而且一直保持为激发状态,直到程序重新把它设置为未激发状态。自动重置事件被设置为激发状态后,会唤醒“一个”等待中的线程,然后自动恢复为未激发状态。所以用自动重置事件来同步两个线程比较理想。MFC中对应的类为CEvent。。CEvent的构造函数默认创建一个自动重置的事件,而且处于未激发状态。共有三个函数来改变事件的状态:SetEvent;ResetEvent和PulseEvent。用事件来同步线程是一种比较理想的做法,但在实际的使用过程中要注意的是,对自动重置事件调用SetEvent和PulseEvent有可能会引起死锁,必须小心。   多线程同步…event   在所有的内核对象中,事件内核对象是个最基本的。它包含一个使用计数(与所有内核对象一样),一个BOOL值(用于指明该事件是个自动重置的事件还是一个人工重置的事件),还有一个BOOL值(用于指明该事件处于已通知状态还是未通知状态)。事件能够通知一个线程的操作已经完成。有两种类型的事件对象。一种是人工重置事件,另一种是自动重置事件。他们不同的地方在于:当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程。   当一个线程执行初始化操作,然后通知另一个线程执行剩余的操作时,事件使用得最频繁。在这种情况下,事件初始化为未通知状态,然后,当该线程完成它的初始化操作后,它就将事件设置为已通知状态,而一直在等待该事件的另一个线程在事件已经被通知后,就变成可调度线程。   当这个进程启动时,它创建一个人工重置的未通知状态的事件,并且将句柄保存在一个全局变量中。这使得该进程中的其他线程能够非常容易地访问同一个事件对象。程序一开始创建了三个线程,这些线程在初始化后就被挂起,等待事件。这些线程要等待文件的内容读入内存,然后每个线程都会访问这段文件内容。一个线程进行单词计数,另一个线程运行拼写检查,第三个线程运行语法检查。这3个线程函数的代码的开始部分都相同,每个函数都调用WaitForSingleObject。,这将使线程暂停运行,直到文件的内容由主线程读入内存为止。一旦主线程将数据准备好,它就调用SetEvent,给事件发出通知信号。这时,系统就使所有这3个辅助线程进入可调度状态,它们都获得了C P U时间,并且可以访问内存块。这3个线程都必须以只读方式访问内存;否则会出现内存错误。这就是所有3个线程能够同时运行的唯一原因。如果计算机上配有三个以上CPU,理论上这个3个线程能够真正地同时运行,从而可以在很短的时间内完成大量的操作   如果你使用自动重置的事件而不是人工重置的事件,那么应用程序的行为特性就有很大的差别。当主线程调用S e t E v e n t之后,系统只允许一个辅助线程变成可调度状态。同样,也无法保证系统将使哪个线程变为可调度状态。其余两个辅助线程将继续等待。已经变为可调度状态的线程拥有对内存块的独占访问权。   让我们重新编写线程的函数,使得每个函数在返回前调用S e t E v e n t函数(就像Wi n M a i n函数所做的那样)。   当主线程将文件内容读入内存后,它就调用SetEvent函数,这样操作西永就会使这三个在等待的线程中的一个成为可调度线程。我们不知道系统将首先选择哪个线程作为可调度线程。当该线程完成操作时,它也将调用S e t E v e n t函数,使下一个被调度。这样,三个线程会以先后顺序执行,至于什么顺序,那是操作系统决定的。所以,就算每个辅助线程均以读/写方式访问内存块,也不会产生任何问题,这些线程将不再被要求将数据视为只读数据。   这个例子清楚地展示出使用人工重置事件与自动重置事件之间的差别。   P u l s e E v e n t函数使得事件变为已通知状态,然后立即又变为未通知状态,这就像在调用S e t E v e n t后又立即调用R e s e t E v e n t函数一样。如果在人工重置的事件上调用P u l s e E v e n t函数,那么在发出该事件时,等待该事件的任何一个线程或所有线程将变为可调度线程。如果在自动重置事件上调用P u l s e E v e n t函数,那么只有一个等待该事件的线程变

返回目录 上一页 下一页 回到顶部 2 2

你可能喜欢的