【c++】并行编程:cuda入门

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍cuda入门。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. cuda并行编程介绍
    • :blush:2. cuda向量加法示例
    • :satisfied:3. 将cuda高性能运算嵌入c++程序

😏1. cuda并行编程介绍

当使用CUDA(Compute Unified Device Architecture)进行并行计算时,我们可以利用GPU(图形处理器)的强大性能来加速各种应用程序。

😊2. cuda向量加法示例

下面演示一下用cuda在GPU上执行向量加法:

// vector_add.cu
#include <stdio.h>// CUDA核函数,用于在GPU上执行向量加法
__global__ void vectorAdd(int *a, int *b, int *c, int size) {// 获取当前线程的索引int tid = blockIdx.x * blockDim.x + threadIdx.x;// 确保线程索引在向量大小范围内if (tid < size) {// 计算向量元素相加结果c[tid] = a[tid] + b[tid];}
}int main() {int size = 1000;int a[size], b[size], c[size];// 在设备上分配内存空间int *dev_a, *dev_b, *dev_c;cudaMalloc((void**)&dev_a, size * sizeof(int));cudaMalloc((void**)&dev_b, size * sizeof(int));cudaMalloc((void**)&dev_c, size * sizeof(int));// 初始化输入向量 a 和 bfor (int i = 0; i < size; ++i) {a[i] = i;b[i] = i * 2;}// 将输入向量 a 和 b 复制到设备内存cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);// 定义每个块中的线程数和块数int threadsPerBlock = 256;int blocksPerGrid = (size + threadsPerBlock - 1) / threadsPerBlock;// 调用 CUDA 核函数执行向量加法vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(dev_a, dev_b, dev_c, size);// 将计算结果从设备复制到主机内存cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);// 打印结果向量 c 的前10个元素for (int i = 0; i < 10; ++i) {printf("%d ", c[i]);}printf("\n");// 释放设备上的内存空间cudaFree(dev_a);cudaFree(dev_b);cudaFree(dev_c);return 0;
}

例程中,首先在主机内存中定义输入向量 a 和 b,并分配设备内存空间来存储输入和输出向量。然后,使用 cudaMemcpy 函数将输入向量从主机内存复制到设备内存。

接下来,定义了每个块中的线程数和块数,并调用了CUDA核函数 vectorAdd 来执行向量加法。该核函数使用线程索引来确定每个线程要处理的向量元素,并将加法结果存储在输出向量 c 中。

最后,使用 cudaMemcpy 函数将输出向量从设备内存复制回主机内存,并打印输出向量的前10个元素。最后,释放在设备上分配的内存空间。

用NVCC编译器编译cu程序:nvcc vector_add.cu -o vector_add

😆3. 将cuda高性能运算嵌入c++程序

在大型C++程序中,可以使用CUDA来加速特定的计算任务。下面演示一个程序:

// main.cpp
// 包含必要的头文件和声明CUDA函数
#include <iostream>// CUDA函数声明
extern "C" void cudaFunction();int main() {std::cout << "Running C++ code..." << std::endl;// 调用CUDA函数cudaFunction();std::cout << "C++ code completed." << std::endl;return 0;
}
// cuda_code.cu
#include <stdio.h>// CUDA函数定义
__global__ void kernelFunction() {printf("Running CUDA code...\n");
}extern "C" void cudaFunction() {// 设置GPU设备并在设备上执行CUDA核函数cudaSetDevice(0);// cuda_kernel<<<nBlock,nThread>>>();kernelFunction<<<1, 1>>>();cudaDeviceSynchronize();
}

编译步骤如下:

nvcc -c cuda_code.cu -o cuda_code.o
g++ -c main.cpp -o main.o
g++ cuda_code.o main.o -o cuda_cpp -lcudart -L/usr/local/cuda/lib64

这样,就可以将CUDA函数嵌入到C++程序中,并在运行时通过调用C++代码来触发CUDA函数的执行。
在这里插入图片描述

以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/13484.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

能源结构变更图,传统能源结构对比新兴能源

以传统的能源&#xff08;煤、天然气&#xff09;提供能源&#xff0c;到新兴能源 目前新兴能源以 太阳能&#xff0c;风能为主以及其它行业&#xff0c; 一类企业以新兴能源这种为主&#xff0c;核心是能源接收&#xff0c;以及储存能源&#xff0c;存储通常两种方式&#x…

