Tesla图形与计算架构:流处理器阵列(scalable streaming processor array,SPA)+存储器系统,由片上互联网络连接;
存储器系统:存储器控制器(MMC)、固定功能的光栅操作单元(raster operation processors,ROP),二级纹理缓存;
MMC:负责控制片外的DRAM显存,每个存储器可以提供64bit位宽;
ROP:对存储器内的数据进行颜色和深度操作;
SPA可以将计算得到的深度与颜色信息发送给ROP,也可以直接读写DRAM或者通过纹理缓存以制度方式访问DRAM;
SPA:若干个TPC(Thread Processing Cluster,线程处理器群)构成;
2~3个SM(Streaming Multiprocessor)组成一个TPC;
G200:10个TPC,每个TPC中有3个SM;
SM:大致相当于一个具有8路SIMD的处理器,指令宽度不是是32(即warp size);
每个SM具有独立的完整前端,包括取址、译码、发射和执行单元等;
同一个TPC中的SM共享存储器流水线;
包含8个线程处理器(Thread Processor,TP或者成为SP);
Sp有独立的寄存器和指令指针,没有取指和调度单元构成的完整前端,类似于当代多线程CPU中的一条流水线;
CUDA编程模型中:整个Grid被加载到SPA上,再将整个Block分发到各个SM上,TPC是透明的;
相互之间不能通信的粗粒度并行block 被分发到各个SM上,每个Block内的细粒度写作线程数量因为SIMT的自动向量化可以灵活调整;
在通用计算中,存储器带宽往往成为制约计算性能提高的瓶颈;
Tesla通用速算模型:
CTA:(Collaborative Tread Arrays), CUDA程序的任务分发单位,CTA与block是同一事物在执行模型和编程模型中的表述;
同一个block中的线程使用同一块shared memory;
一个CTA里的线程必须被分配到同一个SM中;
目前硬件下,CTA最多由16个warp组成(512个线程);
目前架构下,函数执行参数和参数要通过shared memory 传递到各个CTA:因为shared memory尺寸较大,并且可以读写;
Compute Scheduler:计算分发单元;
采用轮询算法,尽可能平均地将各个CTA分发到各个SM上,同时在每个SM上分配尽可能多的CTA;
知识点:
同一个SM上可以存在多个warp上下文,但是一个时刻只有一个warp被执行;
一个warp中所有线程必须属于同一个CTA;
一个SM上应该保持多个CTA上下文,就可以比只有一个CTA的上下文更好的隐藏延时;
现有架构中一个SM中至少有6个active warp才能隐藏延迟;
属于同一个warp的thread之间进行通信,不需要进行栅栏同步(barrier);
发射逻辑电路使用一个加权算法计算各条warp指令的优先级;
优先级受到warp所在的block、warp指令类型和其他一些因素的影响;
当一条指令需要用到的register和shared memory资源都处于可用状态的时候,这条指令的状态被设置为就绪状态(ready);
发射逻辑单元从指令级中选择优先级最高的就绪态指令;
如果一个warp中有几条处于就绪状态的指令等待执行,这些指令会被连续发射,知道重新计算warp的状态和优先级,或者发射逻辑选择了来自另一个warp的指令;
Shared memory:用于实现block内的thread通信;
被组织为16个bank;
Global memory中的数据要先写入register,才能转移到shared memory;
执行单元:
SM中最主要的执行资源为8个32bit ALU和MAD;
Sp: 一个branch单元和一个ALU或者MAD;
ALU和MAD需要4个sp周期才能执行完毕:首先取出数据需要一个时钟周期,然后利用3个时钟周期进行运算;
特殊运算单元:DPU(Double Precision Unit),用来处理寄存器中的64位浮点和整形操作数的64bit乘加单元;在GT200中每个SM中只有一个;
SFU: 执行超越函数、插值、倒数、平方根倒数、正弦、余弦以及其他特殊运算;cuda中提供的一些带有”_”前缀的函数由SFU只需将能够;SFU指令大都有16个时钟周期的延迟;
双发射并行:在NVIDIA的微架构设计中,sp执行一条指令再怎么也有至少两个核心周期的延迟,sm每个核心周期能够发射一条指令;
当sm发射一条指令后,sp经过一段时间才能执行完毕,此时sm再发射一条指令,这种机制成为双发射并行(dual issue);
双发射不仅提高了使用率,但是也增加了寄存器的带宽压力;
纹理,渲染和存储器流水线:
进行数据输入输出;
存储器流水线:纹理流水线、加载流水线和渲染输出流水线;
纹理流水线和加载流水线进行读取操作,ROP流水线进行写入操作;
纹理缓存与CPU缓存比较:
Cpu缓存为一维的,存储器地址为线性的;典型的纹理是二维连续的,读取地址也必须是在两个维度上连续分布的;加载时要将二维纹理地址映射到一维;
纹理缓存是只读的,并且不满足缓存数据的一致性;
纹理缓存的主要功能是节省带宽和功耗,CPU缓存是为了实现较低的访问延迟;