文章目录
- 0. 前言
- 1. 并行计算与异构计算
- 1.1 并行计算(Parallel Computing)
- 1.2 异构计算(Heterogeneous Computing)
- 2. CUDA 的核心概念
- 2.1 主机(Host)与设备(Device)
- 2.2 线程层次结构
- 2.3 内存模型
- 2.4 执行模型
- 3. CUDA 与 C 语言的关系
- 3.1 语法扩展
- 3.2 混合编程
- 3.3 与标准C的差异
- 4. CUDA安装
0. 前言
📣按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方。如果发现文中错误,希望批评指正,共同进步。
CUDA(Compute Unified Device Architecture)是NVIDIA推出的GPU通用计算编程模型和工具链,让开发者能用 C/C++ 直接调用 GPU 的并行计算能力。如果没有 CUDA,GPU 将只能用于图形渲染,无法高效加速科学计算、AI 训练等通用计算任务。
本文涵盖了CUDA的基础介绍,CUDA Toolkit的安装以及CUDA C语言代码示例。
1. 并行计算与异构计算
1.1 并行计算(Parallel Computing)
并行计算(Parallel Computing)是一种 同时使用多个计算资源 解决单个问题的计算模式,其核心目标是通过 任务分解 和 协同执行 来显著提升计算效率。与传统的串行计算(一步一步顺序执行)不同,并行计算允许多个操作同时进行。
并行计算按任务可以分为:
类型 | 描述 | 典型应用 |
---|---|---|
数据并行 | 同一操作在不同数据上并行执行(如GPU处理图像像素) | 图像处理、矩阵运算 |
任务并行 | 不同任务同时执行(如同时下载文件和解压数据) | 服务器多任务处理 |
按硬件层级可以划分为:
层级 | 实现方式 | 示例 |
---|---|---|
指令级并行 | CPU流水线、超标量架构 | Intel Hyper-Threading |
线程级并行 | 多核CPU/GPU的多线程 | OpenMP、CUDA |
节点级并行 | 多台计算机协同(分布式系统) | MPI(消息传递接口) |
1.2 异构计算(Heterogeneous Computing)
异构计算是指联合使用不同架构的计算单元(如CPU+GPU+FPGA),发挥各自优势。
- CPU:擅长逻辑控制、串行任务。
- GPU:擅长高吞吐量并行计算。
- CUDA 的实现:
- 统一内存管理:
cudaMallocManaged
分配CPU/GPU共享内存。 - 异步执行:通过
cudaStream_t
实现计算与数据传输重叠。
- 统一内存管理:
2. CUDA 的核心概念
2.1 主机(Host)与设备(Device)
概念 | 描述 | 关键操作 |
---|---|---|
Host | CPU及其内存 | malloc , free |
Device | GPU及其显存 | cudaMalloc , cudaFree |
2.2 线程层次结构
- Kernel(核函数):GPU上并行执行的函数,标记为
__global__
。 - Grid → Block → Thread:
- Grid:所有线程块的集合。
- Block:一组线程(最多1024线程,依架构而定)。
- Thread:最小执行单元。
2.3 内存模型
内存类型 | 作用域 | 典型用途 |
---|---|---|
全局内存 | 所有线程 | 主存储区,访问速度较慢 |
共享内存 | 单个Block | 高速缓存,减少全局内存访问 |
寄存器 | 单个线程 | 最快,但容量有限 |
常量内存 | 所有线程(只读) | 存储不变数据(如系数矩阵) |
2.4 执行模型
- SIMT(单指令多线程):
GPU以32线程为一组(Warp)执行相同指令,但可处理不同数据。 - 隐式同步:同一Block内的线程可通过共享内存和
__syncthreads()
同步。
3. CUDA 与 C 语言的关系
3.1 语法扩展
CUDA 在标准C语言基础上扩展了:
- 函数限定符:
__global__
:核函数,由CPU调用、GPU执行。__device__
:GPU端函数,仅GPU可调用。__host__
:CPU端函数(默认)。
- 变量限定符:
__shared__
:定义共享内存变量。__constant__
:定义常量内存变量。
3.2 混合编程
CUDA 程序通常是 C/C++ 主机代码 + GPU 核函数 的混合体:
#include<stdio.h>
#include<cuda_runtime.h>//GPU核函数
__global__ void helloCUDA(){printf("hello world from thread %d\n", threadIdx.x); //threadIdx.x表示当前线程在 Block内的x维度的编号(从0开始)}//主机代码
int main() {helloCUDA << <1, 5 >> > (); //启动5个线程cudaDeviceSynchronize(); //阻塞主机线程,直到GPU上所有任务(包括核函数、内存传输)完成return 0;
}
输出为:
3.3 与标准C的差异
特性 | 标准C | CUDA C |
---|---|---|
内存管理 | malloc/free | cudaMalloc/cudaFree |
函数调用 | 直接调用 | 通过 <<<...>>> 启动核函数 |
并行模型 | 需依赖多线程库 | 原生支持GPU大规模并行 |
4. CUDA安装
-
首先要先安装VS: https://visualstudio.microsoft.com/zh-hans/
-
下载CUDA Toolkit: https://developer.nvidia.com/cuda-toolkit
- 选择合适的版本
- 下载完成
-
安装
-
安装完成
-
打开
CMD
输入nvcc -V
,有返回版本号,确认安装成功
-
打开VS,创建CUDA项目