news 2026/4/3 2:59:14

CUDA核心编程模型:主机(CPU)与设备(GPU)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CUDA核心编程模型:主机(CPU)与设备(GPU)

CUDA 的核心思想是异构计算(Heterogeneous Computing),它假定系统同时拥有一个或多个中央处理器(CPU)作为主机(Host)和一个或多个图形处理器(GPU)作为设备(Device)。这种模型利用 CPU 擅长串行和控制的特点,以及 GPU 擅长大规模并行计算的特点,共同解决复杂的计算问题。

1. 角色与职能划分

主机和设备在 CUDA 编程模型中扮演着清晰的角色,它们共同协作完成任务。

1.1 主机 (Host / CPU) 的职能

CPU 及其连接的系统内存(RAM)被称为主机。主机主要负责程序的串行执行、控制流程和资源管理。

  • 控制与调度:执行程序的串行部分,决定何时启动 GPU 上的并行计算任务(Kernel)。
  • 内存管理:管理主机内存(系统 RAM)和设备内存(通过cudaMalloc等 API 调用)。
  • 数据I/O:负责将数据从主机内存传输到设备内存,以及将计算结果从设备内存传回主机内存。
  • 设备查询:获取和配置 GPU 设备信息。

1.2 设备 (Device / GPU) 的职能

GPU 及其板载显存被称为设备。设备是执行大规模并行计算任务的核心。

  • 并行计算:执行由__global__关键字定义的 Kernel 函数。
  • 高吞吐量:利用数千个 CUDA 核心同时执行成千上万个线程,实现高吞吐量计算。
  • 局部存储:管理快速的片上共享内存(Shared Memory)和寄存器(Registers)供并行线程使用。

2. 内存模型与数据传输

主机和设备拥有独立的内存空间,这是异构计算模型与 CPU 多核并行模型(如 OpenMP)最大的区别。

2.1 独立的内存空间

内存类型所属设备访问速度用途
主机内存 (Host Memory)CPU慢(相对于 L1/L2 缓存)存储程序变量、大型数据集、操作系统管理
设备内存 (Device Global Memory)GPU快(相对于 Host Memory)存储 GPU 计算输入数据、中间结果和最终结果

由于内存独立,数据必须通过 PCI Express 总线在两个内存空间之间显式移动,这通常是 CUDA 程序中的性能瓶颈之一。

2.2 数据传输API

CUDA C/C++ 提供了一套特定的 API 来管理设备内存和数据传输。

API 函数描述传输方向执行位置
cudaMalloc在 GPU 全局内存上分配空间。-Host
cudaFree释放 GPU 全局内存上的空间。-Host
cudaMemcpy在 Host 和 Device 之间,或 Device 内部进行数据复制。H↔\leftrightarrowDHost

代码块:数据传输示例

// 1. Host side: Allocate memory on the Host float* h_data = (float*)malloc(size_bytes); // Initialize h_data... // 2. Device side: Allocate memory on the Device float* d_data; cudaMalloc((void**)&d_data, size_bytes); // 3. Data Transfer: Host to Device // cudaMemcpyHostToDevice 是方向参数 cudaMemcpy(d_data, h_data, size_bytes, cudaMemcpyHostToDevice); // 4. Data Transfer: Device to Host (after computation) // cudaMemcpyDeviceToHost 是方向参数 cudaMemcpy(h_data, d_data, size_bytes, cudaMemcpyDeviceToHost); // 5. Cleanup cudaFree(d_data); free(h_data);

3. Kernel 启动与执行

内核(Kernel)是 CUDA 编程模型的灵魂。它是由__global__关键字修饰的函数,是真正并行执行的代码块。

3.1 Kernel 启动语法

主机通过特殊的启动语法来调用 Kernel 函数,将并行任务从 CPU 调度到 GPU。

kernel_name≪gridDim, blockDim≫(arg1,arg2,…) \text{kernel\_name} \ll \text{gridDim, blockDim} \gg (\text{arg}_1, \text{arg}_2, \ldots)kernel_namegridDim, blockDim(arg1,arg2,)

参数含义作用
gridDim\text{gridDim}gridDim**网格(Grid)**的维度和大小。决定总共启动多少个线程块。
blockDim\text{blockDim}blockDim**线程块(Block)**的维度和大小。决定每个线程块中有多少个线程。

3.2 异步执行机制

Kernel 启动是异步的。当 CPU 调用kernel_name<<<...>>>时,它不会等待 GPU 完成计算,而是立即返回并继续执行主机上的后续代码。

  • 异步的好处:允许 CPU 在 GPU 忙于计算时执行其他串行任务(如数据准备、I/O),从而提高系统的整体吞吐量。
  • 同步的必要性:在需要 GPU 计算结果(例如,进行cudaMemcpyDeviceToHost之前)时,主机必须等待设备完成。可以使用cudaDeviceSynchronize()或其他机制(如 CUDA Streams)来实现同步。

