CUDA计算初识

CUDA的全称是Computer Unified Device Architecture(计算机统一设备架构)。CUDA不只是一种编程语言,它包括NVIDIA对于GPGPU的完整的解决方案:从支持通用计算并行架构的GPU,到实现计算所需要的硬件驱动程序、编程接口、程序库、编译器、调试器等。NVIDIA提供了一种较为简便的方式编写GPGPU代码:CUDA C。

我们将一个cuda程序分为两部分:主机端(host=CPU)和设备(device=GPU)端。主机端的是CPU执行的程序部分,设备端的是GPU上执行的程序部分。内核(kernel)是设备端程序的另外一种叫法。

CUDA C函数类型:

(1) 主机函数:它的调用、执行都仅由主机端来完成;

(2) 内核函数:它由主机端调用,设备端并行执行,定义时必须要加上_global_限定符申明;

(3) 设备函数:仅由设备端调用、并行执行,定义时必须要加上_device_限定符申明。

顺序操作应被编程为主机函数,可并行化操作应被编程为内核函数或者设备函数。主机函数和内核函数都将在main函数中被封装和调用。

GPU的计算核心是以一定数量的Streaming Processor(SP)组成的处理器阵列,SP的主要结构为一个ALU(逻辑运算单元),一个FPU(浮点运算单元)以及一个Register File(寄存器堆)。8个SP组成一个SM(Streaming Multi-Processor),一定数量的SM组成一个TPC(Texture Processing Clusters)。

SM内包含有一个Instruction Unit、一个Constant Memory、一个Texture Memory,8192个Register、一个16KB的Share Memory、8个Stream Processor(SP)和两个Special Function Units(SFU)。

Thread是CUDA模型中最基本的运行单元,执行最基本的程序指令。

Block是一组协作Thread,Block内部允许共享存储,每个Block最多包含512个Thread(算力1.x,算力2.x以上每个block最大线程数是1024)。一个block中所有的线程在一个流多处理器(SM)上并发地执行

Grid是一组Block,共享全局内存,每一个Grid对应一个Kernel任务。

Kernel是在GPU上执行的核心程序。

 Warp是MP的基本调度单位,每次运行的时候,由于MP数量不同,所以一个Block内的所有Thread不一定全部同时运行,但是每个Warp内的所有Thread一定同时运行。

在程序运行的时候,实际上每32个Thread组成一个Warp,每个 warp 块都包含连续的线程,递增线程 ID 。

因此,我们在定义Thread Size的时候应使其为Warp Size的整数倍,也就是Thread Size应为32的整数倍。理论上Thread越多,就越能弥补单个Thread读取数据的latency ,但是当Thread越多,每个Thread可用的寄存器也就越少,严重的时候甚至能造成Kernel无法启动。因此每个Block最少应包含64个Thread,一般选择128或者256,具体视MP数目而定。一个MP最多可以同时运行768个Thread,但每个MP最多包含8个Block。
 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ywfwyht

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值