NVIDIA Fermi GPU架构简单解析.

备注:这篇文章是我很早就写的了,大概在2009年10月末的时候就已经写好了,时间过了那么久,网路上面已经有N个版本的Fermi架构解析,大部分华语写的内容都是大同小异,诸位看看就好了,真正的精品请参考本文的参考文献;-)

来源:http://www.ispinel.com/2010/01/17/61

在过去的几年中,GPU的发展产生了较大的变化,GPU强大的性能被局限于处理图形渲染的任务,无疑是对计算资源的浪费,随着GPU可编程能力不断提高,通用计算(GPGPU: General-purpose computing on graphics processing units)应运 而生,目前已经取得部分显著成效,部分应用带来的性能提升也是非常可观.

在DirectX 10规范之前的GPGPU计算中,可编程的单元主要是顶点着色器和 像素着色器,两者在物理上是分离的,数量也是固定的,一个程序要想发挥其最大性能有较大的编程难度。

最早的GPGPU的 开发直接使用了图形学的API,将任务映射成纹理的渲染过程,使用汇编或 者高级着色器语言Cg,HLSL等等)编写程序,然后通过图形学API执行(Direct3D和OpenGL),这样的开发不仅难度较大,程序优化也有很大 难度,对开发人员的入门要求也是较高,因此,传统的GPGPU没有被广泛 应用.

2007年6月,NVIDIA公 司推出了CUDA,CUDA不需要借助图形学API,而是采用了类C语言进行开发。同时,CUDA的GPU采用了统 一处理架构,以及引入了片内共享存储器,这大大降低了基于GPU的并行计 算程式的开发难度。当然,开发人员仍然需要掌握并行算法和GPU架构相关 的知识.

G80和GT200 GPU架构回顾:

最早推出的G80架 构中,采用了128个SP(流处理单元Streaming Processor),每8个SP组成一个SM(多 流处理器Streaming Multiprocessors),每3个SM再组成一个TPC(Thread Processing Cluster, 线程处理器群).

注:在G80架构中,是两个SM组 成一个TPC,而GT200中,是三个SM组成 一个TPC.

G80里面有8个TPC,而GT200增加到了10个, 其中,每个TPC内部还有一个纹理流水线.

而在AMD的RV770中,具有10个SIMD engine,每个SIMD engine中有16个SIMD Core,每个SIMD Core相当于一个5D ALU,RV770则共有160个,GT200中有240个1D ALU.

许多DIY爱好者称之SP为 类似于CPU多核的”流处理器”,这个称 呼严格的看起来存在不妥,把SM与CPU的核相比更加合适。和现在的CPU的核一样,SM也拥 有独立的取指和调度单元构成的完整前端。SP 并不能算作独立的处理器 核,它们具有独立的寄存器和指令指针,但是并没有取指和调度单元来构成完整前端.

CUDA 编程模型简述:

在 CUDA 的架 构下,程式分为两个部份:host 和 device 。Host 是指 在 CPU 上执行的部份,而 device 端则是在GPU上 执行的部份。

Device 端的部分称之为 “kernel”。通常 host 端程序会将数据准备好后,复制到显存中,再由GPU执行 device 端 程序,完成后再由 host 端程序将结果从GPU中取回。

在CUDA架构下, 线程的最小单元是thread,多个thread组成一个block, 多个block再组成一个grid,不同block之 前的thread不能读写同一shared memory共享内存,因此,block里面的thread之间的通信和同步所带来的开销是比较大的。

SM 以 32 个 Thread 为一组的 Warp 来执行 Thread。Warp内的线程是静态的,即在属于同一个warp内的thread之 间进行通信,不需要进行栅栏同步(barrier)。

GT200中每个SM中有16KB的shared memory供8个SP共享,这也是GT200中线程中进行低延迟数据通信的唯一方法,因此地位至关重要。

但是16KB的shared memory可能对于某些程式来说偏小,所以Fermi在此作出了重大的改变。

简单解析Fermi:

Fermi的设计根据G80和GT200的架构作出的很多缺陷来改变。

在Fermi中,每 个SM中的数量不再是GT200的8个SP,而是变成了32个SP,NVIDIA现 在又称之为CUDA Core,总共具有16个SM,所以总共有512个SP。而在GT200中,是30个SM,240个SP。

至于Fermi为什么要做出一个SM内设计成32个SP,减少SM总数的 这样的设计,目前还不明白是为什么,不过这样设计或许可以减少控制逻辑控制单元。

Fermi支持每一个block里面启动1536个线程。而在GT200,这一数量是512个。

同时,在GT200和G80中,都是用IEEE 754‐985的单精度浮点标准。尤其是G80以及G92等GPU,是不支持双精度的,GT200尽管支持双精度,但是所带来的时间开销也是比较大的。

Fermi采用的是IEEE 754‐8的单精度浮点标准, 单精度和双精度都同时支持FMA功能FMA是通过MAD来完成乘法和加法操作,同时保证没有精度的损失。双精度的浮点计算在高性能计算中有着核心的重要位置。 Fermi架构为支持双精度浮点运算进行了特别设计每一个SM在一个时钟周期内 可以完成16个双精度浮点数的FMA操作。这是在GT200架构以后又一激动人心的设计。

Fermi拥有32位整数单元,很多常用整数运算的指令吞吐量都有了几倍的提升。Fermi双精度单元的提升也极为明显。由于local memory速度提高,因此高精度 的超越函数的吞吐量也会有一个数量级的提升。

