cuda block grid等介绍

这里写目录标题

  • cuda层次结构
  • 程序架构
  • 层次结构
  • cuda程序调用
  • cuda 内置变量
  • GPU内存模型
    • 内存结构
  • 可编程内存
    • 内存作用域
    • 寄存器
    • 本地内存
    • 共享内存
    • 共享内存访问冲突
    • 常量内存
    • 全局内存
      • gpu缓存

cuda层次结构

程序架构

cuda block grid等介绍_第1张图片

申请内存时是线性的内存,需要知道是按行还是按列排列
设计的好的话内存是对齐的
我们希望线程和内存都是线性排列对齐,效果就会很好。

层次结构


grid每个维度有多少block
block则是定义每个维度有多少线程

cuda程序调用

cuda block grid等介绍_第2张图片

cuda 内置变量

cuda block grid等介绍_第3张图片
建立全局一维排序,从而建立宏
从而按照逻辑顺序处理整个向量

处理矩阵的话可以用二维的网格和块

在使用 CUDA 进行矩阵乘法等大规模矩阵计算时,通常需要将输入矩阵按照块的形式划分为多个子矩阵,然后分配到不同的线程块中去计算,以充分利用GPU并行计算的优势。

对于二维的网格和块而言,其可以很好地描述矩阵的结构,这样可以方便地对每个块做相对应的操作。比如,我们可以定义一个2D线程块,其中每个线程块由多个2D线程组成,每个线程处理一个小块或者一个小行/列。然后,我们可以按行、列或元素交错地访问内存,使所有线程能更加高效地并行访问主机内存。

在处理一维向量时,可以考虑将其作为一个一维数组,在代码中可以从全局索引映射到局部索引。在这种情况下,通常需要对齐内存以提升访问速度和性能。具体来说,可以使用 __align__(n) 修饰符来对变量进行对齐处理,将其地址对齐到 n 的倍数上。例如,使用 __align__(16) 可以将变量地址对齐到16字节边界上。

对于单个块的情况,可以使用共享内存来提高访问速度,以便线程块中的所有线程都可以快速、有效地访问它。同时,在使用共享内存时,需要确保线程块中的线程都能够正常读写,以避免竞争条件的发生。

总之,在 CUDA 中处理矩阵和向量时,需要根据任务的具体特点进行灵活选择和处理,以充分发挥GPU并行计算的优势。

GPU内存模型

内存结构

cuda block grid等介绍_第4张图片

每个MP都有L1,还有通过L2共享,和全局相连
cuda block grid等介绍_第5张图片

可编程内存

可读可写

不可编程内存 cpu和gpu自己管理的内存
cuda block grid等介绍_第6张图片

内存作用域

线程自己的内存一般都是用完了就释放了

寄存器

本地内存

共享内存


比方共享32k L1自己的16k
cuda block grid等介绍_第7张图片

共享内存访问冲突


cuda block grid等介绍_第8张图片

有一些优化机制,比如说广播

常量内存


cuda block grid等介绍_第9张图片

全局内存

常说的显存,比方说8g 16g
延迟最高,通过l2和mp相连

读的时候有cache 写的时候没有 GPU通过cache大幅度提高效率

cuda block grid等介绍_第10张图片
有些数据用不到会降低吞吐量

gpu缓存


因为这些缓存的存在提前将要读的数据 load, 极大提高效率

你可能感兴趣的:(Cuda,python,开发语言)