如何为 CUDA 内核选择网格和块尺寸?

2024-05-13

这是一个关于如何确定CUDA网格、块和线程大小的问题。这是对已发布问题的附加问题here https://stackoverflow.com/a/5643838/1292251.

通过此链接,talonmies 的答案包含一个代码片段(见下文)。我不明白“通常通过调整和硬件限制选择值”的评论。

我在 CUDA 文档中没有找到很好的解释或说明来解释这一点。总而言之,我的问题是如何确定最佳的blocksize(线程数)给出以下代码:

const int n = 128 * 1024;
int blocksize = 512; // value usually chosen by tuning and hardware constraints
int nblocks = n / nthreads; // value determine by block size and total work
madd<<<nblocks,blocksize>>>mAdd(A,B,C,n);

该答案有两个部分(我写的)。一部分很容易量化,另一部分则更具经验性。

硬件限制:

这是容易量化的部分。当前 CUDA 编程指南的附录 F 列出了许多硬限制,这些限制限制了内核启动时每个块可以拥有的线程数。如果超过其中任何一个,您的内核将永远不会运行。它们可以大致概括为:

  1. 每个块总共不能有超过 512/1024 个线程(计算能力 http://www.geeks3d.com/20100606/gpu-computing-nvidia-cuda-compute-capability-comparative-table/分别为 1.x 或 2.x 及更高版本)
  2. 每个块的最大尺寸限制为 [512,512,64]/[1024,1024,64](计算1.x/2.x或更高版本)
  3. 每个块消耗的寄存器总数不能超过 8k/16k/32k/64k/32k/64k/32k/64k/32k/64k (计算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)
  4. 每个块不能消耗超过 16kb/48kb/96kb 的共享内存(计算 1.x/2.x-6.2/7.0)

如果您保持在这些限制范围内,您可以成功编译的任何内核都将启动而不会出现错误。

性能调整:

这是经验部分。您在上述硬件限制内选择的每个块的线程数可以并且确实会影响在硬件上运行的代码的性能。每个代码的行为方式都会有所不同,量化它的唯一真正方法是通过仔细的基准测试和分析。但同样,非常粗略地总结一下:

  1. 每个块的线程数应该是 warp 大小的整数倍,在所有当前硬件上为 32。
  2. GPU 上的每个流式多处理器单元必须具有足够的活动扭曲,以充分隐藏架构的所有不同内存和指令管道延迟并实现最大吞吐量。这里的正统方法是尝试实现最佳硬件占用率(什么罗杰·达尔的回答 https://stackoverflow.com/a/9986071/681865指的是)。

第二点是一个巨大的主题,我怀疑是否有人会尝试在一个 StackOverflow 答案中涵盖它。有人围绕问题各方面的定量分析撰写博士论文(参见这个演示文稿 http://www.nvidia.com/content/gtc-2010/pdfs/2238_gtc2010.pdf作者:瓦西里·沃尔科夫(Vasily Volkov),来自加州大学伯克利分校这张纸 http://www.stuffedcow.net/research/cudabmk作者是多伦多大学的亨利·黄(Henry Wong),举例说明了这个问题到底有多复杂)。

在入门级别,您应该主要意识到您选择的块大小(在上述约束定义的合法块大小范围内)可以并且确实会对代码的运行速度产生影响,但这取决于硬件您拥有以及您正在运行的代码。通过基准测试,您可能会发现大多数重要代码在每块 128-512 个线程范围内都有一个“最佳点”,但您需要进行一些分析才能找到最佳点。好消息是,由于您正在处理扭曲大小的倍数,因此搜索空间非常有限,并且相对容易找到给定代码段的最佳配置。

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

如何为 CUDA 内核选择网格和块尺寸? 的相关文章

  • 方法与管道

    在 Angular 应用程序中的模板插值中使用管道和方法有区别吗 例如 h1 name toLowerCase h1 vs h1 name lowercase h1 就性能而言 是有真正的收获还是只是个人喜好 我知道调用模板中的方法通常会降
  • 系数函数速度慢

    请考虑 Clear x expr Sum x i i 15 30 CoefficientList expr x Timing Coefficient Expand expr x 234 Timing Coefficient expr x 2
  • Python(和 Java)中最快的数据打包

    Sometimes http www codinghorror com blog 2009 01 the sad tragedy of micro optimization theater html our host is wrong na
  • 如何在大空间尺度上加速A*算法?

    From http ccl northwestern edu netlogo models community Astardemo http ccl northwestern edu netlogo models community Ast
  • 如何在GPU支持下运行python代码

    我创建了一个 Flask 服务 用于接受以相机 URL 作为参数的请求 用于在相机框架中查找对象 桌子 椅子等 我已经在 Flask 中编写了用于接受 POST 请求的代码 app route rest detectObjects meth
  • java中高效的输入流到字符串方法

    因此 我在 Java 中的 诚然非常简单 应用程序上运行探查器 令我惊讶的是 仅次于需要在时间上发出 HTTP 请求的方法的是我的方法 inputStreamToString方法 目前它的定义如下 public static String
  • 使用unittest时如何知道每次测试花费的时间?

    Unittest 仅显示运行所有测试所花费的总时间 但不单独显示每个测试所花费的时间 使用unittest时如何添加每个测试的计时 我想 目前不可能 http bugs python org issue4080 http bugs pyth
  • mclapply 用户时间大于已用时间

    我正在尝试使用mclapply的功能parallel封装在R 该函数通过计算对数似然距离将值分配给序列矩阵 这是一个 CPU 密集型操作 所结果的system time价值观令人困惑 gt system time mclapply work
  • 测试 xmm/ymm 寄存器是否为零的更快方法?

    It s fortunate that PTEST does not affect the carry flag but only sets the rather awkward ZF also affects both CF and ZF
  • 字符串文字会被编译器优化吗?

    C 编译器或 NET CLR 是否对字符串文字 常量进行了任何巧妙的内存优化 我可以发誓我听说过 字符串内化 的概念 因此在程序中的任何两位代码中 文字 这是一个字符串 实际上会指代同一个对象 大概是安全的 对于字符串来说是这样的 不可变
  • CUDA NSight 未随 Windows 8 上的 CUDA 5.0 安装文件一起安装? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 据我所知 Nvidia 网站上没有 Nsight Eclipse 的下载链接 它说它将由 CUDA 5 安装本机安装 但并没有随CUDA安装一起安装
  • CSS3 - 性能最佳实践是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何加速我的 Perl 程序?

    这确实是两个问题 但它们非常相似 为了简单起见 我想我应该把它们放在一起 Firstly 给定一个已建立的 Perl 项目 除了简单的代码优化之外 还有哪些不错的方法可以加速它 Secondly 用Perl从头开始编写程序时 有哪些好的方法
  • 有没有办法提高linux管道的性能?

    我正在尝试使用 64 位将超高速数据从一个应用程序传输到另一个应用程序CentOS http en wikipedia org wiki CentOS6 我使用以下方法进行了基准测试dd发现阻碍我的是管道而不是程序中的算法 我的目标是达到
  • C++ OpenCV imdecode 慢

    我将图像的字节数组从 C 发送到 C 库 我使用 OpenCV 版本 3 3 1 解码图像 BMP 图像解码速度很快 但 JPEG 图像解码速度很慢 如何加快 JPEG 图像的解码时间 多线程 GPU 解码性能 Resolution For
  • 如何使用资源模块来衡量函数的运行时间?

    我想使用Python代码测量函数的CPU运行时间和挂钟运行时间 此处建议资源模块 如何以 Python 代码 不是从终端 的形式分别测量函数的 CPU 运行时间和挂钟运行时间 https stackoverflow com q 192046
  • Java中精确的时间测量

    Java 提供了两种获取当前时间的方法 System nanoTime and System currentTimeMillis 第一个给出的结果以纳秒为单位 但实际精度比这要差得多 许多微秒 JVM 是否已经为每台特定机器提供了最佳的价值
  • zk 与 gwt zk 请求太多

    您好 我正在尝试比较 zk 和 gwt 的性能 在我的比较中 如果框架本身将一些代码转换为js 那么我自己无法编写任何javascript 如get 但我无法自己编写js 在以上述方式编写代码时 几乎所有在浏览器上完成的操作都会将请求发送到
  • 如何在 PHP 数组中的另一个已知(通过键或指针)元素之后有效地插入元素?

    给定一个数组 a array abc 123 k1 gt v1 k2 gt v2 78 tt k3 gt v3 当其内部指针指向其元素之一时 如何在当前元素之后插入元素 如何在键已知元素 例如 k1 之后插入元素 表现护理 您可以通过使用拆
  • 国外收藏的查找和排序

    所以我有一个收藏users 并且此集合中的每个文档以及其他属性都有另一个集合中文档的 id 数组 workouts 集合中的每个文档workouts有一个名为date 这就是我想要得到的 对于特定用户 我想要获取属于该用户的锻炼的 work

随机推荐