cuda编程学习:写cuda程序的基本流程

server/2024/9/24 11:11:10/

1.必要的头文件

#include <cuda_runtime.h>  // CUDA 运行时库
#include <iostream>

2. 定义核函数

__global__ void vectorAdd(const float *A, const float *B, float *C, int numElements) {int i = blockDim.x * blockIdx.x + threadIdx.x;if (i < numElements) {C[i] = A[i] + B[i];}
}

3.写主函数

  • 设置设备
  • 初始化数据
  • 分配设备内存
  • 将数据从主机复制到设备
  • 配置和启动核函数
  • 从设备复制数据回主机
  • 清理资源
int main(void) {int numElements = 50000;size_t size = numElements * sizeof(float);// 分配主机内存float *h_A = new float[numElements];float *h_B = new float[numElements];float *h_C = new float[numElements];// 初始化数据for (int i = 0; i < numElements; ++i) {h_A[i] = rand()/(float)RAND_MAX;h_B[i] = rand()/(float)RAND_MAX;}// 分配设备内存float *d_A = nullptr;float *d_B = nullptr;float *d_C = nullptr;cudaMalloc((void **)&d_A, size);cudaMalloc((void **)&d_B, size);cudaMalloc((void **)&d_C, size);// 复制数据从主机到设备cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice);cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice);// 启动核函数int threadsPerBlock = 256;int blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock;vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, numElements);// 复制数据从设备回主机cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost);// 清理资源cudaFree(d_A);cudaFree(d_B);cudaFree(d_C);delete [] h_A;delete [] h_B;delete [] h_C;std::cout << "Done" << std::endl;return 0;
}

4.编译程序(cmake)
当然也可以直接用nvcc

cmake_minimum_required(VERSION 3.10)
project(MyCudaApp LANGUAGES CXX CUDA)# 设置 CUDA 编译器和链接器选项
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -arch=sm_75 -code=sm_75,compute_80")# 添加可执行文件
add_executable(cuda_app 1.cu)

http://www.ppmy.cn/server/46381.html

相关文章

Java18新特性

Java 18是Java编程语言的最新版本&#xff0c;其中引入了许多新的特性和改进。以下是Java 18的一些主要特性&#xff1a; 本地模式推断 Java 18引入了本地模式推断&#xff0c;这意味着在局部变量声明中可以使用关键字var来推断变量的类型。这样可以减少冗余代码&#xff0c;并…

微信公众号开发(三):自动回复“你好”

上一篇做了服务器校验&#xff0c;但没有处理用户发来的消息&#xff0c;为了完成自动回复的功能&#xff0c;需要增加一些功能&#xff1a; 1、调整服务器校验函数&#xff1a; def verify_wechat(request):tokentokendatarequest.argssignaturedata.get(signature)timestamp…

kali系统baopoWiFi密码

kali系统baopoWiFi密码,仅供学习 取决强大的密码字典,如果别人密码设置的足够安全,也无法破解成功,并不是100%破解 一、准备一个无线网卡&#xff0c;需要免驱动&#xff0c;最好知道频率2.4HGZ还是5.0GHZ 二、插上USB接口&#xff0c;vmware模拟器选择连接虚拟机 三、输入命…

FastDFS分布式文件系统——上传本地文件

目录 安装FastDFS FastDFS 使用Java客户端上传本地文件到FastDFS服务器上 pom.xml fastdfs_conf配置文件 FastDFS 测试 安装FastDFS 1、用FastDFS一步步搭建文件管理系统 - bojiangzhou - 博客园 (cnblogs.com)2、FastDFS文件上传功能封装 - 动力节点 (bjpowernode.com)…

Spring Security3.0版本

前言&#xff1a; 核心&#xff1a; A >> &#xff1f; >> B &#xff1f;代表判断层&#xff0c;由Security实现 这是之前的版本浓缩&#xff0c;现在3.0版本添加了更匹配的内容描写&#xff0c;匹配了mvc模式 非mvc模式 核心&#xff1a;client&#x…

JAVA多态

一.向上转型 上代吗&#xff1a; 这里我们定义了三个java文件&#xff0c;这里用ANM来接受一个Dog类型的类&#xff0c;我们发现不会报错&#xff0c;这就是发生了向上转型&#xff0c;由子类变成了父类 二.方法的重写 那么我们应该如何调用子类的函数呢 首先我们试一下直接…

Redis实现延迟队列

最近用到一个延迟消息的功能&#xff0c;第一时间想到使用MQ或者MQ的插件&#xff0c;因为数据量不大&#xff0c;所以尝试使用Redis来实现了&#xff0c;毕竟Redis也天生支持类似MQ的队列消费&#xff0c;所以&#xff0c;在这里总结了一下Redis实现延迟消息队列的方式。 一、…

vi和vim有什么不同?

vi 和 vim 都是流行的文本编辑器&#xff0c;它们之间有以下主要区别&#xff1a; 历史&#xff1a; vi 是一个非常古老的文本编辑器&#xff0c;最初由 Bill Joy 在 1976 年为 Unix 系统编写。vim&#xff08;Vi IMproved&#xff09;是 vi 的一个增强版&#xff0c;由 Bram M…