【CUDA C实战演练】CUDA介绍、安装、C代码示例

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)

概念描述关键操作
HostCPU及其内存malloc, free
DeviceGPU及其显存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端函数(默认)。

__global__的命名强调了其跨主机-设备的边界特性(全局可见性),而__device____host__的作用域是局部的。

  • 变量限定符
    • __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的差异

特性标准CCUDA C
内存管理malloc/freecudaMalloc/cudaFree
函数调用直接调用通过 <<<...>>> 启动核函数
并行模型需依赖多线程库原生支持GPU大规模并行

4. CUDA安装

  1. 首先要先安装VS: https://visualstudio.microsoft.com/zh-hans/
    在这里插入图片描述

  2. 下载CUDA Toolkit: https://developer.nvidia.com/cuda-toolkit
    在这里插入图片描述

  • 选择合适的版本
    在这里插入图片描述
  • 下载完成在这里插入图片描述
  1. 安装
    在这里插入图片描述
    在这里插入图片描述

  2. 安装完成
    在这里插入图片描述

  3. 打开CMD输入nvcc -V,有返回版本号,确认安装成功
    在这里插入图片描述

  4. 打开VS,创建CUDA项目
    在这里插入图片描述

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

使者大牙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值