CUDAC++ / GPU结构基础
CPU基本架构与GPU基本架构
Shared Memory(SM):共享内存,不是缓存
Special Function Units (SFU):特殊功能单元,超越运算(sin,cos)和插值。
MT Issue:Multithreading issuing unit,多线程发布单元,调度指令
I cache:Instruction cache,指令缓存
C cache:Constant cache,常量缓存
核(Kernel):在线程上运行的代码部分。
网格(Grid):一组线程块。在全局内存中共享数据。
块(Thread block):线程块,最多512个线程。在共享内存中共享数据。
一个SP对应一个Block,块内线程通过共享内存,原子操作和屏障同步进行协作。不同块中的线程无法协作
一个warp有32个线程,在SM上工作,有SM动态调度。
流式多处理器(SM)
组成
8个流式处理器
2个特殊功能单元
16KB共享内存
Warp
Warp是CUDA中,SM 执行的最小单位
一个SM最多8个块,一个块最多512个线程,每个块划分为多个warp,一个warp最多32个线程。
为warp中所有线程分派一条指令所需4个时钟周期
如果每n条指令需要一次全局访问内存,全局内存延迟为400周期。
则最少需要400/4n的容忍时间。
Warp,SM,SP,Block,Thread的关系
分配关系:
以Block为单位分配给SM,SM又将Block以Warp为单位将线程分组,然后分配给SP,一个SP对应一个线程。
所以关系为:(Block = SM )> Warp > (SP = Thread)。
SM是流式多处理器,SP是流式处理器,一个SM包含多个SP。SM和SP是硬件层次的。
CUDA在实际执行过程中,以Block为单位,把一个个的Block分配给SM进行运算。一个Block最大512个线程
而Block中的线程又会以warp为单位,对thread分组进行运算。一个Warp最多32个线程。
512个线程的块,可以划分为16个Warp,若一个块只有500个线程,也就是最后一个块少了12个线程,也就是浪费了12个线程的计算能力。
Warp是CUDA中,SM 执行的最小单位。SM硬件可以实现0开销的warp调度。Warp是SIMD指令。SM执行一个Warp时,会将Warp中线程分配SM中各个SP处理,每个SP负责处理一个线程,不停轮替处理线程。资源允许的时候,每个SM最多8个块。
假设有3个块分配给SM,每个块有256个线程,那么每个SM多少个warp?
每个块可以分为256/32=8个warp。由于SM最多可以装8个块,所以这3个块可以分配给一个SM。
那么这个SM中有3*8=24个warp。
查询命令
获取活动的GPU的ID
int deviceId;
cudaGetDevice(&deviceId);
获取GPU的参数
cudaDeviceProp props;
cudaGetDeviceProperties(&props, deviceId);
int computeCapabilityMajor = props.major; //最大计算能力
int computeCapabilityMinor = props.minor; //最小计算能力
int multiProcessorCount = props.multiProcessorCount; //多处理器的数量,也就是SM的数量
int warpSize = props.warpSize; //warp的大小
本文来自博客园,作者:Laplace蒜子,转载请注明原文链接:https://www.cnblogs.com/RedNoseBo/p/17063272.html