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

2024-02-26 21:28

本文主要是介绍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;
}

这篇关于TensorRT及CUDA自学笔记007 运行时库及矩阵加法demo的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/750214

相关文章

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

uva 10069 DP + 大数加法

代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>#include <cl

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个