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学习笔记(持续更新——蜗速)相关推荐

  1. 重拾CCNA,学习笔记持续更新ing......(4)

    重拾CCNA,学习笔记持续更新ing......(4) 路由器作用功能的经典解说(笑)(非原创) 假设你的名字叫小不点,你住在一个大院子里,你的邻居有很多小伙伴,在门口传达室还有个看大门的李大爷,李大 ...

  2. Admin.NET管理系统(vue3等前后端分离)学习笔记--持续更新

    我的学习笔记 - 9iAdmin.NET 欢迎学习交流 (一)前端笔记 1.1 关于.env的设置 1.2 关于路由模式问题 1.3 关于 vue.config.ts 1.4 关于 打包(pnpm r ...

  3. Linux学习笔记-随即更新-慢速学习

    Linux学习笔记 Linux系统简介 UNIX发展历史和发行版本 开源软件简介 支撑互联网的开源技术 Linux应用领域 Linux学习方法 Linux系统安装 给初学者的建议 学习linux的注意 ...

  4. JS逆向学习笔记 - 持续更新中

    JS逆向学习笔记 寻找深圳爬虫工作,微信:cjh-18888 文章目录 JS逆向学习笔记 一. JS Hook 1. JS HOOK 原理和作用 原理:替换原来的方法. (好像写了句废话) 作用: 可 ...

  5. 专升本 计算机 公共课学习笔记(持续更新中...)

    计算机公共课学习笔记 第一章 计算机基础知识(30分) 1.计算机概述 计算机(Computer)的起源与发展 计算机(Computer)也称"电脑",是一种具有计算功能.记忆功能 ...

  6. PCL--学习笔记(持续更新——蜗速)

    1.PCL头文件引用说明(按需添加) #include <boost/make_shared.hpp> //boost指针相关头文件 #include <pcl/point_type ...

  7. CSS(3)学习笔记——持续更新

    本篇皆是本人长期记录并整理出来的笔记,如有记录得不对的地方,欢迎探讨.记录的很少,将不断学习不断补充. 1 选择器 CSS(3)中提供的选择器手册(w3school):http://www.w3sch ...

  8. typescript-----javascript的超集,typescript学习笔记持续更新中......

    Typescript,冲! Typescript 不是一门全新的语言,Typescript是 JavaScript 的超集,它对 JavaScript进行了一些规范和补充.使代码更加严谨. 一个特别好 ...

  9. 计算机网络:学习笔记(持续更新)

    文章目录 前言 1.1 计算机网络基本概念 什么是计算机网络? 什么是网络协议? 1.2 计算机网络结构 计算机网络结构 网络边缘 接入网络(物理介质) 网络核心(核心网络) Internet结构 1 ...

最新文章

  1. flutter集成oc
  2. Java并发Semaphore信号量的学习
  3. outlook2010客户端无法预览及保存word,excel问题
  4. Python登录界面
  5. 现在这个时代变了,区块链,数字货币才是最火的项目
  6. Java中的数组和List
  7. ssis 列转换_SSIS中的术语提取转换
  8. 跟闺密逛街 越逛越穷
  9. std::kill_dependency
  10. Asp.net MVC - 使用PRG模式(附源码)
  11. Unity实现打飞碟小游戏
  12. 车牌限行——条件分歧
  13. 心率监测仪全国产化电子元件推荐方案
  14. qq不显示我的android手机,qq2013不显示手机在线怎么办
  15. 欧姆龙OMRON PLC之Host Link协议(一)
  16. word模板动态填充并下载
  17. 电脑上最值得安装的软件,这10款里一定有你想要的
  18. CTF常用脚本工具(附下载地址)
  19. PowerShell yarn : 无法加载文件 C:\Users\Admin\AppData\Roaming\npm\yarn.ps1,因为在此系统因为在此系统上禁止运行脚本。
  20. ps里面怎么插入流程图_用PS怎么画流程图?

热门文章

  1. 一个有意思的echarts3D树状图
  2. HDU1302——蜗牛爬井(注意使用float)
  3. 怎么用控制面板卸载软件?(简单 有图)
  4. 详细了解SQLITE 优缺点 性能测试
  5. 抽象代数之pq阶群或者为循环群或者只有两种结构
  6. “挖矿2.0”:资本方不是只能割区块链的韭菜
  7. 智能美容仪APP开发作用特点
  8. 错误页面不暴漏,显示到一个漂亮页面
  9. cisco 防火墙模拟器_37、如果手头有华为AP,怎们配合模拟器做部分实验呢?(完结篇)...
  10. logo设计灵感的创意网站