VSCode之C++ & CUDA极简环境配置

2023-10-26

  1. 背景
    想要了解CUDA并行计算原理,同时针对深度学习中出现一些“不支持算子”可能需要手写的需要,配置一个简单的CUDA编译环境,探索CUDA编程的范式【注:CUDA环境配置略】。
  2. 结果展示
    在这里插入图片描述
  3. 示例代码
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <iostream>

__global__ void VecAdd(int* A, int* B, int* C)
{
	int i = threadIdx.x;
	C[i] = A[i] + B[i];
}

void test_cuda(){
   // define data
    const int size = 3;
	int a[size] = { 1,2,3 };
	int b[size] = { 10,20,30 };
	int c[size] = { 0 };

	// define device
	int* dev_a = 0;
	int* dev_b = 0;
	int* dev_c = 0;
	// set cuda state
	cudaError_t cudaStatus;
	// select cuda device
	cudaStatus = cudaSetDevice(0);
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "GPU device error");
		return;
	}
	// allocate memory on cuda
	cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(int));
	if (cudaStatus != cudaSuccess)
		fprintf(stderr, "device_c allocate error");
	cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(int));
	if (cudaStatus != cudaSuccess)
		fprintf(stderr,  "device_a allocate error");
	cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(int));
	if (cudaStatus != cudaSuccess)
		fprintf(stderr,  "device_b allocate error");
	// copy data from cpu to gpu
	cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr,  "device_a copy error");
	}
	// copy data from cpu to gpu
	cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "device_b copy error");
	}
	// core gpu operation
	VecAdd <<<1, size>>> (dev_a, dev_b, dev_c);
	// get error state
	cudaStatus = cudaGetLastError();
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "VecAdd call error: %s\n", cudaGetErrorString(cudaStatus));
	}

	cudaStatus = cudaDeviceSynchronize();
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "cudaDeviceSynchronize not sucess %d!\n", cudaStatus);
	}
	// copy data from cuda to cpu
	cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "copy result to host error");
	}
	printf("{1,2,3} + {10,20,30} = {%d,%d,%d}\n", c[0], c[1], c[2]);
	cudaFree(dev_a);
	cudaFree(dev_b);
	cudaFree(dev_c); 
}

int main() {
	test_cuda();
	return 0;
}
  1. 小结
  1. NVCC编译cuda命令与g++编译C++较为相似,从而借鉴引入对应的include,实现Windows下cmake编译CUDA代码;
  2. 示例代码展示了从CPU读取数据,在GPU端进行计算,最终传输给CPU的过程,与深度学习数据加载过程类似,是较为通用的过程;
  3. 理解C++到CUDA的过渡、预加载过程,进一步从底层了解CUDA。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VSCode之C++ & CUDA极简环境配置 的相关文章

  • 使用管道在父级和子级之间传递整数值

    我对如何正确使用 pipeline 在两个进程之间传递整数值有点困惑 在我的程序中 我首先创建一个管道 然后分叉它 我假设我有 两个 管道 据我了解 这是我的任务 我的父母通过 for 循环检查某个操作的整数值 i 增加计数变量 并将值保存
  • SOAP Web 服务:多台服务器,一个接口

    我有一个场景 需要任意数量的服务器来提供相同的 SOAP Web 服务 我想生成一组代理类 并能够为它们提供一个位置 以便在运行时将它们指向不同的服务器 不幸的是 看起来好像wsdl port节点 子节点wsdl service 要求对特定
  • 无法在 CUDA 中找到 1 到 100 数字的简单和?

    我正在研究使用 CUDA 的图像处理算法 在我的算法中 我想使用 CUDA 内核找到图像所有像素的总和 所以我在cuda中制作了内核方法 来测量16位灰度图像的所有像素的总和 但我得到了错误的答案 所以我在cuda中编写了一个简单的程序来查
  • 来自 double 的 static_cast 可以优化分配给 double 吗?

    我偶然发现了一个我认为不必要的功能 并且通常让我感到害怕 float coerceToFloat double x volatile float y static cast
  • CMake(Ninja 后端)使用 /MT 编译

    我有一个类似的问题CMake 使用 MT 而不是 MD 进行编译 https stackoverflow com questions 14172856 cmake compile with mt instead of md但有一些差异 我正
  • 每个元素的 asp.net Web 表单自定义错误消息

    我创建了一个 Web 应用程序 表单 以及后端 SQL 插入和查询 目前我正在显示所有用户错误消息 div style padding 1em div
  • 如何在 C# 中以编程方式将行添加到 DataGrid?

    正如标题所述 我正在尝试使用 C 以编程方式将行添加到 DataGrid 但我似乎无法使其工作 这是我到目前为止所拥有的 I have a DataGrid declared as dg in the XAML foreach string
  • 在 C# 中解析 JS Date.toIsoString

    我需要将 JS 日期存储为 ISO 8601 日期 我目前正在从格式为 2019 06 22T00 00 00 000Z 的表单中获取日期 正如 JS 的 toIsoString 方法所期望的那样 当这个日期传递到我的 API 控制器时 我
  • 维护 VS Test Project 中单元测试方法之间的上下文

    我想按顺序运行以下单元测试 使用随机数字的名称 密码等创建新客户 检索刚刚创建的客户并断言其属性包含相同的随机数 对同一用户调用 ForgotPassword 函数 并使用相同的随机数作为用户名 清楚地看到 我需要生成一次随机数 并在 3
  • 用于 C++ 中图像分析的 OpenCV 二进制图像掩模

    我正在尝试分析一些图像 这些图像的外部周围有很多噪声 但内部有一个清晰的圆形中心 中心是我感兴趣的部分 但外部噪声正在影响我对图像的二进制阈值处理 为了忽略噪音 我尝试设置一个已知中心位置和半径的圆形蒙版 从而使该圆之外的所有像素都更改为黑
  • 如何在 C++ 中正确使用 cin.fail()

    我正在编写一个程序 从用户那里获取整数输入cin gt gt iUserSel 如果用户输入一个字母 程序就会进入无限循环 我试图用下面的代码来阻止这种情况 但程序进入无限循环并打印出 错误 输入 我该如何修复我的程序 cin gt gt
  • MINIX内部碎片2

    我正在用 C 语言编写一些软件 它递归地列出给定目录中的所有文件 现在我需要计算出内部碎片 我花了很长时间研究这个问题 发现 ext2 上的内部碎片只发生在最后一个块中 我知道理论上你应该能够从索引节点号获得第一个和最后一个块地址 但我不知
  • 将 AutomationID 与 ListView 结合使用

    我正在尝试将 AutomationId 附加到列表视图中的项目 理想情况下 将项目名称绑定到显示的项目
  • 为什么这个位图图像在加载后会改变大小?

    快速提问 我有这个1000 1000位图图像 我使用这个例程来加载它 private BitmapSource initialBitmap new BitmapImage new Uri C Users Desktop Original b
  • MPI - 发送和接收列

    我需要从一个进程发送矩阵列并从另一个进程接收它 我尝试运行以下程序 但得到了一个奇怪的结果 至少我这么认为 仅复制矩阵的第一个元素 某些矩阵元素会发生意外变化 include
  • Clang 5.0 上的 vsprintf 和 vsnprintf [-Wformat-nonliteral] 警告

    我有这段代码 static void err doit int errnoflag int level const char fmt va list ap int errno save unsigned long n char buf MA
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • 在一个解决方案中调用不同项目的方法

    1 个解决方案中有 3 个项目 我对第一个项目中的主文件进行的主要操作 但是我需要调用第三个项目中的方法并使用类 例如 第三个项目有 public DataClasses1DataContext base global WindowsFor
  • 使用未命名命名空间而不是静态命名空间

    我可以假设在未命名命名空间中声明的对象相当于static namespace int x 1 static int x 2 FWIK 在这两种情况下 x将具有静态存储期限和内部链接 声明为的对象的所有规则也是如此static适用于未命名名称
  • 让 Windows 尝试读取文件

    我正在对 Windows 文件系统进行某种封装 当用户请求打开文件时 Windows 调用我的驱动程序来提供数据 在正常操作中 驱动程序返回缓存的文件内容 但是 在某些情况下 实际文件没有缓存 我需要从网络下载它 问题是是否有可能让 Win

