在什么类型的循环中最好使用 CUDA 中的 #pragma unroll 指令?

2024-02-18

在 CUDA 中,可以使用以下方法展开循环#pragmaunroll 指令通过增加指令级并行性来提高性能。这#pragma可以选择后跟一个数字,指定必须展开循环的次数。

不幸的是,文档没有给出何时应使用该指令的具体指示。由于编译器已经展开了具有已知行程计数的小循环,因此应该#pragmaunroll 可以用在更大的循环上吗?在带有变量计数器的小循环上?那么可选的展开数量又如何呢?还有关于 cuda 特定循环展开的推荐文档吗?


没有任何快速且硬性的规则。 CUDA 编译器至少有两个展开器,一个位于 NVVM 或 Open64 前端,一个位于 PTXAS 后端。一般来说,他们倾向于非常积极地展开循环,所以我发现自己使用#pragma unroll 1(以防止展开)比任何其他展开属性更频繁。关闭循环展开的原因有两个:

(1) 当循环完全展开时,套准压力可以增加。例如,小型本地存储器数组的索引可能会成为编译时常量,从而允许编译器将本地数据放入寄存器中。完全展开还可能倾向于延长基本块,从而允许更积极地调度纹理和全局加载,这可能需要额外的临时变量并因此需要寄存器。寄存器压力增加可能会因寄存器溢出而导致性能下降。

(2) 部分展开的循环通常需要一定量的预计算和清理用于处理不完全是展开因子倍数的循环计数的代码。对于行程计数较短的循环,此开销可能会淹没从展开循环中获得的任何性能增益,从而导致展开后性能降低。虽然编译器包含用于在这些限制下查找合适循环的启发式方法,但启发式方法并不总是提供最佳决策。

在极少数情况下,我发现手动提供比编译器自动使用的展开因子更高的展开因子对性能有微小的有益影响(通常增益为个位数百分比)。这些通常是内存密集型代码的情况,其中较大的展开因子允许更积极地调度全局或纹理负载,或者非常严格的计算绑定循环,这得益于循环开销的最小化。

使用展开因素应该在优化过程的后期进行,因为编译器默认值涵盖了实践中会遇到的大多数情况。

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

在什么类型的循环中最好使用 CUDA 中的 #pragma unroll 指令? 的相关文章