流程图:异步与同步

Yes
Host: Allocate Memory
Host: Copy Data H->D
Host: Launch Kernel<<>> (Asynchronous)
Host: Continue executing other CPU tasks
Device: Kernel Execution (Parallel)
Host: Need GPU Result?
Device: Execution Complete
Host: cudaDeviceSynchronize()
Host: Copy Data D->H
Host: Cleanup and End

4. 统一内存 (Managed Memory)

为了简化主机和设备间的数据管理,NVIDIA 引入了统一内存(Unified Memory)

  • 概念:允许开发者使用一个单独的指针来访问 CPU 和 GPU 上的数据,系统(驱动程序)自动处理数据在 Host 和 Device 内存之间的移动(页错误机制)。
  • 分配:使用cudaMallocManaged()替代cudaMalloc()

统一内存极大地简化了编程,因为它消除了显式的cudaMemcpy调用,使代码更接近于传统的 CPU 编程模型。

// 使用统一内存简化分配和传输 float* data; // data 可以在 Host 和 Device 上使用 cudaMallocManaged((void**)&data, size_bytes); // ... Kernel 启动 ... // 驱动程序自动处理数据移动,无需显式 cudaMemcpy cudaFree(data);

总结:CUDA 编程模型通过严格分离主机(控制与串行)和设备(并行计算),并提供专用的 API 进行内存管理和 Kernel 启动,实现了高性能的异构计算。理解这种 Host-Device 的协作和独立的内存模型是编写高效 CUDA 程序的关键。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/1 20:31:42

企业多数据库统一管理平台的技术架构与落地实践

企业多数据库统一管理平台的技术架构与落地实践 【免费下载链接】bytebase Worlds most advanced database DevOps and CI/CD for Developer, DBA and Platform Engineering teams. The GitLab for database DevOps 项目地址: https://gitcode.com/GitHub_Trending/by/byteba…

作者头像 李华
网站建设 2026/3/26 8:22:54

Chrome浮动视频实战指南:多任务观看的完整解决方案

在当今多任务处理成为常态的数字时代&#xff0c;Chrome浮动视频功能为您提供了一种革命性的观看体验&#x1f680;。无论您是在处理文档、浏览网页还是进行在线学习&#xff0c;这项基于开源技术的浏览器扩展都能让视频内容在独立的悬浮窗口中持续播放&#xff0c;真正实现工作…

作者头像 李华
网站建设 2026/3/26 6:56:13

兜兜英语:by - 前缀(核心义:旁边)单词拆解

1. bypass /ˈbaɪpɑːs/ 中文释义&#xff1a;绕过&#xff1b;旁路 &#x1f6a6;词根词缀拆解&#xff1a;by-&#xff08;旁边&#x1f4cd;&#xff09; pass&#xff08;通过➡️&#xff09;→ 从旁边通过 → 绕过场景例句&#xff1a;为了避开早高峰拥堵&#x1f697;…

作者头像 李华
网站建设 2026/3/30 1:48:13

Wan2.2-T2V-A14B性能实测:720P输出流畅度与画质全面领先

Wan2.2-T2V-A14B性能实测&#xff1a;720P输出流畅度与画质全面领先 你有没有过这样的体验&#xff1f;脑子里构思了一个绝妙的视频创意——比如“敦煌飞天在月球上起舞&#xff0c;身后是地球缓缓升起”——但当你想把它做出来时&#xff0c;立刻被拍摄成本、演员档期、后期制…

作者头像 李华
网站建设 2026/3/31 3:11:20

一文搞懂递归系统卷积码:优势、迭代译码与设计要点

在纠错码领域&#xff0c;递归系统卷积码因其独特的结构和性能&#xff0c;成为了通信系统中实现前向纠错的优选方案之一。它将卷积编码的约束特性与系统码、递归结构巧妙结合&#xff0c;在相同复杂度下&#xff0c;往往能提供比非递归非系统卷积码更优异的误码率性能。理解其…

作者头像 李华
网站建设 2026/4/2 5:27:44

awk脚本到底能用来干啥?新手入门一篇看懂

AWK作为一种文本处理工具&#xff0c;其核心价值在于它提供了一种简洁的编程范式&#xff0c;可以高效地对结构化文本数据进行分析、转换和报告生成。它尤其擅长处理以行列形式组织的日志、数据和配置文件&#xff0c;能通过几行脚本完成其他工具需要大量代码才能实现的任务&am…

作者头像 李华