CUDA(Computer Unified Device Architecture)全称为计算统一设备架构。在人工智能技术快速发展的当代,CUDA是做模型训练时性能速度优化所必须的。本文将从下面几个方面解释CUDA比较重要的知识点:
目录
1.GPU架构特点
1.1 串行和并行计算
串行计算就是将任务分解为多个步骤的小任务,把这些任务依次完成,得到一个最终结果。
这种方式的弊端也很明显,这种情况下我们的多核处理器并没有发挥作用,即使有些小任务互相之间没有什么联系,也必须要等到前面的都计算完了才可以被处理,这大大减慢了处理任务的速度。
我们可以把一些独立的任务放在不同的处理器上进行计算,最后再将这些结果进行整合,完成一次任务计算。
那么,确定一个程序可不可以并行,关键在于分析出这个程序有哪些执行模块,这些模块哪些是独立的,哪些是耦合的。
1.2 GPU和CPU的区别
从“核”的角度来区分:
CPU | GPU |
专为顺序串行处理而优化的几个核心组成 | 由数以千计的更小、更高效的核心组成,这些核心专门为同时处理多任务而设计,可高效地处理并行任务 |
每个核心能力很强,但是数量太少,处理并行任务没有优势 | 每个核心计算能力较弱,但是好处在于数量多,处理深度学习大量的并行简单计算非常有优势 |
计算机运行和控制的核心 | 主要用于图形图像处理 |
从数据的角度来看:
CPU | GPU |
通用性较强,可以处理各种不同类型的数据,以及大量逻辑判断所产生的分支跳转和中断处理 | 处理数据类型需要高度统一、相互没有依赖、不需要被打断的大规模数据计算 |
CUDA的并行计算,必须由CPU和GPU同时配合,串行部分在CPU,并行部分在GPU,这就是异构计算。所以应用程序利用GPU实现加速的总体分工就是:密集计算代码(约占5%的代码量)由GPU负责完成,剩余串行代码由CPU负责执行。
2. CUDA线程模型
线程是程序执行的最基本单元,CUDA的并行计算就是通过成千上万个线程的并行执行来实现的。下面的机构图说明了GPU的不同层次的结构。
下面这张图分别说明了四者的定义以及特点:
补充:图中Grid只支持1维和2维,但是实际上从CUDA3.0开始,Grid也支持3维。
kernel在device上执行时实际上是启动很多线程,一个kernel所启动的所有线程称为一个网格grid,grid是线程结构的第一层次。而网格又可以分为很多线程块(block),一个线程块里面包含很多线程,这是第二个层次。
两层结构:
1. 第一层:Grid,用 gridDim 和 blockIdx 来定位 线程块(Block) 的位置。
• 例如:gridDim 表示Grid的维度,blockIdx 表示Block的索引。
• 形式:gridDim(blockIdx.x, blockIdx.y)
2. 第二层:Block,用 blockDim 和 threadIdx 来定位 线程(Thread) 的位置。
• 例如:blockDim 表示Block中线程的维度,threadIdx 表示线程的索引。
• 形式:blockDim(threadIdx.x, threadIdx.y, threadIdx.z)
多级索引示例:
在Kernel调用时,通过 <<<grid, block>>> 的执行配置来指定Grid和Block的结构。例如kernel<<<dim3(3, 2), dim3(4, 4)>>>();
grid:指定Grid中Block的数量和维度;block:指定每个Block中线程的数量和维度。
假设Grid是 2维 的,gridDim 为 (2, 2);Block是 2维 的,blockDim 为 (3, 3)。
要索引某个线程:
1. 定位Block的位置:
• 例如,blockIdx = (1, 1) 表示找到第2行第2列的线程块。
2. 定位Thread的位置:
• 例如,threadIdx = (2, 2) 表示线程块内的第3行第3列的线程。
调度解释:
在硬件层面上,有SP和SM两个概念。SP(Streaming Processor):是线程最基本的处理单元。SM(Streaming Multiprocessor):多个SP加上其他的一些资源组成。
一个GPU中可以有多个SM,每个线程由每个线程处理器(SP)执行,线程块由多核处理器(SM)执行,一个kernel其实由一个grid来执行,一个kernel一次只能在一个GPU上执行。一个SM可以同时拥有多个blocks,但需要序列执行。
3.CUDA内存模型
用表格的形式来展示每一部分分别拥有什么部件:
线程类型 | 可使用部件 |
线程 thread | registers(寄存器)、local memory(局部内存) |
线程块 block | shared memory(共享内存) |
网格 grid | global memory(全局内存)、constant memory(常量内存)、texture memory(纹理内存) |
本文只涉及CUDA编程入门的理论知识,没有涉及实例,如果后续学习到的话,会继续更新,欢迎交流学习~
标签:Grid,入门,编程,threadIdx,线程,CUDA,GPU,Block From: https://blog.csdn.net/wxtyuki8568/article/details/144508099