Fermi存 储器改变:

刚 才提到,G80和GT200中每个SM中有16KB的shared memory,这在Fermi已经做出了极大的改观。

有些程式根本就不会用到shared memory,它们需要的是缓冲来提高性能,而有的程式对16KB的shared memory实在难以满足,因此Fermi对此作出了改变。

Fermi具有64KB的共 享存储器,这64KB的存储器可以作为48 KB的共享内存和16 KB的L1缓存,或者成为16 KB的共享内存和48 KB的L1缓存。

同时,Fermi也首次增加了768KB大小的L2缓存,可以提供所有的存储和纹理操作,L2缓存是和所有SM相通的。

Fermi增加了ECC功能 ,在大型集群和高可靠性领域中,ECC是一个重要的特性。这是业界第一款支持ECC校验的GPU。Fermi的寄存器,共享内存,L1和L2缓存以及显存DRAM都支持ECC校验,这增加了系统的可靠性。

同时,Fermi的原子操作能力大为提升,原 子操作对于并行计算来说至关重要,Fermi增加了众多的原子操控单元,以及使用了L2 缓存,使得Fermi的原子操控大大提升。

多个Kernel并发执行和支持C++:

Fermi支持同一个程式中的多个Kernel同时执行在一个Ferimi架构的GPU上面,这提高了GPU的利用率。

像CPU一样,GPU也可以利用context的切换来管理多任务的切换,Fermi的pipeline经过优化设计,把context切换时间开销降低到了10-20ms,性能得到极大的提高,这大大的优化了Kernel-to-Kernel的程式.

对于C++的支持毫无疑问是一个让人激动的设计,Fermi和PTX2.0 ISA实现了统一寻址空间,可以统一寻址3种不同的内存地址(线程私有变量,block的共享内存和全局内存)来进行存/取操作。

统一地址空间的实现,让Fermi完全支持C++编 程。在C++中,所有的变量和函数都在一个object中,通过指针访问。PTX2.0可以通过统一指针管理找到内存上的object,Fermi提供的 硬件寻址方式可以自动的把指针对应到相应的物理地址。同时,Fermi同 样提供C++虚函数(virtual function),函式指针(function pointer),new,delete,try,catch等等支持。

参考文献:

Whitepaper NVIDIA’s Next Generation CUDA Compute Architecture: Fermi —NVIDIA Corporation.

Fermi 白皮书中文翻译 v0.1版本  — NVIDIA Corporation/翻译:赵开勇

深入浅出谈CUDA.   –作者:Hotball

NVIDIA’s GT200— Inside a Parallel Processor    –Dr.David Kanter

NVIDIA Fermi 体系架构技术预 览   —Edison Chen

GPU高性能运算之CUDA –张舒 褚艳利 赵开勇 张钰勃/中国水利水电 出版社

一些关于Fermi的集中问答  — hpctech.com 张舒

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23216452/viewspace-626283/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23216452/viewspace-626283/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GPU高性能计算系列丛书的第一本《GPU高性能计算之CUDA》已经出版,由张舒,褚艳利,赵开勇,张钰勃所编写。本书除了详细介绍了CUDA的软硬件架构以及C for CUDA程序开发和优化的策略外,还包含有大量的实例供读者学习参考用。 下表是各个实例的介绍列表。 文件夹 对应书中章节 备注 ACsearch_DPPcompact_with_driver 5.2.2 AC多模式匹配算法 asyncAPI 2.5 异步API调用示例 bandwidthTest 2.3.6 带宽测试 Bitonic 5.1.1 双调排序网络 conjugateGradient 5.2.1 共轭梯度算法,CUBLAS实现 cudaMPI 2.7.3 CUDA+MPI管理GPU集群 cudaOpenMP 2.7.2 CUDA+OpenMP管理多GPU deviceQuery 2.1.4 设备查询 histKernel 2.4.3 亮度直方图统计 matrixAssign 2.1.4 矩阵赋值 matrixMul 4.7.1 矩阵乘法,利用shared memory matrixMul_Berkeley 4.7.1 矩阵乘法,利用register reduction 4.7.2 并行归约(缩减)程序 scan 5.1.2 Scan算法,例如计算前缀和 scanLargeArray 5.1.2 Scan算法,可以处理大数组 simpleCUBLAS 5.1.3 CUBLAS库的简单应用 simpleCUFFT 5.1.4 CUFFT库的简单应用 simpleD3D9 2.6.2 CUDA与Direct3D 9互操作 simpleD3D10 2.6.2 CUDA与Direct3D10互操作 simpleGL 2.6.1 CUDA与OpenGL互操作 simpleMultiGPU 2.7.1 多设备控制 simpleStreams 2.5.2 流的使用演示 simpleTexture 2.3.8 简单的纹理使用 simpleTextureDrv 2.3.8 简单的纹理使用,驱动API 实现 sortingNetworks 5.1.1 双调排序网络,处理大数组 threadMigration 2.7.1 通过上下文管理和设备管理功能实现多设备并行计算 timing 4.2.1 设备端测时 transpose 4.7.3 矩阵转置 transposeDiagonal 4.7.3 矩阵转置,考虑partition conflict VectorAdd 2.2.3/2.3.4 矢量加 VectorAddDrv 2.2.3/2.3.4 矢量加,驱动API实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值