热点推荐
ZOL首页 > 显卡 > 评测 > 1000元以上 >

Fermi架构针对GPU通用计算优化

领先A卡强项达50% 卡皇GTX480全球首测

CBSi中国·ZOL 作者:中关村在线 林光楠 责任编辑:林光楠 【原创】 2010年03月27日 05:06 评论
在本页阅读全文(共50页)

        ●强大的线程调度能力

    关于线程的调度问题,我们首先需要了解一些G80以来CUDA架构的线程关系。

        线程结构:CUDA将计算任务映射为大量的可以并行执行的线程,并且硬件动态调度和执行这些线程。Kernel以线程网格(Grid)的形式组织,每个线程网格由若干个线程块(block)组成,每个线程块又由若干个线程(thread)组成。实质上,kernel是以block为单位执行的,CUDA引入Grid只是用来表示一系列可以被并行执行的block的集合。各block是并行执行的,block间无法通信,也没有执行顺序。目前一个kernel函数中有一个grid,而未来支持DX11的硬件采用了MIMD(多指令多数据)架构,允许在一个kernel中存在多个不同的grid。


30亿晶体管的咆哮
线程、线程块和执行内核的关系

        Block:CUDA中的kernel函数实质上是以block为单位执行的,同一block中的线程需要共享数据,因此它们必须在同一个SM中发射,而block中的每一个线程(thread)则被发射到一个SP上执行。一个block必须被分配到一个SM中,但是一个SM中同一时刻可以有多个活动线程块(active block)在等待执行,即在一个SM中可以同时存在多个block的上下文。当一个block进行同步或者访问显存等高延迟操作时,另一个block就可以“趁虚而入”,占用GPU资源,最大限度利用SM的运算能力。

        arp:在实际运行中,block会被分割为更小的线程束,这就是warp。线程束的大小由硬件的计算能力版本决定。在目前所有的NVIDIA GPU中,一个线程束由连续的32个线程组成。warp中的线程只与thread ID有关,而与block的维度和每一维的尺度没有关系,这种分割方式是由硬件决定的。以GT200的角度来解释,warp中包含32条线程是因为每发射一条warp指令,SM中的8个SP会将这条指令执行4遍。在硬件中实际运行程序时,warp才是真正的执行单位。虽然warp是一个由硬件决定的概念,在抽象的CUDA编程模型中并不存在,但是其影响力绝对不容忽略。

        ●SM单元的双warp调度能力

        Fermi的每一个SM都有两个指令发送单元,可以同时让两个warp相互独立的并发运行。Fermi的Dual warp调度机制可以同时并发调度两个warp的一条指令分别在16个一组的CUDA core上进行计算,或者在16个存/取单元运行,或者4个SFU上运行。Fermi的调度器并不需要在指令流之间进行附属检查。利用如此优美的双发射调度机制,使得Fermi可以让硬件的计算能力达到极致。


领先A卡强项达50% 卡皇GTX480全球首测
Fermi架构的Warp运行关系

        在Fermi架构中,非常多的指令可以进行双发射,例如两条整数运算指令,两条浮点数运行指令,或者混合的整数,浮点,存取,和SFU特殊处理指令都可以被并发执行。单精度和双精度的指令一样可以并发执行。

        ●并行指令更自由

        NV不断充实周边资源,使用更激进的架构,而AMD不断扩大流处理器规模,都是为了更好的隐藏延迟。GT200架构已经可以控制SMIT活用跳转来在实现线程在不同的SM单元之间进行跳跃。命令单元为multi-thread模式,能够执行Out-of-Order指令,而当处理warp命令流时则是In-Order,而根据NV架构设计师John Nickolls的介绍,GT200架构实际warp中的线程也能够支持Out-of-Order。

        Fermi在每个SM前端都有两个Warp调度器和两个独立分配单元,和SM其它部分完全独立,均可在一个时钟循环里选择发送一半Warp,而且这些线程可以来自不同的Warp。分配单元和执行硬件之间有一个完整的交叉开关(Crossbar),每个单元都可以像SM内的任何单元分配线程(不过存在一些限制)。

        作为运算单元的CUDA核心在Fermi的SM每个单元中共2个组,每组16个,SFU有4组,载入/存储单元16个。这4个小组能够各自并行执行不同的Warp不同的指令。由于CUDA核心是16个一组,16线程并列会让物理vector变长。因此2个周期能够以32线程构成的单Warp的一个指令。载入/存储单元也同样如此。SFU因为是4线程并列,因此是以8周期执行1个warp。这样指令单元本身增加到了2个,各个指令单元能够每个周期发出2条指令。可以说Fermi实现的并行化指令自由度更高。

        ●GigaThread线程调度优化

        Fermi架构的另一个重要特性,就是它的双层分布式调度机制。在片上的层面(SPA Streaming Processor Array,流式处理器矩阵级别),全局的分布式线程调度引擎(global work distribution engine)分发block到每一个SM上,在SM层面,每一个warp分布式调度引擎按照32个线程为一个warp执行。

        Fermi实现了SM级别的双发射,意味着SPMD(单线程多任务)的实现。从并行kernel下探到最底层,实际上就是靠的SM级别的双发射。SM级别的SPMD上升到GPU核心级别,Fermi就是MPMD(多线程多任务)。这种设计已经越来越像CPU,而且随着GPU的发展,每走一步,就多像一份。

30亿晶体管的咆哮
Fermi实现了SM单元级别的双发射

        第一代GigaThread线程调度引擎,在G80架构中实现了12288个线程的实时的调度管理。Fermi架构不只是增强了原有的机制,而且引进了更快的context上下文交换机制,并行kernel执行机制,增强了线程block的调度能力。Fermi的这项能力相对于上一代GPU提高了10倍。

        同时像CPU一样,GPU也可以利用context上下文交换机制来管理多任务的切换,每一个任务都可以用分时的方式利用处理器的计算资源。Fermi的运算流水线经过优化设计,把context上下文的切换时间减少到了10~20毫秒,极大的优化了上一代的GPU架构。不只是性能的提高,这个设计可以让开发者创建更快的kernel-to-kernel应用程序,例如让程序在图形和PhysX上的应用,图形与物理效果处理之间的运算也将受益于更快的context上下文交换机制。

        ● 并行执行内核Concurrent Kernel Execution

30亿晶体管的咆哮
并行执行内核让资源利用更充分,计算速度更快

        Fermi支持kernel并发运行,同一应用程序的不同kernel可以同时运行在GPU上。Kernel并发机制可以让应用还曾向执行更多的kernel来发挥GPU的能力。例如,PhysX应用程序需要计算流体和固体,如果是串行执行,只能利用一半的线程处理器。Fermi的架构可以让同一个CUDA context的kernel都同时运行在同一个GPU上,这样可以更有效的利用GPU的资源。不同应用程序context的kernel函数也可以通过更快速的context切换,更快地运行在GPU上。

注:(本章节作者由林光楠和濮元恺合作完成)

上一页 1 ...13 14 15 16 17 ...50 下一页
本文导航
频道热词:华硕主板  Intel  AMD  
视觉焦点
显卡评测热点
排行 文章标题
TOP10周热门显卡排行榜
  • 热门
  • 新品