TensorRT及CUDA自学笔记007 运行时库及矩阵加法demo

TensorRT及CUDA自学笔记007 运行时库及矩阵加法demo

Runtime 运行时库

明天再补充,先去准备面试了

矩阵加法demo

cudaMalloc和cudaMemcpy

它们和c的malloc和memcpy功能一致,只是操作的不是host端的内存空间,而是device端的”显存空间“

cudaSetDevice

cudaSetDevice是用于针对主机线程指定Device的cudaAPI函数,接下来主机中这个线程的后续的cuda平台的所有操作都是针对于这个被指定的设备的。

error_check

error_check是我写的检查函数,用于检查你调用的cudaAPI函数是否调用失败或报错,如果失败,error_check会为你输出失败的原因、文件路径和代码行号。

main.cu

#include"common/common.h"void data_inital(float* data,int N){time_t t;srand((unsigned)time(&t));std::cout<<"data: ";//初始化数据for(int i=0;i<N;i++){data[i] = (float)(rand()%0xff)/10.0f;std::cout<<data[i]<<" ";}std::cout<<std::endl;return;
};__global__ void add(float* a, float* b,float* c,int N){int threadID = threadIdx.y*blockDim.x+threadIdx.x;if(threadID<N){c[threadID] = a[threadID]+b[threadID];}
}int main(int argc, char** argv){int deviceCount {0};cudaDeviceProp deviceProp;int driverVersion {0};int runtimeVersion {0};device_information(&deviceCount,&deviceProp,&driverVersion,&runtimeVersion);std::cout<<std::endl;cudaError_t error = error_check(cudaSetDevice(0),__FILE__,__LINE__);//针对主机线程指定Device,接下来主机中这个线程的后续的cuda平台的所有操作都是针对于这个设备的。if(error == cudaSuccess){std::cout<<"cudaSetDevice success!"<<std::endl;std::cout<<"set on device:"<< deviceProp.name << std::endl;}else{std::cout<<"cudaSetDevice failed!"<<std::endl;return -1;}int numElem = 16;size_t nBytes = numElem * sizeof(float);// 初始化主机端数据缓冲区float *hostDataA, *hostDataB, *gpuRef;hostDataA = (float*)malloc(nBytes);hostDataB = (float*)malloc(nBytes);gpuRef = (float*)malloc(nBytes);if (hostDataA == NULL || hostDataB == NULL || gpuRef == NULL){std::cout<<"malloc failed!"<<std::endl;return -1;}data_inital(hostDataA,numElem);    //初始化数据data_inital(hostDataB,numElem);    //初始化数据memset(gpuRef, 0, nBytes);// 初始化设备端数据缓冲区float *deviceDataA, *deviceDataB, *deviceDataC;cudaMalloc((float**)&deviceDataA, nBytes);//注意,cudaMalloc的修饰符为__host____device___,也就是说host和device都可以使用这个cudaAPI函数cudaMalloc((float**)&deviceDataB, nBytes);cudaMalloc((float**)&deviceDataC, nBytes);if (deviceDataA == NULL || deviceDataB == NULL || deviceDataC == NULL){std::cout<<"cudaMalloc failed!"<<std::endl;free(hostDataA);free(hostDataB);free(gpuRef);return -1;}if(cudaSuccess ==  cudaMemcpy(deviceDataA,hostDataA,nBytes,cudaMemcpyHostToDevice) &&cudaSuccess ==  cudaMemcpy(deviceDataB,hostDataB,nBytes,cudaMemcpyHostToDevice) && cudaSuccess ==  cudaMemcpy(deviceDataC,gpuRef,nBytes,cudaMemcpyHostToDevice)) ///注意,cudaMemcpy的修饰符为__host__,也就是说只有host可以使用这个cudaAPI函数{std::cout<<"successfully copy data from host to device "<< deviceProp.name <<std::endl;}else{std::cout<<"copy data from host to device"<< deviceProp.name <<" failed!" <<std::endl;free(hostDataA);free(hostDataB);free(gpuRef);return -1;}//加载核函数dim3 block (4,4);dim3 grid (1,1);add<<<grid,block>>>(deviceDataA,deviceDataB,deviceDataC,numElem);//将数据从设备端拷贝回主机端cudaMemcpy(gpuRef,deviceDataC,nBytes,cudaMemcpyDeviceToHost);//打印运算结果std::cout<<"result: ";for(size_t i = 0; i < numElem; i++)std::cout<<gpuRef[i] << " ";std::cout<<std::endl;//释放资源free(hostDataA);free(hostDataB);free(gpuRef);cudaFree(deviceDataA);cudaFree(deviceDataB);cudaFree(deviceDataC);cudaDeviceReset();return 0;
}

common.h

#include<sys/time.h>
#include<iostream>
#include<cuda_runtime.h>
#include<stdio.h>//用于检查你的cuda函数是否调用失败
cudaError_t error_check(cudaError_t status,const char *filePathName,int lineNumber){if(status !=cudaSuccess){std::cout << "CUDA API error " << cudaGetErrorName(status) << " at " << filePathName << " in line " << lineNumber << std::endl;std::cout << "description :" << cudaGetErrorString(status) << std::endl;return status;}return status;
}bool device_information(int* ptr_devicCount,cudaDeviceProp* ptr_deviceProp,int* ptr_driverVersion,int* ptr_runtimeVersion){cudaGetDeviceCount(ptr_devicCount);if(*ptr_devicCount == 0){std::cerr << "error: no devices supporting CUDA.\n";return false;}else{std::cout << "Detected " << *ptr_devicCount << " CUDA Capable device(s)\n";}for(int i {0}; i < *ptr_devicCount; i++){cudaSetDevice(i);error_check(cudaGetDeviceProperties(ptr_deviceProp,i),__FILE__,__LINE__);std::cout << "Device " << i << " name: " << ptr_deviceProp->name << std::endl;error_check(cudaDriverGetVersion(ptr_driverVersion),__FILE__,__LINE__);error_check(cudaRuntimeGetVersion(ptr_runtimeVersion),__FILE__,__LINE__);std::cout << "CUDA Driver Version / Runtime Version: " << *ptr_driverVersion/1000 << "." << (*ptr_driverVersion%100)/10 << "." << *ptr_driverVersion%10 << "/" << *ptr_runtimeVersion/1000 << "."<< (*ptr_runtimeVersion%100)/10 << "." << *ptr_runtimeVersion%10 << std::endl;std::cout << "CUDA Capability Major/Minor version number: " << ptr_deviceProp->major << "." << ptr_deviceProp->minor << std::endl;std::cout << "Total amount of global memory: " << ptr_deviceProp->totalGlobalMem << std::endl;std::cout << "Total amount of constant memory: " << ptr_deviceProp->totalConstMem << std::endl;std::cout << "Total amount of shared memory per block: " << ptr_deviceProp->sharedMemPerBlock << std::endl;std::cout << "Total number of registers available per block: " << ptr_deviceProp->regsPerBlock << std::endl;std::cout << "Warp size: " << ptr_deviceProp->warpSize << std::endl;std::cout << "Maximum number of threads per block: " << ptr_deviceProp->maxThreadsPerBlock << std::endl;std::cout << "Maximum sizes of each dimension of a block: " << ptr_deviceProp->maxThreadsDim[0] << " x " << ptr_deviceProp->maxThreadsDim[1] << " x " << ptr_deviceProp->maxThreadsDim[2] << std::endl;std::cout << "Maximum sizes of each dimension of a grid: " << ptr_deviceProp->maxGridSize[0] << " x "<< ptr_deviceProp->maxGridSize[1] << " x " << ptr_deviceProp->maxGridSize[2] << std::endl;std::cout << "Maximum memory pitch: " << ptr_deviceProp->memPitch << std::endl;std::cout << "Texture alignment: " << ptr_deviceProp->textureAlignment << std::endl;std::cout << "Concurrent copy and execution: " << ptr_deviceProp->deviceOverlap << std::endl;std::cout << "Run time limit on kernels: " << ptr_deviceProp->kernelExecTimeoutEnabled << std::endl;std::cout << "Integrated: " << ptr_deviceProp->integrated << std::endl;std::cout << "Support host page-locked memory mapping: " << ptr_deviceProp->canMapHostMemory << std::endl;std::cout << "Alignment requirement for Surfaces: " << ptr_deviceProp->surfaceAlignment << std::endl;std::cout << "Device has ECC support: " << ptr_deviceProp->ECCEnabled << std::endl;std::cout << "Device is using TCC driver model: " << ptr_deviceProp->tccDriver << std::endl;std::cout << "Device supports Unified Addressing (UVA): " << ptr_deviceProp->unifiedAddressing << std::endl;std::cout << "Device supports Compute Preemption: " << ptr_deviceProp->computePreemptionSupported << std::endl;}return true;
}

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

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

相关文章

【深入理解设计模式】适配器设计模式

适配器设计模式 适配器设计模式是一种结构型设计模式&#xff0c;用于将一个类的接口转换成客户端所期望的另一个接口&#xff0c;从而使得原本由于接口不兼容而不能一起工作的类能够一起工作。适配器模式通常用于以下场景&#xff1a; 现有接口与需求不匹配&#xff1a;当需要…

Linux安装Mysql(超详细,亲测)

文章中的全部内容自己都有亲身实践&#xff0c;都是有效的&#xff0c;像常见登录错误中&#xff0c;那种错误的密码修改方式自己以前就浪费了很多事件&#xff0c;还有设置Mysql远程登录这些也是&#xff0c;所以我把这些操作整理了一下&#xff0c;让大家在安装和使用Mysql的…

YOLOv6代码解读[02] configs/hub/yolov6l_finetune.py文件解读

文章目录 模型配置文件骨干网络 CSPBepBackbone颈部网络 CSPRepBiFPNNeck检测头 EffiDeHead构建模型Model 模型配置文件 # YOLOv6l model model dict(typeYOLOv6l,pretrainedweights/yolov6l.pt,depth_multiple1.0,width_multiple1.0,backbonedict(typeCSPBepBackbone,num_re…

多线程基础说明【基础篇】

目录 &#x1f32d;1.相关概念 &#x1f37f;2.创建和启动线程 &#x1f95e;3.线程安全 &#x1f9c8;4.死锁 &#x1f953;5.线程通信的方法 1.相关概念 1.1程序 为完成特定任务&#xff0c;用某种语言编写的一组指令的集合。即指一段静态的代码&#xff0c;静态对象…

都2024年了,软件测试面试都问什么?

1、最熟悉的 selenium 操作&#xff1f; 基本上 selenium 提供的一下几大类操作都能够灵活使用&#xff0c;比如说&#xff1a;八大元素定位方式、三大等待方式、用户点击、输入等常见操作、 还有窗口切换、iframe 切换操作&#xff0c;比如说 actionchains 文件上传、JS操作 等…

网站开发--详解Servlet

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;网站开发–详解Servlet 一.基本介绍 tomcat是Java中开发服务器的重要的一个工具,任何开发的服务器都要部署在tomcat之上,可以说tomcat是所有服务器的底座,为了更好的操作http,to…

Pom文件中的scope到是什么作用

在 Maven 的 pom.xml 文件中&#xff0c;<scope> 标签用于定义依赖项的作用域。作用域决定了依赖项的生命周期、可见性和使用范围。<scope> 标签的常用值包括&#xff1a; 1. **compile**&#xff08;默认值&#xff09;&#xff1a;编译依赖在所有 classpath 中都…

golang学习3,golang 项目中配置gin的web框架

1.go 初始化 mod文件 go mod init gin-ranking 2.gin的crm框架 go get -u github.com/gin-gonic/gin 3.go.mod爆红解决

【Redis】redis通用命令

redis连接命令 要在 redis 服务上执行命令需要一个 redis 客户端。Redis 客户端在我们之前安装redis 的src目录下&#xff0c;具体为/usr/local/redis/src。注意此redis实例没有设置密码&#xff0c;如果设置了密码需要先使用命令AUTH执行验证或者开始在命令行中通过-a指定。 …

前后端分离Vue+node.js在线学习考试系统gqw7o

与其它应用程序相比&#xff0c;在线学习平台的设计主要面向于学校&#xff0c;旨在为管理员和学生、教师、院系提供一个在线学习平台。学生、教师、院系可以通过系统及时查看公告信息等。 在线学习平台是在Windows操作系统下的应用平台。为防止出现兼容性及稳定性问题&#xf…

B站项目-基于Pytorch的ResNet垃圾图片分类

基于Pytorch的ResNet垃圾图片分类 数据集预处理 画图片的宽高分布散点图 import osimport matplotlib.pyplot as plt import PIL.Image as Imagedef plot_resolution(dataset_root_path):image_size_list []#存放图片尺寸for root, dirs, files in os.walk(dataset_root_pa…

装配制造业的MES系统种的物料齐套技术

装配是制造企业涉及产品生产加工最为普遍的一种模式&#xff0c;包括汽车、电子、电器、电气等行业。经研究表明&#xff0c;装配在整个产品制造总成本中所占比例超过了50%&#xff0c;所占用的总生产时间比例在40%-60%&#xff0c;直接影响着产品质量和成本。装配制造非常强调…

树-王道-复试

树 1.度&#xff1a; 树中孩子节点个数&#xff0c;所有结点的度最大值为 树的度 2.有序树&#xff1a; 逻辑上看&#xff0c;树中结点的各子树从左至右是有次序的&#xff0c;不能互换。 **3.**树的根节点没有前驱&#xff0c;其他节点只有一个前驱 **4.**所有节点可有零个或…

Leetcoder Day23| 回溯part03:组合+分割

语言&#xff1a;Java/Go 39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的所有不同组合 &#xff0c;并以列表形式返回。你可以按任意顺序返回这些组合。 candidates 中的同一个…

机器学习是什么

机器学习是什么 引言 机器学习&#xff08;Machine Learning&#xff0c;简称ML&#xff09;是人工智能&#xff08;AI&#xff09;领域中的重要分支&#xff0c;旨在通过让计算机系统自动学习和适应&#xff0c;不需要明确的编程指导。机器学习的发展为我们提供了一种新的方…

环形光源让图像质量瞬间提升,一探究竟吧!

光源对机器视觉检测系统的性能起着重要作用,精确的光学结构设计可以提高捕获图像的质量,准确地分离目标和背景信息,不充足的光线会使捕捉到的图像无法满足需求&#xff0c;针对不同的检测对象,不同的形状光源应运而生。我们来看看最常用的LED光源之一—环形光源。 环形光源&…

代码随想录算法训练营day41 | 01背包问题 二维、01背包问题 一维、416. 分割等和子集

背包问题的理论基础重中之重是01背包 01背包问题 二维 二维dp的01背包 确定dp数组以及下标的含义&#xff1a;dp[i][j]表示从下标为[0-i]的物品里任意取&#xff0c;放进容量为j的背包&#xff0c;价值总和最大是多少确定递推公式&#xff1a;dp[i][j] max(dp[i - 1][j], d…

vue3 使用pina

一、Vue 3 项目中集成Pina 状态管理库 要在 Vue 3 项目中使用 Pina&#xff08;Vue 3 状态管理库&#xff09;&#xff0c;您可以按照以下步骤操作&#xff1a; 1. 安装 Pina 库相应的插件&#xff1a; yarn add pinia # 或者使用 npm npm install pinia 2. 在您的 Vue 3 项…

电脑休眠之后唤不醒

现象&#xff1a;午休时间电脑休眠了&#xff0c;醒来之后发现在密码输入界面&#xff0c;但鼠标键盘没反应。按重启键或电源机重新开机&#xff0c;结果开不了机。 原因&#xff1a;1、内存条脏了&#xff0c;导致内存条读取失败 2、休眠的时候硬盘休眠了&#xff0c;导致按…

如何在 CentOS 中配置 SSH 服务的 TCP 端口转发

在 CentOS 系统中&#xff0c;SSH&#xff08;Secure Shell&#xff09;服务提供了强大的功能&#xff0c;其中之一就是 TCP 端口转发。通过此功能&#xff0c;我们可以安全地将本地或远程服务器上的端口流量转发到其他主机上。本文将引导您如何在 CentOS 中启用或禁用 SSH 的 …