全部博文(2759)
分类: 高性能计算
2014-10-29 10:17:48
上图是 Fermi 架构的 GPU 的核心架构图。第一代Fermi 架构的 GPU 拥有30 亿个晶体管,512 个 CUDA Core。一个 CUDA Core 在一个时钟周期内执行一个线程(或kernel)中的一个浮点数或整数指令。512 个 CUDA Core 是按照16 个含有32 个 Core 的SM(流式多处理器,也叫 Scalar Processor,标量处理器) 进行组织的。GPU 拥有6 个64-bit 的显存分区(DRAM),因此支持 384-bit 的显存接口。最大支持 6GB 的 GDDR5 类型的显存容量,GPU 和CPU 之间通过 PCI-e 总线连接,千兆线程管理器负责将线程块分发到 SM (流式多处理器)中。
CUDA(Compute Unified Device Architecture,统一计算设备架构)是由NVIDIA推出的通用架构,是 GPU 应用程序的开发环境。
下图是 SM 及 CUDA Core 的架构图。
Fermi 架构的 GPU 每个 SM 拥有32 个CUDA Core,每个CUDA Core拥有完整的整数运算单元(ALU)和浮点数运算单元(FPU)。而 Fermi 架构采用了新的IEE754-2008 标准的浮点数运算标准,支持单精度和双精度运算的 FMA(fused multiply-add)指令,运算结果更精确。
Fermi 架构中,整数运算单元 ALU 几乎是经过全新的设计,对所有的指令完全支持 32-bit 精度,支持 64-bit 和可扩展精度的操作,同时也支持多种指令运算,包括布尔型、移位、比较、转化等。
每个SM 拥有16 个存取单元(LD/ST Unit),可以保证在一个时钟周期内16 个线程同时对源或目的地址进行计算,同时支持对缓存或显存任意位置读取数据。
SFU 用来执行超指令(transcendental instruction)如正弦、余弦、倒数和平方根等函数。每个 SFU 一次执行一个线程块中一个线程的一条指令。SFU 并不始终占用 SM 中的 dispatch 单元,即当SFU 处于执行状态的时候,dispatch 单元可以向其它的执行单元分发相应的指令。
双精度运算是高性能计算 HPC 的核心。Fermi 架构进行了专门的设计,提供前所未有的双精度性能:一个 SM 在一个时钟周期内可以执行16 次双精度的 FMA 乘加运算(因为一个 SM 中含有16个 FP64 的计算单元)。
在每个SM前端都有两个 Warp 调度器(Warp Scheduler)和两个指令分发单元(Instruction Dispatch Unit),并且和 SM 其它部分完全独立,指令分发单元和执行硬件之间有一个完整的交叉开关(Crossbar),每个单元都可以向 SM 内的任何单元分配线程(不过存在一些限制)。
SM 是以 32 个并行线程为一组的warp 为单位调度线程的,每一个 SM 的两个 warp(线程束)调度单元和两个指令分发单元,允许同时启动和执行两个 warp。Fermi 双 warp 调度机制可以同时启动两个 warp,并且将每个 warp 的一条指令分发到一组16 个 CUDA Core 上、16 个存取单元中或者是 4 个 SFU 上执行。因为 warp 彼此单独执行,所以,Fermi 的调度单元不需要检查指令流之间的相关性。
这种线程架构也不是没有缺点,就是要求 Warp 的每个线程都必须同时执行同样的指令,否则会有部分单元空闲。每组SM每个循环内可以执行的不同操作数:FP32 32个、FP64 16个、INT 32个、SFU 4个、LD/ST 16个。
大部分指令都可以实现双发射:两条整数指令,两条浮点数指令或者整数、浮点数、存、取混合指令,SFU 指令也可以并行发射。
共享内存使得同一个线程块中的线程可以相互协作,便于重复利用片上的数据,大大减少片外数据的传输。
在 Fermi 架构中,每个 SM 拥有64KB 的片上内存,可以配置为48KB 的共享内存和16KB的 L1 Cache 或者配置为16KB 的共享内存和48KB 的L1 Cache。