CUDA程序编写具体参数设置

2023-05-16

介绍了GPU的结构以及资源的控制要素(GPU硬件结构和程序具体参数设置_yu132563的专栏-CSDN博客)以及编程过程中的一些需要注意的问题(CUDA程序性能调优_yu132563的专栏-CSDN博客),下面就需要对程序进行具体参数的设置,让程序跑起来。

1、BlocksNum, ThreadsNumPerBlock的设置

BlocksNumThreadsNumPerBlock是执行kernel function时配置的值。这两个值通常都是经验求解,很难找到最优值。总体上来讲,这两个参数的设计主要通过下面两点进行考虑:

  • ThreadsNumPerBlock受限于device property的MaxThreadsPerBlock,经验取值为512/1024。
  • BlocksNum最大无限制,常见求解公式为:

2、ThreadNumPerBlock

对于ThreadNumPerBlock而言,其上限由硬件限制,有两个因素

  • 一个是  MaxthreadsPerBlock
  • 一个  MaxRegisterPerBlock/RegisterPerThread

 写好了Kernel后,其RegisterPerThread是固定值。该值由编译器确定可由nvcc的--ptxas-options=-v得出。ThreadNumPerBlock通常取值是256/512/1024(经验而谈,值越大越好)。但有时预先选好的值达不到100% Occupancy,所以选取可以达到最高Occupancy的最大值。那么,什么是Occupancy?

Occupancy:一个SM上active warp 比上 该SM最大的active warps的数量的比值。Low Occupancy会导致较低的instruction issue effiency(参考1.4节所说的关于latency的定义),因为没有足够多的可用warp来掩盖互相依赖的instruction之间的延迟。所以我们需要尽可能让Occupancy更大。Occupancy分为两种【Theoretical Occupancy】和【Achieved Occupancy】。Achieved Occupancy受制于Theoretical Occupancy。

Theoretical Occupancy, ThreadsPerBlock与RegisterPerThread

首先,如何根据ThreadsPerBlockRegisterPerThread计算Theoretical Occupancy?

  • 假设预先设置ThreadsPerBlock,可以得到WarpPerBlock
  • 计算  (注意整数相除,下取整)
  • 计算  ,对比该值与MaxWarpsPerSM,是否达到100%

上述计算中,RegisterPerSMRegisterPerThread都是常量。如未达到100%,则可以尝试更改ThreadsPerBlock看是否能达到更高Occupancy。

 Achieved Occupancy

 Achieved Occupancy无法高于Theoretical Occupancy,但有时会达不到理论值,具体如何见Achieved Occupancy。

 BlockNum

BlocksNum的取值则更有讲究,  ,我们只需要求解BlocksPerSM即可。因为GPU执行机制的原因,理论上BlocksPerSM可以很大。因为如果每个SM平均很多Blocks,但SM每次只能并发执行两个Block,那后面的Block会放到stream里等到前面的Block执行完毕才能被SM执行。但通常来说,在占满SM资源的情况下,BlocksPerSM越小越好。结合CUDA_1D_LOOP来看,BlocksPerSM越小,总的Block数量就少,每个thread所处理的任务量多,可以减少一些创建Block的资源开销,如shared memory的初始化。针对于一个SM最大可以【并发concurrently】执行多少个Block,有如下几个因素限制上限:

因此,我们取这三个值的最小值作为BlocksPerSM即可。

参考文献:

CUDA程序调优指南(三):BlockNum和ThreadNumPerBlock - 知乎

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CUDA程序编写具体参数设置 的相关文章

随机推荐

  • 详解printf重定向到文件中,打印日志的实现

    printf是将信息打印到终端 xff0c 但是有时当我们需要打印的信息比较多时 xff0c 终端无法将所有信息都能够保留在屏幕上 xff0c 这样我们就不能在终端获取我们想要的信息了 xff0c 重定向很好的帮我们解决了这个问题 xff0
  • 计划

    文档计划 读书的时候 2010年左右 由于和导师做了一些涉及单片机的项目 xff0c 狠狠熟悉了一把C语言 xff0c 所以试图写一个实时内核 xff0c 但是由于涉及大量的硬件知识 xff0c 底层汇编和任务栈之类的东西 xff0c 而这
  • CMOS内核--序言

    CMOS内核 序言 本文介绍一些CMOS中需要用的基础知识 由于在单片机系统中不会有MMU所以单片机系统中的每个任务就是一个线程 xff0c 共用系统的地址空间 xff0c 为了精确性 xff0c 后文中措辞中使用线程替换任务 xff0c
  • 欧拉角和旋转矩阵之间的转换

    一 什么是欧拉角 在3D 空间中 xff0c 表示物体的旋转可以由三个欧拉角来表示 xff1a pitch围绕X轴旋转 xff0c 叫俯仰角 yaw围绕Y轴旋转 xff0c 叫偏航角 roll围绕Z轴旋转 xff0c 叫翻滚角 这三个角的顺
  • C++编译之(1)-g++单/多文件/库的编译及C标准的发展历程

    g 43 43 编译入门 本文为您介绍g 43 43 的编译用法 xff1b 通过从最简单的单文件编译 xff0c 到多文件编译 xff0c 再到动态库 静态库的编译及使用 xff1b 例子都经过实际编译并运行 xff0c 可谓全网最良心之
  • STM32F103-寄存器开发-2

    上一篇博客中我已经配置好了对应的时钟 xff0c 接下来就是对GPIOC口进行操作了 为此我们需要配置端口配置寄存器 xff0c 但是在用户手册中查阅 xff0c 可以发现有两个寄存器 xff0c CRL和CRH xff0c 我们应该使用哪
  • 25.UART串口发送过程与配置

    UART串口收发过程与配置 参考资料 STM32Fx中文参考手册 第26章 xff1a 通用同步异步收发器章节 开发板配套教程 STM32Fx开发指南 串口实验章节 笔记基于正点原子官方视频 视频连接https www bilibili c
  • c语言HTTP服务器,超级简易版。

    算是对linux多线程的复习把 xff0c 尝试这用socket写了一个简单的HTTP服务器 xff0c 当访问它的时候它会给你发送一个HTML文件 xff0c 这个HTML文件需要自己写 代码 span class hljs prepro
  • linux POST请求

    linux POST请求 curl https baidu com X POST H key1 value1 H key2 value2 d name test age 23 i 说明 xff1a H header 后接key value对
  • CPPREST处理跨域问题

    本例使用的代码框架非常简单 按照下面这个路径搭建即可 https blog csdn net youyicc article details 108261287 问题由来 网页端需要动态检测C 服务器这边服务是否正常运行 所以采用的方式是h
  • 内存存取区——堆和栈

    一 预备知识 程序的内存分配 一个由c C 43 43 编译的程序占用的内存分为以下几个部分 1 栈区 xff08 stack xff09 由编译器自动分配释放 xff0c 存放函数的参数值 xff0c 局部变量的值等 其操作方式类似于数据
  • ROS中RVIZ坐标系及TF坐标系转换

    RVIZ坐标系 X轴 红色 Y轴 绿色 Z轴 蓝色 YAW 偏航角 绕Z轴旋转 PITCH 俯仰角 绕Y轴旋转 ROLL 滚转角 绕X轴旋转 符合右手坐标系原则 利用TF进行坐标系转换 采用以下指令进行转换 xff0c 其中frame id
  • 【C语言】长度为0的数组

    最近在看代码的时候发现一个好玩的事情 xff0c 长度为0的数组 xff0c 在此记录一下 在网上看到的这个说是只有GNU C才支持的特性 xff0c 因此考虑跨平台或者可移植特点需要慎用 话不多说 xff0c 上案例才有感觉 span c
  • jetson xavier nx使用usb线刷机后开机黑屏闪屏

    情况一 比较常见 xff09 由于刷机是的flash接口是调在右边的 xff0c 如下图所示 解决方法 xff1a 故在刷机成功后 xff0c 连接显示屏后要将flash接口调到 左侧 情况二 在对jetson xavier nxs进行刷机
  • python牛客网输入输出处理

    python 笔试输入 sys stdin readline和input 非常有用 xff01 xff01 xff09 https www jianshu com p 6f14ca3290ee input vs sys stdin read
  • Demo-简单使用libcurl静态库访问网址

    在开始前请先准备好下面的文件 xff1a 1 调试版的libcurl静态库libcurld lib xff0c 可以在网上下载或自己编译 xff1b 2 头文件 xff0c curl h curlver h easy h mprintf h
  • QQ 浏览器(iOS版)崩溃信息研究

    今天碰巧下载了QQ浏览器iOS版本 xff0c 居然一启动就挂了 后来从手机里面把崩溃信息导出来 xff0c 仔细研究下 xff0c 把研究的结果放到网上 xff0c 与大家分享下 先把我导出的崩溃信息放出来 Incident Identi
  • EXCEL利用VBA自由控制图表绘图区大小

    用好VBA的话确实可以给你再办公室的工作效率带来质的提升 如果有人跟你说你可以用Python什么的语言处理Excel balabala的 xff0c 你可以无视他了 当然python可以处理很多事情 xff0c 但是EXCEL自带的作图工具
  • 提升CUDA程序运行效率的几个关键点

    目录 1 明确计算机中GPU卡片的计算资源 xff0c 决定变量的性质 xff08 constant xff0c share还是global xff09 以及Grid xff0c Block的维度 xff0c 充分并合理利用GPU显卡的资源
  • CUDA程序编写具体参数设置

    介绍了GPU的结构以及资源的控制要素 xff08 GPU硬件结构和程序具体参数设置 yu132563的专栏 CSDN博客 xff09 以及编程过程中的一些需要注意的问题 xff08 CUDA程序性能调优 yu132563的专栏 CSDN博客