当前位置: 首页 > article >正文

CUDA编程学习(四)内存拷贝

本篇文章介绍如何把存储在主机内存上的数据拷贝到存储到设备显卡的内存上。我们将逐步分析代码完整代码如下#include cuda_runtime.h #include ../common/common.h #include stdio.h void initialData(float *ip,int size) { time_t t; srand((unsigned)time(t)); printf(Matrix is :); for (int i0;isize;i) { ip[i](float)(rand() 0xFF) / 10.0f; printf(%.2f,ip[i]); } printf(\n); return; } int main(int argc, char **argv) { int nDeviceNumber 0; cudaError_t error ErrorCheck(cudaGetDeviceCount(nDeviceNumber),__FILE__,__LINE__); if(error ! cudaSuccess || nDeviceNumber 0) { printf(No CUDA campatable GPU found!\n); return -1; } int dev0; error ErrorCheck(cudaSetDevice(dev),__FILE__,__LINE__); if(error!cudaSuccess) { printf(fail to set GPU 0 for computing\n); return -1; } else{ printf(Set GPU 0 for computing\n); } int nElem 16; size_t nBytes nElem * sizeof(float); float *h_A,*h_B,*gpuRef; h_A (float *)malloc(nBytes); h_B (float *)malloc(nBytes); gpuRef (float *)malloc(nBytes); if(NULL ! h_A NULL ! h_B NULL !gpuRef) { printf(allocate memory successfully\n); } else{ printf(fail to allocate memory\n); return -1; } initialData(h_A,nElem); initialData(h_B,nElem); memset(gpuRef,0,nBytes); float *d_A,*d_B,*d_C; cudaMalloc((float **)d_A,nBytes); cudaMalloc((float **)d_B,nBytes); cudaMalloc((float **)d_C,nBytes); if(d_A NULL || d_B NULL || d_CNULL) { printf(fail to allocate memory for GPU\n); free(h_A); free(h_B); free(gpuRef); return -1; } else { printf(successfully allocate memory for GPU\n); } if(cudaSuccess cudaMemcpy(d_A,h_A,nBytes,cudaMemcpyHostToDevice) cudaSuccess cudaMemcpy(d_B,h_B,nBytes,cudaMemcpyHostToDevice) cudaSuccess cudaMemcpy(d_C,gpuRef,nBytes,cudaMemcpyHostToDevice)) { printf(Successfully copy data from CPU to GPU!\r\n); } else { printf(fail to copy data from CPU to GPU!\r\n); } free(h_A); free(h_B); free(gpuRef); cudaFree(d_A); cudaFree(d_B); cudaFree(d_C); cudaDeviceReset(); return 0; }common.h中定义了一个函数用于检测CUDA程序运行中的状态是否正确。#includesys/time.h #includecuda_runtime.h #includestdio.h cudaError_t ErrorCheck(cudaError_t status, const char* filename,int lineNumber) { if (status ! cudaSuccess) { printf(CUDA API error:\r\ncode%d,name%s,description%s\r\nfile%s,line%d\r\n, status,cudaGetErrorName(status),cudaGetErrorString(status),filename,lineNumber); return status; } return status; }首先看第一段代码定义了初始化矩阵的函数void initialData(float *ip,int size) { time_t t; //时间变量用于获取系统现在的时间它的值时刻都在改变 srand((unsigned)time(t)); //与rand()函数搭配使用利用t来生成不断变化的种子使得rand()函数每次运行的结果都不一样 printf(Matrix is: ); for (int i0; isize;i) { ip[i] (float)(rand()0xFF)/10.0f; //利用rand函数生存随机数字给数组ip赋值 printf(%.2f,ip[i]); } printf(\n); return; }main函数中的第一部分代码用于检测GPU是否可用int nDeviceNumber 0; //该变量用于存储可用GPU的数量初始值为0 cudaError_t error ErrorCheck(cudaGetDeviceCount(nDeviceNumber),__FILE__,__LINE__); //用于检测可用GPU数量以及其是否可用 if(error ! cudaSuccess || nDeviceNumber 0) { //如果可用显卡数为0或者cuda启动失败退出进程 printf(No CUDA campatable GPU found!\n); return -1; }int dev0; //GPU的编号默认为0 error ErrorCheck(cudaSetDevice(dev),__FILE__,__LINE__); //设置显卡状态检测0号显卡是否可用 if(error ! cudaSuccess) { printf(fail to set GPU 0 for computing\n); return -1; } else { printf(Set GPU 0 for computing\n); }第二部分开始分配内存。先分配主机内存再分配设备内存int nElem 16; size_t nBytes nElem * sizeof(float); //待分配的内存空间的大小 float *h_A,*h_B,*gpuRef; h_A (float *)malloc(nBytes); h_B (float *)malloc(nBytes); gpuRef (float *)malloc(nBytes); //定义主机内存利用malloc()函数分配指定大小内存 if(NULL ! h_A NULL ! h_B NULL !gpuRef) { //检查是否分配成功 printf(allocate memory successfully\n); } else{ printf(fail to allocate memory\n); return -1; } initialData(h_A,nElem); initialData(h_B,nElem); //因为分配的内存空间上可能已经存储了数据所以需要初始化 memset(gpuRef,0,nBytes); //这块内存上指定长度空间存储的数值都设定为0分配设备内存float *d_A,*d_B,*d_C; cudaMalloc((float **)d_A,nBytes); cudaMalloc((float **)d_B,nBytes); cudaMalloc((float **)d_C,nBytes); //利用cuda专门用于分配内存的函数给指定地址分配内存空间。 //由于C语言传参默认传的是数值如果要对传参的值进行改变必须传其指针地址 if(d_A NULL || d_B NULL || d_CNULL) { //如果分配GPU显存失败退出并释放掉已经分配的CPU内存 printf(fail to allocate memory for GPU\n); free(h_A); free(h_B); free(gpuRef); return -1; } else { printf(successfully allocate memory for GPU\n); }第三部分分配好了主机内存和设备显存以后开始进行数据拷贝if(cudaSuccess cudaMemcpy(d_A,h_A,nBytes,cudaMemcpyHostToDevice) cudaSuccess cudaMemcpy(d_B,h_B,nBytes,cudaMemcpyHostToDevice) cudaSuccess cudaMemcpy(d_C,gpuRef,nBytes,cudaMemcpyHostToDevice)) { printf(Successfully copy data from CPU to GPU!\r\n); } //判断数据拷贝是否成功。cudaMemcpy()函数的三个传参分别为设备地址、主机地址、内存大小、以及拷 贝方向(从设备到主机还是从主机到设备这里是从主机到设备) else { printf(fail to copy data from CPU to GPU!\r\n); } free(h_A); free(h_B); free(gpuRef); cudaFree(d_A); cudaFree(d_B); cudaFree(d_C); cudaDeviceReset(); //程序结束释放所有内存 return 0;使用nvcc进行编译运行可执行文件得到Set GPU 0 for computing allocate memory successfully Matrix is : Matrix is : successfully allocate memory for GPU Successfully copy data from CPU to GPU! [1] Done /usr/bin/gdb --interpretermi --tty${DbgTerm} 0/tmp/Microsoft-MIEngine-In-cuqcf0bg.mrd 1/tmp/Microsoft-MIEngine-Out-f3ch05dq.ck0说明拷贝成功

相关文章:

CUDA编程学习(四)内存拷贝

本篇文章介绍如何把存储在主机内存上的数据拷贝到存储到设备显卡的内存上。我们将逐步分析代码&#xff0c;完整代码如下#include <cuda_runtime.h> #include "../common/common.h" #include <stdio.h>void initialData(float *ip,int size) {time_t t;s…...

2026多平台后台模板,包括:Html、Laravel、react、VUE、dotnet、angular

✨ 核心亮点✅ 全技术栈覆盖&#xff1a;囊括 Html 静态模板、Laravel 后端框架模板、React/VUE/Angular 前端框架模板、dotnet 微软系模板&#xff0c;一套搞定多场景开发&#xff1b;✅ 企业级标准&#xff1a;模板内置权限管理、数据可视化、表单校验、菜单路由等高频功能&a…...

基于MATLAB的Kmeans自动寻找最佳聚类中心App:‘手肘法‘确定k值与聚类结果可视化

基于MATLAB的Kmeans自动寻找最佳聚类中心App。 通过简单的界面操作&#xff0c;能够实现手肘法确定kmeans算法的最佳聚类数&#xff0c;并自动进行聚类&#xff0c;画图。 点击加载要聚类的数据——点击手肘法计算k值按键——根据生成的不同K值聚类偏差图&#xff0c;获得最佳聚…...

计算机毕业设计 java 虚拟股票交易系统 Java+SpringBoot 模拟股票交易平台 Web 版股市虚拟交易实训系统

计算机毕业设计 java 虚拟股票交易系统 z00to9&#xff08;配套有源码 程序 mysql 数据库 论文&#xff09;本套源码可以先看具体功能演示视频领取&#xff0c;文末有联 xi 可分享金融投资学习需求增长&#xff0c;新手缺乏安全实操环境&#xff0c;真实股票交易风险高、体验差…...

计算机毕业设计springboot基于Java的高校毕业实习管理系统的设计与实现 基于SpringBoot的高校毕业生实习信息管理平台的设计与实现 基于Java技术的高校学生顶岗实习综合服务平台

计算机毕业设计springboot基于Java的高校毕业实习管理系统的设计与实现jctd2693 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着高等教育的普及&#xff0c;每年有大量的学生…...

基于PSCAD仿真研究:三相空载输电线路过电压保护与断路器分合闸策略分析

pscad仿真 采用pscad搭建220kv三相空载输电线路&#xff0c;仿真合空线&#xff0c;切空线过电压&#xff0c;仿真避雷器&#xff0c;合闸电阻法抑制合闸过电压&#xff0c;仿真控制断路器三相分别在线路相电压为0&#xff0c;30&#xff0c;60&#xff0c;90分合闸的抑制过电压…...

计算机毕业设计 java 校园闲置交易平台 Java+SpringBoot 校园闲置物品交易平台 Web 版高校二手物品交换系统

计算机毕业设计 java 校园闲置交易平台 gb3869&#xff08;配套有源码 程序 mysql 数据库 论文&#xff09;本套源码可以先看具体功能演示视频领取&#xff0c;文末有联 xi 可分享随着校园物资丰富与环保理念普及&#xff0c;学生闲置物品增多&#xff0c;线下交易渠道窄、信息…...

个人项目复习-云盘Day03

考点13&#xff1a;大文件上传需求和常见问题普遍需求&#xff1a;在云存储、视频分享、在线教育等领域&#xff0c;用户上传大文件的需求日益普遍。核心挑战&#xff1a;网络波动、不稳定性及客户端资源限制&#xff0c;常给用户带来不佳体验&#xff1b;传统整文件上传易因中…...

基于comsol技术的磁可调双带高效吸收器

comsol磁可调双带吸收器。搞电磁超材料的兄弟应该都懂&#xff0c;玩双带吸收器最头疼的就是怎么动态调谐。传统结构一旦加工成型&#xff0c;吸收峰就焊死在固定频段了。最近在COMSOL里折腾磁可调方案发现个骚操作——在铁氧体基底里埋钇铁石榴石&#xff08;YIG&#xff09;阵…...

运维系列虚拟化系列OpenStack系列【仅供参考】:Service Plugin / Agent - 每5玩OpenStack(73) 两张图总结 Neutron 架构 - 每天5分钟玩转

Service Plugin / Agent - 每天5分钟玩转 OpenStack(73) && 两张图总结 Neutron 架构 - 每天5分钟玩转 OpenStack(74) Service Plugin / Agent - 每天5分钟玩转 OpenStack(73) DHCP Routing Firewall Load Balance 两张图总结 Neutron 架构 - 每天5分钟玩转 Open…...

运维系列虚拟化系列OpenStack系列【仅供参考】:详解 ML2 Core Plugin(II) - 每天5分钟玩转 OpenStack(72)

详解 ML2 Core Plugin(II) - 每天5分钟玩转 OpenStack(72) 详解 ML2 Core Plugin(II) - 每天5分钟玩转 OpenStack(72) Type Driver Mechanism Driver mechanism driver 有三种类型: Agent-based Controller-based 基于物理交换机 详解 ML2 Core Plugin(II) - 每天5分…...

运维系列虚拟化系列OpenStack系列【仅供参考】:Neutron 如何支持多种 network provider - 每5玩 OpenS-70 详解 ML2 Core Plugin(I)

Neutron 如何支持多种 network provider - 每天5分钟玩转 OpenStack(70) && 详解 ML2 Core Plugin(I) - 每天5分钟玩转 OpenStack(71) Neutron 如何支持多种 network provider - 每天5分钟玩转 OpenStack(70) linux bridge core plugin linux bridge agent 详解…...

从零起步学习MySQL 第十二章:MySQL分页性能如何优化?

前言&#xff1a;今天在看学长面经时发现了这样一个问题&#xff1a;字节三面——MySQL分页性能如何优化&#xff1f;作为后端开发工程师&#xff0c;分页是我们日常开发中高频接触的需求&#xff0c;小到后台管理系统的列表查询&#xff0c;大到百万级商品库的分页展示&#x…...

便捷省心!手机数码租赁小程序前端功能玩法详解

随着数码产品更新迭代速度加快&#xff0c;短期租赁成为不少用户体验新品、满足临时需求的优选方式。一款体验流畅的手机数码租赁小程序&#xff0c;其前端功能设计直接影响用户使用感受&#xff0c;以下从用户实际使用场景出发&#xff0c;详细介绍其核心功能玩法&#xff0c;…...

便捷寄件,省心直达——快递寄件小程序前端功能解析

日常工作生活中&#xff0c;快递寄件的便捷性的需求日益凸显&#xff0c;繁琐的寄件流程往往耗费人们大量时间。快递寄件小程序以用户核心需求为导向&#xff0c;打造简洁易用的前端功能&#xff0c;打通寄件全流程&#xff0c;弱化营销属性&#xff0c;专注为用户提供高效、省…...

一文带你深入了解Linux五种I/O模型和I/O多路复用

一文带你深入了解Linux五种I/O模型和I/O多路复用 文章目录一文带你深入了解Linux五种I/O模型和I/O多路复用一、几种典型 I/O 模型1. 阻塞 I/O2. 非阻塞 I/O3. 信号驱动 I/O4. I/O 多路复用&#xff08;高级 I/O&#xff09;5. 异步 I/O&#xff08;AIO&#xff09;二、阻塞与非…...

推荐常与服务器打交道的工程师都安装这款MCP工具

ssh-mcp&#xff0c;功能&#xff1a;让AI直接连接服务器进行操作 安装 # 1. Clone the repository: git clone https://github.com/tufantunc/ssh-mcp.git cd ssh-mcp# 2. Install dependencies: npm install &#xff08;需要你先安装nodejs&#xff09;然后在你的工…...

SourceTree cherry-pick遴选功能的使用

目录一. 使用场景二. 若使用merge功能三. 使用cherry-pick&#x1f352;遴选功能四. 代码合并一. 使用场景 &#x1f537;假设有如下的提交历史 其中提交E是一个bug修复提交D和F是正在开发中的功能 现在需要将E这次提交单独放到 main 中&#xff0c;注意我们只需要E这个单独…...

2026年编程指南:C、C++、C#同源不同命,选对高薪不是梦

挑选正确的编程语言&#xff0c;常常相较于一味埋头刻苦学习&#xff0c;更能够对未来五年你的职场身价起到决定作用。同样是进行代码编写&#xff0c;有人每月薪资能达到三万&#xff0c;有人却依旧在投递简历&#xff0c;两者之间的差距就存在于最开始做出的那个选择之上。 C…...

2026年品牌AI可见性危机:你的公司正在“隐身”?附优化完整指南

2026年&#xff0c;你的品牌在AI眼中是“隐形”的吗&#xff1f;GEO优化完整指南你问过AI这个问题吗&#xff1f;打开AI&#xff0c;问一句“推荐一个做XX的公司”&#xff0c;结果AI推荐的列表里有你的竞争对手&#xff0c;却没有你。这很让人头疼&#xff0c;但原因很简单&am…...

