CUDA学习笔记(持续更新——蜗速)
CUDA学习笔记(持续更新——蜗速)
1.CUDA 程序实现流程如下
2.内存管理
3.核函数
4.全局数据访问唯一索引
5.设备管理
附录代码
1.CUDA 程序实现流程如下
- 将数据从CPU内存拷贝到GPU内存;
- 调用核函数对GPU内存中的数据进行处理;
- 将数据从GPU内存拷贝到CPU内存;
2.内存管理
主机和设备内存函数
标准C函数 CUDA C函数
malloc cudaMalloc
memcpy cudaMemcpy
memset cudaMemset
free cudaFree
- 用于执行GPU内存分配的是cudaMalloc函数,其函数原型为:
cudaError_t cudaMalloc( void** devPtr, size_t size)
- cudaMemcpy函数负责主机和设备之间的数据传输(主机端隐式同步),其函数原型为:
cudaError_t cudaMemcpy(void* dst, const void*src, size_t count, cudaMemcoyKind kind)
kind有以下几种:
cudaMencpyHostToHost
cudaMencpyHostToDevice
cudaMencpyDeviceToHost
cudaMencpyDeviceToDevice
3.核函数
3.1CUDA内核调用是对C语言函数调用语句的延伸,其函数原型为:
kernel_name <<<grid, block>>> (argument list);
- 其中grid为dim3格式的网格维度(即启动块的数目),block为dim3格式的快维度(即块中线程的数目),仅限同一个块中的线程之间相互协作;
- 核函数的启动都是异步的。核函数调用结束后,控制权立刻返回给主机端,通过调用以下函数进行强制主机端程序等待所有核函数执行结束:
cudaError_t cudaDeviceSynchronize(void);
3.2核函数的声明定义,其原型为:
__gloabl__ void kernel_name(argument list);
- 核函数的限制:只能访问设备内存、必须具有void返回类型、不支持可变量的参数、不支持静态变量、显示异步行为;
- CUDA C中的函数限定符如下:
函数类型限定符限定符 执行 调用 备注
__global__ 在设备端执行 可以从主机端调用, 必须有一个void返回类型也可以从计算能力>=3的设备中调用 __device__ 在设备端执行 仅能从设备端调用__host__ 在主机端执行 仅能从主机端调用 可以省略
4.全局数据访问唯一索引
4.1基于给定的一维网格和块的信息来计算全局数据访问的唯一索引:
int i = blockIdx.x * blockDim.x + threadIdx.x;(网格内块索引) (块的维度) (块内线程索引)
4.2基于给定的二维网格和块的信息来计算全局数据访问的唯一索引:
需要注意线程和块索引、矩阵中给定点的坐标、全局线性内存中的偏移量,如下:
将线程和块索引映射到矩阵坐标上;
int ix = blockIdx.x * blockDim.x + threadIdx.x;
int iy = blockIdx.y * blockDim.y + threadIdx.y;
- 将矩阵坐标映射到全局内存中的索引、存储单元上;
int idx = iy *nx + ix; //nx 为矩阵的列,即矩阵宽度
5.设备管理
- 应用CUDA运行时API查询GPU设备所有信息:
cudaError_t cudaGetDeviceProperties(cudaDeviceProp *prop, int device);
具体见附录代码--3.使用运行时API查询设备信息
6.GPU架构
- GPU架构是围绕一个流式多处理器(SM)的可扩展阵列搭建的,并通过复制这种构架的构建块来实现GPU的硬件并行;
- SM的关键组件:CUDA核心、共享内存/一级缓存、寄存器文件、加载/存储单元、特殊功能单元、线程束调度器;
- CUDA采用单指令多线程(SIMT)架构,每32个线程为一组(即线程束warp),线程束中的所有线程同时执行相同的指令,每个线程都有自己的指令地址计算器和寄存器状态,用自身数据执行当前指令。每个SM都将分配给它的线程块划分到包含32个线程的线程束中,然后在可用的硬件资源上调度执行(优化工作负载以适应线程束的边界);
附录代码
1.用CPU计时器计时
//用于CPU端计时,返回自1970.1.1零点以来到现在的秒数
#include <sys/time.h>double cpuSecond()
{struct timeval tp;gettimeofday(&tp,NULL);return ((double)tp.tv_sec+(double)tp.tv_usec*1.e-6);
}
2.定义一个错误处理宏封装所有CUDA API调用
#define CHECK(call) \
{ \const cudaError_t error = call; \if(error != cudaSuccess) \{ \printf("Error: %s: %d, ", __FILE__, __LINE__); \printf("code: %d, reason: %s\n", error, cudaGetErrorString(error)); \exit(1); \} \
}
3.使用运行时API查询设备信息
#include <cuda_runtime.h>
#include <stdio.h>#define CHECK(call) \
{ \const cudaError_t error = call; \if(error != cudaSuccess) \{ \printf("Error: %s: %d, ", __FILE__, __LINE__); \printf("code: %d, reason: %s\n", error, cudaGetErrorString(error)); \exit(1); \} \
}
int main(int argc, char **argv)
{printf("%s String...\n",argv[0]);int device = 0;CHECK(cudaGetDeviceCount(&device));if(device<1){printf("can't detect GPU,that support CUDA!\n");}else{printf("Detected %d CUDA Capable device\n",device);}int dev = 0, driverVersion = 0, runtimeVersion = 0;cudaSetDevice(dev);cudaDeviceProp deviceProp;cudaGetDeviceProperties(&deviceProp, dev);printf("Device %d : \"%s\" \n", dev, deviceProp.name);cudaDriverGetVersion(&driverVersion);cudaRuntimeGetVersion(&runtimeVersion);printf("CUDA Driver Version / Runtime Version: %d.%d / %d.%d\n",
driverVersion/1000,(driverVersion%100)/10,
runtimeVersion/1000,(runtimeVersion%100)/10);printf("CUDA Capability Major/Minor version number: %d.%d\n",
deviceProp.major, deviceProp.minor);printf("Total amount of global memory: %.2f MBytes (%10u bytes)\n",
(float)deviceProp.totalGlobalMem/(pow(1024,2)),
(unsigned long long)deviceProp.totalGlobalMem);printf("GPU Clock rate: %.0f MHz (%0.2f GHz)\n",
deviceProp.clockRate*1e-3f,
deviceProp.clockRate*1e-6f);printf("Memory Clock rate: %.0f MHz\n",
deviceProp.memoryClockRate *1e-3f);printf("Memory Bus Width: %d - bit\n",
deviceProp.memoryBusWidth);if(deviceProp.l2CacheSize){printf("L2 Cache Size: %d bytes\n",
deviceProp.l2CacheSize);}printf("Max Texture Dimension Size (x, y, z) "
"1D=(%d), 2D=(%d,%d), 3D=(%d,%d,%d)\n",
deviceProp.maxTexture1D,deviceProp.maxTexture2D[0],
deviceProp.maxTexture2D[1],deviceProp.maxTexture3D[0],
deviceProp.maxTexture3D[1],deviceProp.maxTexture3D[2]);printf("Total amount of constant memory: %1u bytes\n",
deviceProp.totalConstMem);printf("Total amount of shared memory per block: %1u bytes\n",
deviceProp.sharedMemPerBlock);printf("Total number of registers available per block: %d\n",
deviceProp.regsPerBlock);printf("Warp size: %d\n",
deviceProp.warpSize);printf("Number of multiprocessors on device: %d\n",
deviceProp.multiProcessorCount);printf("Maximum number of threads per multiprocessor: %d\n",
deviceProp.maxThreadsPerMultiProcessor);printf("Maximum number od threads per block: %d\n",
deviceProp.maxThreadsPerBlock);printf("Maximum sizes of each demension of a block: %d x %d x %d\n",
deviceProp.maxThreadsDim[0],deviceProp.maxThreadsDim[1],deviceProp.maxThreadsDim[2]);printf("Maximum sizes of each dimension of a grid: %d x %d x %d\n",
deviceProp.maxGridSize[0],deviceProp.maxGridSize[1],deviceProp.maxGridSize[2]);printf("Maximum memory pitch: %1u bytes\n",
deviceProp.memPitch); exit(EXIT_SUCCESS);
}
CUDA学习笔记(持续更新——蜗速)相关推荐
- 重拾CCNA,学习笔记持续更新ing......(4)
重拾CCNA,学习笔记持续更新ing......(4) 路由器作用功能的经典解说(笑)(非原创) 假设你的名字叫小不点,你住在一个大院子里,你的邻居有很多小伙伴,在门口传达室还有个看大门的李大爷,李大 ...
- Admin.NET管理系统(vue3等前后端分离)学习笔记--持续更新
我的学习笔记 - 9iAdmin.NET 欢迎学习交流 (一)前端笔记 1.1 关于.env的设置 1.2 关于路由模式问题 1.3 关于 vue.config.ts 1.4 关于 打包(pnpm r ...
- Linux学习笔记-随即更新-慢速学习
Linux学习笔记 Linux系统简介 UNIX发展历史和发行版本 开源软件简介 支撑互联网的开源技术 Linux应用领域 Linux学习方法 Linux系统安装 给初学者的建议 学习linux的注意 ...
- JS逆向学习笔记 - 持续更新中
JS逆向学习笔记 寻找深圳爬虫工作,微信:cjh-18888 文章目录 JS逆向学习笔记 一. JS Hook 1. JS HOOK 原理和作用 原理:替换原来的方法. (好像写了句废话) 作用: 可 ...
- 专升本 计算机 公共课学习笔记(持续更新中...)
计算机公共课学习笔记 第一章 计算机基础知识(30分) 1.计算机概述 计算机(Computer)的起源与发展 计算机(Computer)也称"电脑",是一种具有计算功能.记忆功能 ...
- PCL--学习笔记(持续更新——蜗速)
1.PCL头文件引用说明(按需添加) #include <boost/make_shared.hpp> //boost指针相关头文件 #include <pcl/point_type ...
- CSS(3)学习笔记——持续更新
本篇皆是本人长期记录并整理出来的笔记,如有记录得不对的地方,欢迎探讨.记录的很少,将不断学习不断补充. 1 选择器 CSS(3)中提供的选择器手册(w3school):http://www.w3sch ...
- typescript-----javascript的超集,typescript学习笔记持续更新中......
Typescript,冲! Typescript 不是一门全新的语言,Typescript是 JavaScript 的超集,它对 JavaScript进行了一些规范和补充.使代码更加严谨. 一个特别好 ...
- 计算机网络:学习笔记(持续更新)
文章目录 前言 1.1 计算机网络基本概念 什么是计算机网络? 什么是网络协议? 1.2 计算机网络结构 计算机网络结构 网络边缘 接入网络(物理介质) 网络核心(核心网络) Internet结构 1 ...
最新文章
- flutter集成oc
- Java并发Semaphore信号量的学习
- outlook2010客户端无法预览及保存word,excel问题
- Python登录界面
- 现在这个时代变了,区块链,数字货币才是最火的项目
- Java中的数组和List
- ssis 列转换_SSIS中的术语提取转换
- 跟闺密逛街 越逛越穷
- std::kill_dependency
- Asp.net MVC - 使用PRG模式(附源码)
- Unity实现打飞碟小游戏
- 车牌限行——条件分歧
- 心率监测仪全国产化电子元件推荐方案
- qq不显示我的android手机,qq2013不显示手机在线怎么办
- 欧姆龙OMRON PLC之Host Link协议(一)
- word模板动态填充并下载
- 电脑上最值得安装的软件,这10款里一定有你想要的
- CTF常用脚本工具(附下载地址)
- PowerShell yarn : 无法加载文件 C:\Users\Admin\AppData\Roaming\npm\yarn.ps1,因为在此系统因为在此系统上禁止运行脚本。
- ps里面怎么插入流程图_用PS怎么画流程图?