占用率计算器:
有几个API函数可以帮助程序员根据寄存器和共享内存的要求来选择线程块大小:

  • 占用计算器API cudaOccupancyMaxActiveBlocksPerMultiprocessor可以根据内核的块大小和共享内存使用情况提供占用率预测。 该函数根据每个多处理器的并发线程块数来报告占用情况。

    • 请注意,此值可以转换为其他指标。 乘以每块的warp数量会得到每个multiprocessor的并发warp数量; 通过每个多处理器的最大warp进一步划分并发warp给出占用率的百分比。
  • 基于占用的启动配置程序API cudaOccupancyMaxPotentialBlockSize和cudaOccupancyMaxPotentialBlockSizeVariableSMem启发式地计算实现最大多处理器级占用率的执行配置。

以下代码示例计算MyKernel的占用情况。 然后它会报告占用率级别,其中每个多处理器的并发warp与最大warp之间的比率。

// Device code
__global__ void MyKernel(int *d, int *a, int *b)
{int idx = threadIdx.x + blockIdx.x * blockDim.x;d[idx] = a[idx] * b[idx];
}
// Host code
int main()
{int numBlocks; // Occupancy in terms of active blocksint blockSize = 32;// These variables are used to convert occupancy to warpsint device;cudaDeviceProp prop;int activeWarps;int maxWarps;cudaGetDevice(&device);cudaGetDeviceProperties(&prop, device);cudaOccupancyMaxActiveBlocksPerMultiprocessor(&numBlocks,MyKernel,blockSize,0);activeWarps = numBlocks * blockSize / prop.warpSize;maxWarps = prop.maxThreadsPerMultiProcessor / prop.warpSize;std::cout << "Occupancy: " << (double)activeWarps / maxWarps * 100 << "%" <<std::endl;return 0;
}

以下代码示例根据用户输入配置MyKernel的基于占位的内核启动。

// Device code
__global__ void MyKernel(int *array, int arrayCount)
{int idx = threadIdx.x + blockIdx.x * blockDim.x;if (idx < arrayCount) {array[idx] *= array[idx];}
}
// Host code
int launchMyKernel(int *array, int arrayCount)
{int blockSize; // The launch configurator returned block sizeint minGridSize; // The minimum grid size needed to achieve the// maximum occupancy for a full device// launchint gridSize; // The actual grid size needed, based on inputcudaOccupancyMaxActiveBlocksPerMultiprocessor // sizecudaOccupancyMaxPotentialBlockSize(&minGridSize,&blockSize,(void*)MyKernel,0,arrayCount);// Round up according to array sizegridSize = (arrayCount + blockSize - 1) / blockSize;MyKernel << <gridSize, blockSize >> >(array, arrayCount);cudaDeviceSynchronize();// If interested, the occupancy can be calculated with// cudaOccupancyMaxActiveBlocksPerMultiprocessorreturn 0;
}

CUDA工具包还为 / include / cuda_occupancy.h中的任何不依赖于CUDA软件堆栈的使用情况提供自记录,独立占用计算器和启动配置器实现。 还提供了电子表格版本的占用率计算器。 电子表格版本作为一种学习工具特别有用,可以将影响占用率的参数(块大小,每个线程的寄存器和每个线程的共享内存)

最大化内存吞吐量:
为应用程序最大化整体内存吞吐量的第一步是使带宽较低的数据传输最小化。
这意味着最大限度地减少主机和设备之间的数据传输,详见主机和设备之间的数据传输,因为它们比全局内存和设备之间的数据传输具有更低的带宽。
这也意味着通过最大限度地利用片上内存来最大限度地减少全局内存和设备之间的数据传输:共享内存和高速缓存(例如,计算能力2.x或更高的设备上可用的L1高速缓存和L2高速缓存,纹理高速缓存和常量高速缓存 适用于所有设备)。
共享内存相当于用户管理的缓存:应用程序显式分配并访问它。 如CUDA C运行时所示,典型的编程模式是将来自设备内存的数据放入共享内存; 换句话说,要让块的每个线程:

  • 将数据从设备内存加载到共享内存
  • 与块的所有其他线程同步,以便每个线程可以安全地读取由不同线程填充的共享内存位置,
  • 处理共享内存中的数据,
  • 如果需要再次同步以确保共享内存已更新结果,
  • 将结果写回设备内存

对于某些应用程序(例如,全局内存访问模式依赖数据),传统的硬件管理缓存更适合利用数据局部性。 如计算能力3.x和计算能力7.x中所述,对于计算能力3.x和7.x的设备,L1和共享内存使用相同的片上存储器,并且其中有多少是专用的 到L1与共享内存是可配置的每个内核调用。
内核对内存访问的吞吐量可以根据每种内存的访问模式而变化一个数量级。 因此,最大化内存吞吐量的下一步是基于设备内存访问中描述的最佳内存访问模式尽可能最佳地组织内存访问。 这种优化对于全局内存访问尤为重要,因为全局内存带宽较低,所以非最佳全局内存访问对性能影响较大。

