CUDA C编程学习笔记

1.GPU&CPU区别和联系

  • 尽管可以使用多核和众核来区分CPU和GPU的架构,但这两种核心是完全不同的。
  • CPU核心比较重,用来处理非常复杂的控制逻辑,以优化串行程序执行;GPU核心较轻,用于优化具有简单控制逻辑的数据并行任务,注重并行程序的吞吐量。
  • GPU不是一个独立运行的平台而是CPU的协处理器。因此,GPU必须通过PCIe总线与基于CPU的主机相连来进行操作
    在这里插入图片描述
  • _global_标志GPU执行函数
  • 三重尖括号意味着从主线程到设备端代码的调用,依次是网格维度grid、块维度block
  • 函数cudaDeviceRest()用来显式地释放和清空当前进程中与当前设备有关的所有资源

2.CUDA编程模型

2.1.CUDA编程结构

在这里插入图片描述

2.2.内存管理

  • CUDA编程模型假设系统是由一个主机和一个设备组成的,而且各自拥有独立的内存核函数是在设备上运行的。为使你拥有充分的控制权并使系统达到最佳性能,CUDA运行时负责分配与释放设备内存,并且在主机内存和设备内存之间传输数据。
    在这里插入图片描述
    全局类似于CPU 的系统内存,而共享内存类似于CPU的缓存。然而GPU的共享内存可以由CUDA C的内核 直接控制。

2.3.线程管理

  • 一个两层的线程层次结构,由线程块网格和线程块构成。(网格➕块)
  • 一个内核启动所产生的所有线程统称为一个网格,同一网格中的所有线程共享相同的全局内存空间,一个网格由多个线程块构成,一个线程块包含一组线程。
  • 网格内共享“全局内存”;块内共享“共享内存”

线程索引、块索引、块维度和网格维度

  • 线程依靠以下两个坐标变量来区分彼此:线程块在线程格内的索引blockIdx;块内的线程索引threadIdx
  • 该坐标变量是基于uint3定义的CUDA内置的向量类型,是一个包含3个无符号整数的 结构,可以通过x、y、z三个字段来指定。
  • 网格和块的维度由下列两个内置变量指定:网格维度gridDim;线程块维度blockDim。它们是dim3类型的变量,是基于uint3定义的整数型向量,用来表示维度。
  • 在CUDA程序中有两组不同的网格和块变量:手动定义的dim3数据类型和预定义的 uint3数据类型。手动定义的dim3类型的网格和块变量仅在主机端可见,而unit3类型的内置预初始化的网格和块变量仅在设备端可见。
  • 对于一个给定的数据大小,确定网格和块尺寸的一般步骤为:确定块的大小;在已知数据大小和块大小的基础上计算网格维度,网格大小是块大小的倍数。要确定块尺寸,通常需要考虑:内核的性能特性;GPU资源的限制
    在这里插入图片描述

2.4.核函数

  • 内核(kernel)是CUDA编程模型的一个重要组成部分,其代码在GPU上运行。CUDA内核调用是对C语言函数调用语句的延伸,<<<>>>运算符内是核函数的执行配置。
  • 核函数的调用与主机线程是异步的。核函数调用结束后,控制权立刻返回给主机端(可设置函数cudaDeviceSynchronize强制主机端等待所有核函数执行结束)
  • 一些CUDA运行时API在主机和设备之间是隐式同步的。当使用cudaMemcpy函数在主机和设备之间拷贝数据时,主机端隐式同步,即主机端程序必须等待数据拷贝完成后才能 继续执行程序。
  • 用__global__声明定义核函数,核函数必须有一个void返回类型,只能访问设备内存,不支持可变数量的参数,不支持静态变量,显示异步行为。
  • __global__ void kernel_name <<<grid, block>>> (....)
  • 调试验证技巧:参数设置为<<<1, 1>>>,模拟串行执行程序
    在这里插入图片描述

给核函数计时

。。。

组织并行线程

改变执行配置对内核性能有影响;传统的核函数实现一般不能获得最佳性能;对于一个给定的核函数,尝试使用不同的网格和线程块大小可以获得更好的性能
在这里插入图片描述

2.4 设备管理

。。。

3.CUDA执行模型

3.1GPU架构概述SM

  • SM的关键组件:CUDA核心、共享内存/一级缓存、寄存器、加载/存储单元、特殊功能单元、线程束调度器。
  • 当启动一个内核网格时,它的线程块被分布在了可用的流式多处理器SM上来执行。线程块一旦被调度到一个SM上,其中的线程只会在那个指定的SM上并发执行。多个线程块可能会被分配到同一个SM上,而且是根据SM资源的可用性进行调度的。同一线程中的指令利用指令级并行性进行流水线化。
  • CUDA采用单指令多线程(SIMT)架构来管理和执行线程,每32个线程为一组,被称为线程束(warp)。线程束中的所有线程同时执行相同的指令。每个线程都有自己的指令地址计数器和寄存器状态,利用自身的数据执行当前的指令。每个SM都将分配给它的线程块划分到包含32个线程的线程束中,然后在可用的硬件资源上调度执行。
  • SIMT模型包含3个SIMD所不具备的关键特征:每个线程都有自己的指令地址计数器;每个线程都有自己的寄存器状态;每个线程可以有一个独立的执行路径
  • 在SM中,共享内存和寄存器是非常重要的资源。共享内存被分配在SM上的常驻线程块中,寄存器在线程中被分配。线程块中的线程通过这些资源可以进行相互的合作和通信。
    在这里插入图片描述

线程束

<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值