随机推荐

  • 第一个元素偏移量

    结构的第一个元素的偏移量为 0 是否是保证 为了更准确 让我们考虑一下 struct foo int a double b struct foo ptr malloc sizeof struct foo int int ptr ptr gt
  • 您是否使用 TestInitialize 或测试类构造函数来准备每个测试?为什么?

    这个问题涉及使用 MSTest 在 Visual Studio 中进行单元测试 这很重要 因为 MSTest 的执行顺序 http blogs msdn com nnaderi archive 2007 02 17 explaining e
  • 如何修复轮询时的 Cucumber 期望错误?

    我有帮手sign in登录用户 我正在尝试使用一种新方法来确保用户使用轮询登录 def sign in user password 111111 click button sign in btn eventually 5 page shou
  • 在plsql中编写函数

    我正在查询数据库 需要解析其中一个字段以获取特定值 使用字符串函数 所以我认为最好为其编写一个函数 我以前从未在 plsql 中编写过函数 所以我决定看一些示例 我得到了一个简单的 square 函数的副本 它接受一个数字并返回它的平方 但
  • 通过 DBRef 数组查找文档

    解决方案可能就在我面前 但我还没有找到它 我的问题是我需要查找包含指定 DBRef 的所有文档 这是要搜索的集合的结构 id ObjectId 4e2d4892580fd602eb000003 date added ISODate 2011
  • Ruby 有哪些 Python 没有的功能,反之亦然?

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 关于 Python 与 Ruby 的讨论有很多 我都发现它们完全没有帮助 因为它们都围绕着为什
  • 如何使用 Django / Python 从 RESTful Web 服务中使用 XML?

    我应该使用 PyXML 还是标准库中的内容 ElementTree 作为标准 Python 库的一部分提供 ElementTree 是纯 python 而 cElementTree 是更快的 C 实现 Try to use the C im
  • 如何在 WiX 片段中获得编辑注册表 CLSID 的提升权限

    我正在尝试将 Windows 桌面搜索设置为使用系统默认过滤器 nlhtml dll 之外的不同 html 过滤器 当我查找 PersistentHandler 时 HKEY LOCAL MACHINE SOFTWARE Classes h
  • ASP.NET Core MVC 视图组件

    在 ASP NET Core MVC 以前称为 MVC 6 中 有一个称为视图组件的新功能区域 它似乎是部分视图的更好替代方案 我看过以下内容查看组件示例 http www asp net vnext overview aspnet vne
  • 在 AppDelegate 之外使用 NIB 创建 UITabBarController?

    对于 iOS 编程来说 我还是个新手 尽管进行了大量的研究 但我还是遇到了另一个障碍 我想要实现的 我想要一个当我从主 UI 导航时加载的 UITabBarController 我还想使用 NIB 来定义其属性 我能找到的所有示例都将 UI
  • Gstreamer视频输出位置跟踪和寻找

    我正在使用 gstreamer gst launch 捕获相机并将流保存为视频和图像帧 管道的问题是 当管道完成 通过中断 视频记录时 它不能支持位置跟踪和查找 因此 视频在 vlc 播放器中播放 长度未知 我认为问题出在管道本身 如何实现
  • 支持内容脚本中的所有 google 域

    我正在制作一个内容脚本 对谷歌结果网页执行某些操作 下面的行在manifest json无效 匹配 https www google 由于清单 json 中的上述行而导致的错误是 content scripts 0 matches 0 的值
  • 在EJB环境中是否有一些行为类似于.wait()和.notify()的东西?

    我知道我不能修改 EJB 容器中的线程 因此我不知道如何在 EJB 环境中以正确的方式执行以下操作 涉及的有 无状态会话 Bean 客户端 无状态会话 Bean 服务器 消息队列 队列 消息驱动 Bean Mdb 处理来自 队列 的消息 n
  • 如何将资源编译到我的应用程序中并访问它们?

    我怎样才能制作一个executable包含 DLL 和图像资源文件的软件包 那么如何在运行时从可执行文件中提取它们呢 使用 IDE 的选项 1 Delphi 2007 或更高版本 您可以单击 项目 菜单 然后选择 资源 您可以将任何文件加载
  • CodeMirror - 从编辑器外部获取 linting 结果

    我正在使用非常棒的 CodeMirror 库 我正在实例化的代码编辑器是表单的一部分 因此我想使用 linting 进行基本检查 以查看用户的输入是否有效 除非代码没问题 否则我不想处理表单 所以问题是 CodeMirror 编辑器实例上是
  • GLKit 和向纹理添加色调

    我在使用 GLKit 对 PNG 图像着色时遇到问题 我有一个白色的 PNG 图像 我将其加载到应用程序中 然后用它来创建纹理 UIImage image UIImage imageNamed brushImage NSError erro
  • 角度错误:StaticInjectorError(平台:核心)[e -> t]:

    当我构建APK时 prod我收到以下错误 ERROR Error StaticInjectorError e gt t StaticInjectorError Platform core e gt t NullInjectorError N
  • 有没有办法限制 javascript 性能来模拟缓慢的客户端

    我正在开发一个使用 jQuery 的网站 并且有大量使用 javascript 运行的网站 document ready 在我的开发机器上 一切运行良好 但它是一台非常强大的机器 我收到过一些使用旧硬件的人的报告 这些硬件的行为看起来很奇怪
  • 包装类的声明[重复]

    这个问题在这里已经有答案了 这个问题是一个问题的延续如何使用 来初始化字符串 https stackoverflow com questions 17489250 how can a string be initialized using
  • 在什么类型的循环中最好使用 CUDA 中的 #pragma unroll 指令?

    在 CUDA 中 可以使用以下方法展开循环 pragmaunroll 指令通过增加指令级并行性来提高性能 这 pragma可以选择后跟一个数字 指定必须展开循环的次数 不幸的是 文档没有给出何时应使用该指令的具体指示 由于编译器已经展开了具