CUDA学习(二十九)相关推荐

  1. Java多线程学习二十九:AtomicInteger(原子类) 和 synchronized 的异同点?

    原子类和 synchronized 关键字都可以用来保证线程安全,在本课时中,我们首先分别用原子类和 synchronized 关键字来解决一个经典的线程安全问题,给出具体的代码对比,然后再分析它们背 ...

  2. Golang学习(二十九)序列化和反序列化

    我们不同编程语言之间的数据是无法直接交互的,我们想要解决这个问题 就需要将不同语言之间传输的数据做一个统一规范,而json是目前最流行的数据格式 一.json是什么 json 是一种数据交换格式,主要 ...

  3. ballerina 学习二十九 数据库操作

    ballerina 数据操作也是比较方便的,官方也我们提供了数据操作的抽象,但是我们还是依赖数据库驱动的. 数据库驱动还是jdbc模式的 项目准备 项目结构 ├── mysql_demo │ ├── ...

  4. python学习 (二十九) range函数

    1:list函数可以将其他类型转成list. print(list(range(0, 10))) 2: list函数把元组转成list t = (1, 3, 3, 5) print(list(t)) ...

  5. OpenGL学习二十九:模板缓冲区与模板测试

    帧缓冲区有许多缓冲区构成,这些缓冲区大致分为: 颜色缓冲区:用于绘图的缓冲区,它包含了颜色索引或者RGBA颜色数据. 深度缓冲区:存储每个像素的深度值,当启动深度测试时,片段像素深度值和深度缓冲区深度 ...

  6. JavaScript学习(二十九)—JS常用的事件

    JavaScript学习(二十九)-JS常用的事件 一.页面相关事件 onload事件:当页面中所有的标签都加载完成后厨房该事件,格式:window.onload <body><sc ...

  7. 2021年大数据Hadoop(二十九):​​​​​​​关于YARN常用参数设置

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 关于yarn常用参数设置 设置container分配最小内 ...

  8. SAP UI5 应用开发教程之二十九 - SAP UI5 的路由和导航功能介绍试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  9. PyTorch框架学习二十——模型微调(Finetune)

    PyTorch框架学习二十--模型微调(Finetune) 一.Transfer Learning:迁移学习 二.Model Finetune:模型的迁移学习 三.看个例子:用ResNet18预训练模 ...

  10. C++语言学习(十九)——C++类型识别

    C++语言学习(十九)--C++类型识别 一.C++类型识别简介 1.C++类型识别简介 C++是静态类型语言,其数据类型是在编译期就确定的,不能在运行时更改. C++语言中,静态类型是对象自身的类型 ...

最新文章

  1. JMC | 人工智能在药物发现中的应用:走进广阔的天地
  2. 第三周总结CoreIDRAW
  3. 那些离开工业界,回归学术界的AI科学家们!
  4. oracle sqlplus ed,Uedit32与SQLPlus结合使用技巧-数据库专栏,ORACLE
  5. 浅析error LNK2001: unresolved external symbol public: __thisc...
  6. [转]我不敢!⋯⋯⋯⋯致所有拼搏的年輕人。
  7. Easyui datagrid加载本地Json数据
  8. SVN安装以及使用教程
  9. 【Matlab】mat2cell用法
  10. AI语音技术的应用与发展前景
  11. 计算机可以怎样做游戏,如何制做游戏 怎么制做游戏
  12. APT、ET、RGI、ICQ
  13. 验证是不是合法的18位身份证号码代码
  14. 每一个成年男人在算法中都是好色之徒
  15. linux下看pcie的设备id,linux lspci查看pci总线设备信息
  16. 微软控制云服务器软件,服务器远程控制用什么软件
  17. python 在 win cmd 环境中形如 '\xhh' 输出的转化
  18. 基于stm32的音乐喷泉设计
  19. WEB页面SEO —— 网站TDK优化细节
  20. oh my 毕设-人体姿态估计综述

热门文章

  1. 计算机开题报告参考文献,开题报告中参考文献.docx
  2. 20190925:(经典算法系列)河内之塔
  3. linux mint下安装vnc,VNC远程连接Linux mint桌面
  4. springMvc 乱码问题
  5. kafka分区和es的分区支持对比
  6. kafka性能高的影响因素
  7. [VB]使用ADOX创建Excel文件
  8. ubuntu下rar文件解压后文件名乱码的解决方案
  9. 提高无线网络下载速度的秘诀
  10. 一文看懂深度学习新王者「AutoML」:是什么、怎么用、未来如何发展?