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 ...
随机推荐
- POJ 2584 T-Shirt Gumbo 二分图的多重匹配
题目链接:http://poj.org/problem?id=2584 题目大意:有SMLXT五种T恤型号,有N个人,每个人有一个可选的型号区间,你现在要发给N个人每人一条他可以选择的型号的T恤,问能 ...
- C#Json数据反序列化为Dictionary并根据关键字获取指定的值
Json数据: { "dataSet": { "header": { ", "errorInfo": "HTTP请求错误 ...
- 【Leetcode_easy】1071. Greatest Common Divisor of Strings
problem 1071. Greatest Common Divisor of Strings solution class Solution { public: string gcdOfStrin ...
- Ubuntu18安装虚拟机virtualbox
环境查看 安装虚拟机 apt install virtualbox 图形化界面启动 virtualbox 其余创建虚拟机和安装和在Windows安装配置一样,不详述.
- MYSQL:基础——索引原理及慢查询优化
MYSQL:基础——索引原理及慢查询优化 索引的数据结构 索引的数据结构是B+树.如下图所示,B+树的节点通常被表示为一组有序的数据项和子指针.图中第一个节点包含数据项3和5,包含三个指针,第一个指针 ...
- MySQL索引对NULL值的处理
# 索引不会包含有NULL值的列 只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的.所以我们在数据库设计时不要让字段的默认值为NU ...
- 【机器学习】attention机制
参考: 1.https://lilianweng.github.io/lil-log/2018/06/24/attention-attention.html
- Django 高级视图
一.Django限制请求method 常用的请求method: GET请求:GET请求一般用来向服务器索取数据,但不会向服务器提交数据,不会对服务器的状态进行更改.比如向服务器获取某篇文章的详情. P ...
- python 爬虫实例(一)
一个简单的爬虫工程 环境: OS:Window10 python:3.7 安装一些库文件 pip install requests pip install beautifulsoup4 pip ins ...
- C#、.NET、ASP.NET之间的关系
一.前言 这是个人的笔记,在博客园已经有不少大佬已经写过了.但我自己就想留点笔记在属于我自己的博客.所以大佬忽略就行,不喜勿碰.谢谢!!! 二.个人笔记 C# 全称(C sharp),它是微软公司发布 ...