CUDA中确定你显卡的thread和block数
CUDA中确定你显卡的thread和block数
在进行并行计算时, 你的显卡所支持创建的thread数与block数是有限制的, 因此, 需要自己提前确定够用, 再进行计算, 否则, 你需要改进你的算法, 或者, 更新你的硬件了.
硬件方面总结
- 首先你需要知道你的显卡的Compute Capability , 在目前市面上绝大多数的都是支持1024 threads , 只有一些非常早期(Compute 1.x)的只是支持 512 threads. 如果是非常早期的一些显卡的话可以参阅这个WebPage
- 在你确定完你的Compute Capability 后, 根据此, 你的显卡的Compute Capability 如果是 1.x的话, Grid 支持的只有 1D 和 2D , 2.x 及以上才支持 3D 的 Grid , 而 block 则在1.x和2.x及更新的版本都支持3D , 在1.x / 2.x+的情况下, 每个block的最大支持分别是[512,512,64] / [1024,1024,64] ,现代显卡的Grid的size已经可以支持到[2^31-1,65535,65535]
- 每个block中的寄存器, 在Compute Capability为1.0,1.1/1.2,1.3/2.x-/3.0/3.2/3.5-5.2/5.3/6-6.1/6.2/7.0的情况下, 对应的寄存器总量不超过8k/16k/32k/64k/32k/64k/32k/64k/32k/64k .
- 每个Block中 , 在Compute Capability为1.x/2.x-6.2/7.0的情况下, 对应的 share memery不能超过 16kb/48kb/96kb .
- 你的block的数量,前面已经说了,现在的显卡Grid的size一般最大支持[65535,65535,1],因此,当你需要的block小于65535时,使用1D即可,如果你的Compute Capability 大于3.0的话,同样是1D,你的Grid最大可以支持2^31-1个block,2D或者3D时,你的grid最大可以支持[2^31-1,65535,65535]
- 如果你超过了你的显卡的硬件限制, 它会自动停止工作.
经验总结
实际上, 你想要充分利用你的显卡的性能, 就需要对你的代码仔细分析, 然后才能够 充分利用, 而不是每一条都照着官方给的标准进行. 简单总结下 :
- 每个 block 上的 threads 数都应该是warp大小的四舍五入,在所有当前硬件上都是32。
- 充分利用streaming multiprocessor unit, 使得你的 warp 始终都在运行, 从而来隐藏一些内存读取的时间, 简单说就是, 让你的所有warp始终都在计算, 这样子的话, 你的内存读取时间就可以基本被忽略(隐藏) .
- 利用好你的share memery 以及 sync .
参考
https://stackoverflow.com/questions/9985912/how-do-i-choose-grid-and-block-dimensions-for-cuda-kernels
https://en.wikipedia.org/wiki/CUDA
CUDA中确定你显卡的thread和block数的更多相关文章
- CUDA中自动初始化显卡设备宏
每次为了减少初始化的工作量,可以写入下面的宏. #define CUT_DEVICE_INIT(ARGC,ARGV){ \ int deviceCount; \ CUDA_SAFE_CALL_NO_S ...
- CUDA中block和thread的合理划分配置
CUDA并行编程的基本思路是把一个很大的任务划分成N个简单重复的操作,创建N个线程分别执行执行,每个网格(Grid)可以最多创建65535个线程块,每个线程块(Block)一般最多可以创建512个并行 ...
- CUDA中并行规约(Parallel Reduction)的优化
转自: http://hackecho.com/2013/04/cuda-parallel-reduction/ Parallel Reduction是NVIDIA-CUDA自带的例子,也几乎是所有C ...
- CUDA中使用多维数组
今天想起一个问题,看到的绝大多数CUDA代码都是使用的一维数组,是否可以在CUDA中使用一维数组,这是一个问题,想了各种问题,各种被77的错误状态码和段错误折磨,最后发现有一个cudaMallocMa ...
- 【并行计算-CUDA开发】CUDA编程——GPU架构,由sp,sm,thread,block,grid,warp说起
掌握部分硬件知识,有助于程序员编写更好的CUDA程序,提升CUDA程序性能,本文目的是理清sp,sm,thread,block,grid,warp之间的关系.由于作者能力有限,难免有疏漏,恳请读者批评 ...
- cuda中时间用法
转载:http://blog.csdn.net/jdhanhua/article/details/4843653 在CUDA中统计运算时间,大致有三种方法: <1>使用cutil.h中的函 ...
- OpenCV二维Mat数组(二级指针)在CUDA中的使用
CUDA用于并行计算非常方便,但是GPU与CPU之间的交互,比如传递参数等相对麻烦一些.在写CUDA核函数的时候形参往往会有很多个,动辄达到10-20个,如果能够在CPU中提前把数据组织好,比如使用二 ...
- cuda中模板的使用
模板是C++的一个重要特征,它可以让我们简化代码,同时使代码更整洁.CUDA中也支持模板,这给我们编写cuda程序带来了方便.不过cuda4.0之前和之后使用模板的方法不一样,这给我们带来了少许困难. ...
- cuda中的二分查找
使用背景 通常,在做高性能计算时,我们需要随机的连接某些点.这些点都具有自己的度量值,显然,度量值越大的值随机到的概率就会越大.因此,采用加权值得方法: void getdegreeSum(DG *g ...
随机推荐
- Shell脚本运行报错Bad substitution解决办法
环境Ubuntu18.4.02 脚本运行报错 # sh test.sh test.sh: 2: test.sh: Bad substitution 原因 从 ubuntu 6.10 开始,ubuntu ...
- 【ARTS】01_41_左耳听风-201900819~201900825
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- mysql的HA及openstack和k8s区别
数据库HA(Hight Availability) mysql自身支持主主/主备部署,多主(>2),一主多备 galera mariadb集群:多主相互备份 修改容器的启动配置 修改Docker ...
- http响应时长分析
curl -o /dev/null -s -w "time_namelookup:%{time_namelookup}::time_connect:%{time_connect}::time ...
- 最新 企叮咚java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿. 企叮咚等10家互联网公司的校招Offer,因为某些自身原因最终选择了 企叮咚.6.7月主要是做系统复习.项目复盘.Leet ...
- GitToc-为你的Github仓库的Readme自动生成一个目录
维护自己的Github仓库的时候发现Github的Readme不支持Toc目录,所以就自己写了一个小工具. 工具地址:https://github.com/Holy-Shine/GitToc 简介 如 ...
- json数据的key的读取和替换
读取json的key: /** * @Description: 递归读取所有的key * @Param: * @return: * @throws Exception * @author: hw * ...
- bam文件格式说明
bam文件说明 bam文件和sam文件内容其实是一样的,只是bam是二进制的压缩文件,需要通过特定的软件来进行查看,bam文件通常可以理解为12个字段组成 BAM格式分为header section( ...
- 剑指offer64:滑动窗口的最大值
1 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4 ...
- WUSTOJ 1313: 数列(Java)进制转换
题目链接: