讲师中心 微信公众号
AI工具推荐 视频效率加速

C++怎么进行CUDA并行计算编程_C++ GPU编程入门与核函数编写

老浩君_6930

老浩君_6930

发布时间:2025-12-27 10:54:08

|

946人浏览过

|

来源于php中文网

原创

CUDA编程需配置NVIDIA驱动和Toolkit,使用__global__定义核函数,通过grid和block配置并行线程,管理主机与设备间内存传输,实现如向量加法等并行计算任务。

c++怎么进行cuda并行计算编程_c++ gpu编程入门与核函数编写

CUDA 是 NVIDIA 推出的并行计算平台和编程模型,允许开发者使用 C++ 编写在 GPU 上运行的高性能代码。通过 CUDA,你可以将计算密集型任务从 CPU 卸载到 GPU,大幅提升执行效率。下面介绍如何用 C++ 进行 CUDA 编程,包括环境搭建、核函数编写以及基本的内存管理。

配置开发环境

要开始 CUDA 编程,你需要:

  • 一台支持 CUDA 的 NVIDIA 显卡
  • 安装对应版本的 NVIDIA 驱动
  • 安装 CUDA Toolkit(包含编译器 nvcc、库和头文件)
  • 推荐使用支持 CUDA 的 IDE,如 Visual Studio(Windows)或 VS Code / CLion(Linux/macOS)

安装完成后,可以通过命令 nvcc --version 检查是否安装成功。

编写第一个 CUDA 程序:向量加法

下面是一个简单的 C++ CUDA 程序,实现两个数组的并行加法:

立即学习“C++免费学习笔记(深入)”;

#include <iostream>
#include <cuda_runtime.h>

// 核函数:在 GPU 上执行
__global__ void addVectors(float* a, float* b, float* c, int n) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < n) {
c[idx] = a[idx] + b[idx];
}
}

int main() {
const int N = 1<<20; // 1M 个元素
const int size = N * sizeof(float);

// 主机内存分配
float *h_a = (float*)malloc(size);
float *h_b = (float*)malloc(size);
float *h_c = (float*)malloc(size);

// 初始化数据
for (int i = 0; i < N; ++i) {
h_a[i] = i * 1.0f;
h_b[i] = i * 2.0f;
}

// 设备内存分配
float *d_a, *d_b, *d_c;
cudaMalloc(&d_a, size);
cudaMalloc(&d_b, size);
cudaMalloc(&d_c, size);

// 主机到设备内存拷贝
cudaMemcpy(d_a, h_a, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_b, h_b, size, cudaMemcpyHostToDevice);

// 配置核函数执行参数
int blockSize = 256;
int gridSize = (N + blockSize - 1) / blockSize;
addVectors<<<gridSize, blockSize>>>(d_a, d_b, d_c, N);

// 等待 GPU 执行完成
cudaDeviceSynchronize();

// 结果从设备拷贝回主机
cudaMemcpy(h_c, d_c, size, cudaMemcpyDeviceToHost);

// 验证结果(例如前几个)
for (int i = 0; i < 5; ++i) {
std::cout << h_a[i] << " + " << h_b[i] << " = " << h_c[i] << std::endl;
}

// 释放内存
free(h_a); free(h_b); free(h_c);
cudaFree(d_a); cudaFree(d_b); cudaFree(d_c);

return 0;
}

理解核函数与执行配置

__global__ 函数是核函数,由主机调用,在设备(GPU)上执行。其调用语法为:

windows-shell-syntax
windows-shell-syntax

在 Windows 上执行终端命令,或对比 Windows 与 Linux 的 Shell 语法时使用。建议先检测当前 Shell 是 PowerShell 还是 cmd.exe,再给出相应命令……

下载

kernel_name<<<grid_size, block_size>>>(args);

  • blockSize:每个线程块中的线程数(如 256)
  • gridSize:线程块的数量
  • 总线程数 = gridSize × blockSize
  • 每个线程通过 threadIdx.x + blockIdx.x * blockDim.x 计算唯一索引

这种结构使每个线程独立处理数组中的一个元素,实现数据并行。

内存管理与错误检查

CUDA 使用不同的内存空间:

  • 主机内存:malloc / free
  • 设备内存:cudaMalloc / cudaFree
  • 数据传输使用 cudaMemcpy,注意方向(HostToDevice 或 DeviceToHost)

建议加入错误检查以调试问题:

#define CUDA_CHECK(call) \
do { \
cudaError_t err = call; \
if (err != cudaSuccess) { \
std::cerr << "CUDA error: " << cudaGetErrorString(err) << " at " << __FILE__ << ":" << __LINE__ << std::endl; \
exit(1); \
} \
} while(0)

用 CUDA_CHECK(cudaMemcpy(...)) 替代裸调用,能快速定位错误。

基本上就这些。掌握核函数结构、内存管理和执行配置后,就可以开始编写更复杂的并行算法,比如矩阵乘法、图像处理或深度学习算子。CUDA 虽然有一定学习曲线,但对性能提升非常显著。不复杂但容易忽略的是线程索引边界检查和内存对齐问题,写代码时多留意。

相关文章

编程速学教程(入门课程)
编程速学教程(入门课程)

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

6587

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

764

2025.10.23

typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

313

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

619

2023.10.11

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

354

2023.09.25

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

989

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2960

2023.10.25

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2218

2023.09.20

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

0

2026.10.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn