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

news2024/11/17 17:42:10

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍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 和 b
    for (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.coloradmin.cn/o/711538.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

测试在 4090 上运行 vicuna-33b 进行推理

测试在 4090 上运行 vicuna-33b 进行推理 今天尝试在 4090 上运行 vicuna-33b 进行推理&#xff0c;使用的是 8bit 量化。 运行命令如下&#xff0c; python3 -m fastchat.serve.cli --model-path lmsys/vicuna-33b-v1.3 --load-8bit结论&#xff0c;使用 8bit 量化在 4090 上…

HTTP概述以及Tomcat概述

HTTP 概念&#xff1a;Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则。特点&#xff1a; 基于TCP协议&#xff1a;面向连接、安全基于请求-响应模型的&#xff1a;一次请求对应一次响应HTTP协议是无状态的协议…

Java面试题3

[TOC]目录 1. spring事务 事务简介 事务在逻辑上是一组操作&#xff0c;要么执行&#xff0c;要不都不执行。主要是针对数据库而言的&#xff0c;比如说 MySQL。 为了保证事务是正确可靠的&#xff0c;在数据库进行写入或者更新操作时&#xff0c;就必须得表现出 ACID 的 4 …

nexus搭建maven私有仓库

Nexus 在企业开发中还是比较常用的私有仓库管理工具&#xff0c;一般把公司内部的Maven jar 包或npm包上传到仓库中&#xff0c;有效的对包文件进行管理。 Nexus 至少需要 2G 以上的内存 安装nexus之前首先安装配置好 JDK 环境 和 Maven环境 1、Linux环境安装openJDK 2、Centos…

机器学习——掌握决策树ID3算法的原理,通过增益熵实现手工推导的过程。

文章目录 决策树介绍优缺点ID3算法原理举例 决策树的构建1、特征选择&#xff08;1&#xff09;香农熵&#xff08;2&#xff09;信息增益 2、决策树的生成3、决策树的修剪 总结&#xff1a;参考文献 决策树 介绍 决策树(decision tree)是一种基本的分类与回归方法。ID3是其中…

模拟实现atoi

函数简介 atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数&#xff0c;应用在计算机程序和办公软件中。int atoi(const char *nptr) 函数会扫描参数 nptr字符串&#xff0c;会跳过前面的空白字符&#xff08;例如空格&#xff0c;tab缩进&#xff09;等。如果 n…

socket 网络编程

socket UDP1、单播收发数据测试2、广播发送 TCP1、收发数据测试2、TCP 服务端 Socket是两个程序之间的双向通信链路。它是一种网络通信协议&#xff0c;用于不同计算机之间的进程间通信或同一计算机内部进程之间的通信。 import sockets socket.socket(AddressFamily, Type)…

初识【Matplotlib】

Matplotlib Matplotlib简单介绍Matploylib的分类学习Matploylib网站推荐Matplotlib用法Matplotlib中文字体显示Matplotlib的三层结构容器层图像层辅助显示层 Matplotlib简单介绍 Matplotlib是一个Python的数据可视化库&#xff0c;它提供了一种简单而有效的方式来创建各种类型…

02-独立按键控制LED状态

程序 #include <REGX52.H>void main() {while(1) {if(P3_1 0) //DOWN{P2_0 0xFE;}if(P3_1 1) //UP{P2_0 0XFF;}};}按键的抖动问题 软件实现解决-按键的抖动问题 通过延时解决 #include <REGX52.H>void Delay(unsigned int xms) {while(xms){unsigned cha…

【C语言】整型在内存中存储 赛场(来试试)

前言 &#x1f388;大家好&#xff0c;我是何小侠&#x1f388; &#x1f343;大家可以叫我小何或者小侠&#x1f343; &#x1f490;希望能通过写博客加深自己对于学习内容的理解&#x1f490; &#x1f338;也能帮助更多人理解和学习&#x1f338; 合抱之木&#xff0c;生于…

简单实用配置VScode的C# Framework环境

1. 设置window path环境csc变量 D:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Current\Bin\Roslyn 或者 C:\Windows\Microsoft.NET\Framework64\v4.0.30319 2. 设置"code-runner.executorMap" "csharp": "cd $dir &…

第五课—大学英语四六级备考—听力专项

Key words 1.implement vt.实施 "Implement" 在中文中的意思是「实施」或「执行」。以下是一些示例用法和搭配&#xff1a; 中文意思&#xff1a;实施、执行 形近字&#xff1a;implicate&#xff08;牵连&#xff09; 1. 用英文造句&#xff1a;The government …

【C++初阶(二)】缺省参数以及函数重载

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C初阶之路⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习排序知识   &#x1f51d;&#x1f51d; 缺省参数&#xff06;函数重载 1. 前言2. 缺…

红黑树内容及代码实现

目录 1.概念 2.性质 3.实现 3.1定义数据类型 3.2设计基本操作 3.2.1着色问题详解 3.2.2 代码基本框架 3.2.3着色问题代码 3.2.4红黑树的销毁 3.3验证基本操作 4.总结 1.概念 红黑树是一种二叉搜索树&#xff0c;但是在其中的每个结点上增加一个存储表示该节点的颜…

【数据结构】栈和队列(队列篇)

上期我们已经学习了数据结构中的栈&#xff0c;这期我们开始学习队列。 目录 1.队列的概念及结构 2.队列的实现 队列结构体定义 常用接口函数 初始化队列 队尾入队列 队头出队列 获取队列头部元素、 获取队列队尾元素 获取队列中有效元素个数 检测队列是否为空 销毁…

chatgpt赋能python:用Python轻松给手机用户发送短信——优秀的工具在手,无限可能!

用Python轻松给手机用户发送短信——优秀的工具在手&#xff0c;无限可能&#xff01; 作为一个有10年Python编程经验的工程师&#xff0c;我想分享一下如何用Python给手机用户发送短信。Python是目前非常流行的编程语言之一&#xff0c;它可以轻松地完成很多任务。而给用户发…

13.定时器中断

1.通用定时器工作过程&#xff1a; 2.时钟选择&#xff1a; 内部时钟(CK_INT);外部时钟模式1&#xff1a;外部输入脚(TIx)&#xff1b;外部时钟模式2&#xff1a;外部触发输入(ETR)&#xff1b;内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器&#xff0c;例如可…

【Kafka面试题1】Kafka消费者是pull(拉)还是push(推)模式,这种模式有什么好处?

Kafka消费者是pull(拉)还是push(推)模式&#xff0c;这种模式有什么好处&#xff1f; 一、概述回答 Kafka中的Producer和consumer采用的是push-and-pull模式&#xff0c;即Producer只管向broker push消息&#xff0c;consumer只管从broker pull消息&#xff0c;两者对消息的生…

从零用自己数据跑R3LIVE

1、相机内参标定 相机选用4mm的广角相机&#xff0c;相机内参标定选择用最常见的棋盘格方法&#xff0c;首先安装ROS自带的包 sudo apt install ros-melodic-camera-calibration 用usb_cam启动相机后进行标定 。 rosrun camera_calibration cameracalibrator.py --size 8x6…

【Linux】网络编程相关概念介绍、UDP套接字简单演示、最简单的UDP公共聊天室实现~

文章目录 [toc] 网络编程 - 套接字一些概念1. 源ip地址与目的ip地址2. 端口号 和 socket套接字 **问题 3. 源端口号和目的端口号4. 认识TCP协议基本特点5. 认识UDP协议基本特点6. 网络字节序 socket编程接口**struct sockaddr**接口演示: 简单的UDP网络通信int socket()UDP网络…