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的大小

 

posted @ 2023-01-20 21:28  Laplace蒜子  阅读(257)  评论(0编辑  收藏  举报