随机推荐

  • 经纬恒润与辉羲智能达成战略投资与业务合作,加速产业智能化进程

    近日 经纬恒润战略投资辉羲智能 并与辉羲智能签署战略合作协议 双方将聚焦未来智慧出行 共同打造基于国产高性能SoC的自动驾驶量产解决方案 助力客户快速实现包括轻地图城市NOA在内的高阶自动驾驶功能量产落地 目前自动驾驶规模化处于全面爆发前夕
  • Nightingale滴滴夜莺监控系统入门(三)--页面功能说明

    Nightingale滴滴夜莺监控系统入门 三 功能模块 V3 4 1 用户资源中心 资产管理系统 任务执行中心 监控告警系统 监控看图 监控大盘 告警策略 部署客户端 生产环境开放服务端端口 部署客户端 这章节主要是介绍夜莺的功能使用 各
  • k8s的安装

    我这里使用vmware创建了三台虚拟机 k8s的虚拟机建议最少2核 4G内存 我的电脑配置不高采用的2核 3G的配置 安装k8s之前需要先安装docker docker的安装参考 docker的安装及使用 docker的安装和使用 骑士99
  • ubuntu16.4虚拟机开机,进入tty1命令终端,无法进入桌面问题始末

    现象 1 ubuntu虚拟机开机频繁出现error failed to start network manager 2 进入tty1 vm login 分析 1 回想到前一天编译工程 由于 lib i386 linux gnu下缺少libu
  • visual studio code导入自定义模块(pycharm中能够运行的文件,vs code报错:未找到指定模块)

    一 先看下目录结构 二 在main py中导入Utils中的模块 直接导入即可 from Utils custom event parse import CustomEventParse 三 在custom event parse py中导
  • [运维

    READS SQL DATA 是 MySQL 存储过程和函数中的一种权限修饰符 用于标识该存储过程或函数只读取数据库的数据而不修改它 这个修饰符通常用于声明存储过程或函数的权限 以告知数据库管理系统该过程或函数不会对数据库进行写操作 从而允
  • 动手学数据分析 Task5

    动手学数据分析 Task5 一 逻辑回归 二 随机森林 三 模型评估 3 1 k折交叉验证 3 2 混淆矩阵 3 3 ROC曲线 一 逻辑回归 LogisticRegression penalty l2 dual False tol 0 0
  • 如何将Zookeeper和Kafka的log4j升级到2.16

    1 删除lib下的jar文件 对于kafka lib 删除 slf4j api 1 7 25 jar slf4j log4j12 1 7 25 jar log4j 1 2 17 jar 对于zk lib 删除 log4j 1 2 17 ja
  • 毕业设计 - stm32单片机的远程WIFI密码锁 - 物联网 嵌入式

    文章目录 0 前言 1 简介 主要器件 实现效果 4 硬件设计 WIFI模块 OLED显示屏 相关原理图 硬件接线 5 软件说明 开发环境介绍 程序下载配置 设备初始化打印的信息 6 部分核心代码 7 最后 0 前言 这两年开始毕业设计和毕
  • kubernetes集群-Master节点升级-kubeadm,kubectl,kubelet升级

    kubernetes Master单节点升级 kubeadm 升级 kubelet 升级 kubectl 升级 生产环境注意事项 由于 kubeadm upgrade 不会升级 etcd 请确保已对其进行了备份 例如 您可以使用 etcdc
  • java setsession_Java Session.setServerAliveInterval方法代码示例

    import com jcraft jsch Session 导入方法依赖的package包 类 private Session startNewSession boolean acquireChannel throws JSchExcep
  • 华为od机试 Java【跳房子2】

    题目 有若干个连续的方格地板 儿童们喜欢在上面玩游戏 在这个游戏中 玩家需要在三个回合内 按照规定的步数 从第一格跳到最后一格 跳到最后的玩家有机会选择一个他们喜欢的房子 直到所有的房子都被选完 当然 游戏中最多房子的人是胜者 但游戏并不那
  • 快速浏览Swift-笔记

    快速浏览Swift 笔记 快速浏览Swift https docs swift org swift book GuidedTour GuidedTour html 变量也常量 多行字符串 使用 let quotation I said I
  • python文件工程化,隐藏源码

    python文件工程化 隐藏源码 py文件转换为pyc文件 全文来自博客https www cnblogs com HByang p 13223118 html pyc介绍 pyc是一种二进制文件 是由py文件经过编译后 生成的文件 是一种
  • 3 个 C 程序示例,用于创建包含数据的文件

    本教程介绍如何使用 C 程序创建文件 在这些示例中 我们将创建新的 HTML 文件并向其中写入一些内容 文件的内容会有所不同 但这三个 C 示例程序应该向大家说明如何使用 fopen fprintf 等 c 文件函数来创建和操作文件 示例一
  • ibm中间键服务器缺少文件夹,存储中间件-MQ常见问题解决方法FAQ.doc

    存储中间件 MQ常见问题解决方法FAQ IBM Websphere MQ FAQ Last Release 2006 1 2 这里整理了IBM Websphere MQ的一些常见错误和解决方法 当发现MQ错误而一时无法解决时 可以参阅这里的
  • 【LibTorch】C++中部署TorchScript模型

    文章目录 1 LibTorch安装 2 C 调用PyTorch模型 2 1 Python中保存tensor数据 2 2 C 中保存tensor数据 2 3 C 加载tensor并调用模型 3 编译执行C 推理用例 3 1 编写CMakeLi
  • Kali配置SSH服务,并且通过Xshell远程登录

    在很多时候 需要通过远程登录到Kali主机进行操作 什么是SSH SSH 为建立在应用层基础上的安全协议 SSH 是较可靠 专为远程登录会话和其他网络服务提供安全性的协议 利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题 1 配置
  • 把正整数数组里面的数字组合成最小的数字

    题目描述 把数组里所有数字拼接起来排成一个数 打印能拼接出的所有数字中最小的一个 例如输入数组 7 302 12 则打印出这三个数字能排成的最小数字为123027 题目分析 需要打印出三个数字可以排成的最小数字 表明算法涉及全排列 算法设计
  • VSCode之C++ & CUDA极简环境配置

    背景 想要了解CUDA并行计算原理 同时针对深度学习中出现一些 不支持算子 可能需要手写的需要 配置一个简单的CUDA编译环境 探索CUDA编程的范式 注 CUDA环境配置略 结果展示 示例代码 include cuda runtime h