UE5、CesiumForUnreal接入XYZ格式地图瓦片如高德地图、OSM、ArcGIS等

文章目录 1.实现目标2.实现过程2.1 XYZ与TMS对比2.1 cesium-native改造2.3 CesiumForUnreal插件改造2.4 XYZ瓦片加载测试3.参考资料1.实现目标 通过改造cesium-native和cesiumforunreal插件,参考tms的栅格地图瓦片加载逻辑,实现在UE5、CesiumForUnreal中接入XYZ格式的地图瓦片…

mysql练习---对表进行插入、更新与删除

环境&#xff1a; 第一题 (1) 创建表 create table pet( name varchar(20) not null comment 宠物名称, owner varchar(20) comment 宠物主人, species varchar(20) not null comment 种类, sex char not null comment 性别, birth year not null comment 出生日期, death …

游戏引擎的cpu/gpu粒子系统设计思想

开篇 网上有很多篇粒子系统源码解析&#xff0c;但是只是简单的接口罗列&#xff0c;没有从最原理出发去讲清楚粒子系统的来龙去脉&#xff0c;我将从粒子系统的本质去讲清楚它的设计理念&#xff0c;当理解了它的理念以后&#xff0c;很多粒子遇到的问题就会迎刃解决了&#…

3 STM32标准库函数 之 窗口看门狗(WWDG)所有函数的介绍及使用

3 STM32标准库函数 之 窗口看门狗&#xff08;WWDG&#xff09;所有函数的介绍及使用 1. 图片有格式2 文字无格式三 库函数之窗口看门狗&#xff08;WWDG&#xff09;所有函数的介绍及使用前言一、IWDG库函数固件库函数预览1.1 函 数 IWDG_WriteAccessCmd1.1.1 IWDG_WriteAcces…

IDEA完全免费AI辅助编程插件BITO-GPT4安装及中文国产化设置

打开IDEA的plugins 搜索BITO&#xff1a; 下载后右边工具栏上会出现BITO的小蓝标&#xff0c;这样就可以使用了但是里面是全英文的 设置中文 1.打开BITO点击右上角设置 点击里面的Settings 进入BITO的Web网页 右边这个改成中文&#xff1a; 这样回到IDEA AI就会生成中…

0126 线性表

目录 2.线性表 2.1线性表的定义和基本概念 2.1部分习题 2.2线性表的顺序表示 2.2部分习题 2.3线性表的链式表示 2.3部分习题 2.线性表 2.1线性表的定义和基本概念 2.1部分习题 1.线性表是具有n个&#xff08;&#xff09;的有限序列 A.数据表 B.字符 C.…

【计算机组成原理总结】

第一章计算机系统概述 第二章数据的表示与运算 第三章存储系统 第四章 指令系统 第五章 中央处理器 第六章 总线 第七章 输入输出设备

LVS-DR排错思路

一.LVS-DR实验排错思路 1.案例架构图 DR服务器&#xff1a;192.168.27.11 web服务器1&#xff1a;192.168.27.12 web服务器2&#xff1a;192.168.27.13 vip&#xff1a;192.168.27.180 客户端&#xff1a;192.168.27.2 1&#xff1a;配置负载调度器&#xff1a;&#xff…

前端学习——HTML5

新增语义化标签 新增布局标签 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&qu…

LVS+Keepalived 群集及搭建

文章目录 一.keepalived 概述1.keepalived服务重要功能1.1 管理LvS负载均衡器软件1.2 支持故障自动切换 (failover)1.3 实现LVS集中节点的健康检查 (health checking)1.4 实现LVS负载调度器 节点服务器的高可用性 (HA) 2. keepalived 高可用故障切换转移原理及VRRP通信原理3.ke…

Flink的状态是否支持任务间共享

背景&#xff1a; 在日常编写代码的过程中&#xff0c;我们经常会在方法内部new很多的其他类对象来进行编码工作&#xff0c;那么对于这种情况怎么让new出来的对象是一个我们特意创建出来的一个mock实例&#xff0c;从而让我们能完全控制new出来的对象的所有行为呢&#xff1f…