计算机毕业设计springboot基于Vue.js的养老护理员直聘网站 基于SpringBoot与Vue.js的养老服务人员智能匹配平台 采用前后端分离架构的康养护理人才在线招聘系统

计算机毕业设计springboot基于Vue.js的养老护理员直聘网站 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着我国人口老龄化程度持续加深&#xff0c;养老服务行业面临护理人…...

计算机毕业设计springboot基于Vue.js的企业资产管理系统 基于SpringBoot与Vue.js的企业固定资产全生命周期管理平台 采用前后端分离架构的企业设备资产数字化运营系统

计算机毕业设计springboot基于Vue.js的企业资产管理系统&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着企业规模的扩张与业务复杂度的提升&#xff0c;传统手工记录模式已难…...

百度贴吧一键自动签到脚本(附Python脚本下载方式)教程 养账号用 原创!

很多人每天都会手动打开贴吧签到&#xff0c;如果关注的贴吧比较多就会比较麻烦。本教程介绍如何在 Windows 电脑上实现自动签到&#xff0c;并通过系统定时任务实现 每天自动运行。运行的一个参考图如下 整个流程非常简单&#xff1a; 准备 Python 环境下载签到脚本配置 …...

遵循MIT开源协议的OpenClaw,其数据被商业公司大规模全量复制用于构建竞争性平台,是否违背了开源精神的初衷?

开源世界像一片热闹的集市&#xff0c;每个人都可以带着自己的手艺和材料来摆摊&#xff0c;也可以免费取用别人摊上的东西。这集市能运转起来&#xff0c;靠的是一套不成文的默契。最近OpenClaw创始人对腾讯的指责&#xff0c;就像集市里一位手艺人&#xff0c;对着一位用了他…...

Ollama快速入门

Ollama是一个 开源、轻量级的工具&#xff0c;专为在本地计算机上运行大型语言模型&#xff08;LLM&#xff09;而设计。你可以把它理解为一个本地AI模型的“应用商店”和“运行环境”&#xff0c;让你能像使用普通软件一样&#xff0c;轻松地在自己的电脑上体验和利用各种AI模…...

3.14 Python学习记录

#字典 dict 哈希表在python的表现形式 dict1 {"zhang1": 670,"zhang2":680,"zhang3":700} #键 key不能修改 不能重复(如果重复 后面的数值会覆盖前面的数值) value可以修改#定义空字典 dict3 {} dict2 dict() #与集合的区分 定义空集合 只能s…...

机器人爱好者疑问:DreamZero跨具身适应为何领先两倍?

机器人爱好者疑问&#xff1a;DreamZero跨具身适应为何领先两倍&#xff1f; 想象一下&#xff0c;你作为机器人工程师&#xff0c;在实验室调试机械臂&#xff0c;输入指令后&#xff0c;它却总在陌生环境中卡壳。效率低下&#xff0c;项目延期。 这不是个案——传统机器人模型…...

制造知识断层:软件测试工程师的不可替代性构建策略

知识断层的战略意义在技术同质化日益严重的时代&#xff0c;软件测试从业者常陷入技能可复制的焦虑——自动化工具、测试框架、协议规范均可被标准化习得。真正的核心竞争力源于主动构建知识断层&#xff1a;通过非线性技能组合、垂直领域深耕及思维模式革新&#xff0c;使个人…...

技术裸奔时代:软件测试行业的社交货币陷阱与专业重构

一、现象&#xff1a;社交能力裹挟下的技术空心化当前测试行业涌现出一批善于沟通、精于展示的00后从业者&#xff1a;他们能快速融入团队&#xff0c;熟练使用职场话术包装工作成果&#xff0c;甚至在需求评审会上以“用户体验视角”提出看似专业的意见。然而深究技术底层&…...

[2019红帽杯]easyRE

感谢 purecall 师傅提供题目~得到的 flag 请包上 flag{} 提交。 下载后发现是个elf文件&#xff0c;先查壳 发现无壳后扔进IDA中分析 先按f12查看字符串&#xff0c;找到You found me&#xff01;&#xff01; 发现了一堆字符串 双击sub_4009c6进入字符串 signed __int64 su…...