CUDA中确定你显卡的thread和block数

在进行并行计算时, 你的显卡所支持创建的thread数与block数是有限制的, 因此, 需要自己提前确定够用, 再进行计算, 否则, 你需要改进你的算法, 或者, 更新你的硬件了.

硬件方面总结

  1. 首先你需要知道你的显卡的Compute Capability , 在目前市面上绝大多数的都是支持1024 threads , 只有一些非常早期(Compute 1.x)的只是支持 512 threads. 如果是非常早期的一些显卡的话可以参阅这个WebPage
  2. 在你确定完你的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]
  3. 每个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 .
  4. 每个Block中 , 在Compute Capability为1.x/2.x-6.2/7.0的情况下, 对应的 share memery不能超过 16kb/48kb/96kb .
  5. 你的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]
  6. 如果你超过了你的显卡的硬件限制, 它会自动停止工作.

经验总结

实际上, 你想要充分利用你的显卡的性能, 就需要对你的代码仔细分析, 然后才能够 充分利用, 而不是每一条都照着官方给的标准进行. 简单总结下 :

  1. 每个 block 上的 threads 数都应该是warp大小的四舍五入,在所有当前硬件上都是32。
  2. 充分利用streaming multiprocessor unit, 使得你的 warp 始终都在运行, 从而来隐藏一些内存读取的时间, 简单说就是, 让你的所有warp始终都在计算, 这样子的话, 你的内存读取时间就可以基本被忽略(隐藏) .
  3. 利用好你的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数的更多相关文章

  1. CUDA中自动初始化显卡设备宏

    每次为了减少初始化的工作量,可以写入下面的宏. #define CUT_DEVICE_INIT(ARGC,ARGV){ \ int deviceCount; \ CUDA_SAFE_CALL_NO_S ...

  2. CUDA中block和thread的合理划分配置

    CUDA并行编程的基本思路是把一个很大的任务划分成N个简单重复的操作,创建N个线程分别执行执行,每个网格(Grid)可以最多创建65535个线程块,每个线程块(Block)一般最多可以创建512个并行 ...

  3. CUDA中并行规约(Parallel Reduction)的优化

    转自: http://hackecho.com/2013/04/cuda-parallel-reduction/ Parallel Reduction是NVIDIA-CUDA自带的例子,也几乎是所有C ...

  4. CUDA中使用多维数组

    今天想起一个问题,看到的绝大多数CUDA代码都是使用的一维数组,是否可以在CUDA中使用一维数组,这是一个问题,想了各种问题,各种被77的错误状态码和段错误折磨,最后发现有一个cudaMallocMa ...

  5. 【并行计算-CUDA开发】CUDA编程——GPU架构,由sp,sm,thread,block,grid,warp说起

    掌握部分硬件知识,有助于程序员编写更好的CUDA程序,提升CUDA程序性能,本文目的是理清sp,sm,thread,block,grid,warp之间的关系.由于作者能力有限,难免有疏漏,恳请读者批评 ...

  6. cuda中时间用法

    转载:http://blog.csdn.net/jdhanhua/article/details/4843653 在CUDA中统计运算时间,大致有三种方法: <1>使用cutil.h中的函 ...

  7. OpenCV二维Mat数组(二级指针)在CUDA中的使用

    CUDA用于并行计算非常方便,但是GPU与CPU之间的交互,比如传递参数等相对麻烦一些.在写CUDA核函数的时候形参往往会有很多个,动辄达到10-20个,如果能够在CPU中提前把数据组织好,比如使用二 ...

  8. cuda中模板的使用

    模板是C++的一个重要特征,它可以让我们简化代码,同时使代码更整洁.CUDA中也支持模板,这给我们编写cuda程序带来了方便.不过cuda4.0之前和之后使用模板的方法不一样,这给我们带来了少许困难. ...

  9. cuda中的二分查找

    使用背景 通常,在做高性能计算时,我们需要随机的连接某些点.这些点都具有自己的度量值,显然,度量值越大的值随机到的概率就会越大.因此,采用加权值得方法: void getdegreeSum(DG *g ...

随机推荐

  1. 2019暑期北航培训—预培训作业-IDE的安装与初步使用(Visual Studio版)

    这个作业属于那个课程 2019北航软件工程暑期师资培训 这个作业要求在哪里 预培训-IDE的安装与初步使用(Visual Studio版) 我在这个课程的目标是 提高自身实际项目实践能力,掌握帮助学生 ...

  2. C++编译提示 default argument are given of parameter ..

    如果定义一个类的构造函数时,带有默认的入参值,在cpp文件中实现构造函数时,是不能带的!否则就会提示该种类型的编译错误. //.h文件: namespace Ui { class Task; } cl ...

  3. java当中JDBC当中请给出一个Oracle DataSource and SingleTon例子

    [学习笔记] 6.Oracle DataSource and SingleTon: import oracle.jdbc.pool.OracleDataSource;import java.sql.C ...

  4. Tomcat部分知识点小结

    * Tomcat:web服务器软件     1. 下载:http://tomcat.apache.org/    2. 安装:解压压缩包即可. * 注意:安装目录建议不要有中文和空格    3. 卸载 ...

  5. 定期备份和清理gitlab文件

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019-12-05 14:39 # @Author : Anthony # @Emai ...

  6. 100天搞定机器学习|day54 聚类系列:层次聚类原理及案例

    几张GIF理解K-均值聚类原理 k均值聚类数学推导与python实现 前文说了k均值聚类,他是基于中心的聚类方法,通过迭代将样本分到k个类中,使每个样本与其所属类的中心或均值最近. 今天我们看一下无监 ...

  7. PAT(B) 1043 输出PATest(Java)统计

    题目链接:1043 输出PATest (20 point(s)) 题目描述 给定一个长度不超过 10​4​​ 的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest- 这样的 ...

  8. Vue组件全局/局部注册

    全局注册 main.js中创建 Vue.component('button-counter', { data: function () { return { count: 0 } }, templat ...

  9. .NET Core 使用swagger进行分组显示

    其实,和swagger版本管理类似;只是平时接口太多;不好供前端人员进行筛选. 下面进入主题: 首先: //注册Swagger生成器,定义一个和多个Swagger 文档 services.AddSwa ...

  10. Linux下如何挂载文件,并设置开机自动挂载

    首先保证服务端安装了 查看是否安装命令: nfsstat yum install nfs-utils 安装nfs-utils 192.168.50.85(服务端)192.168.50.83(客户端) ...