分支发散、CUDA 和 Kinetic Monte Carlo

2024-01-25

因此,我有一个在晶格上使用动力学蒙特卡罗的代码来模拟某些东西。我正在使用 CUDA 在我的 GPU 上运行此代码(尽管我相信同样的问题也适用于 OpenCl)。

这意味着我将格子划分为小的子格子,每个线程都在其中一个子格子上运行。由于我正在进行 KMC,每个线程都有以下代码:

   While(condition == true){
     *Grab a sample u from U[0,1]*
      for(i = 0; i < 100;i++){
         *Do some stuff here to generate A*
          if(A > u){
              *Do more stuff here, which could include updates to global memory*
               break();
           }
      }
   }

A 对于不同的线程是不同的,u 也是不同的,100 只是一个随机数。在代码中,这可能是 1000 甚至 10000。

那么,当线程通过该 if 时,我们不会出现分支分歧吗?这会对性能产生多严重的影响?我知道答案取决于 if 子句中的代码,但是当我添加越来越多的线程时,这个问题将如何扩展?

任何关于我如何估计绩效损失/收益的参考也将受到欢迎。

Thanks!


GPU 以 32 个线程为一组运行线程,称为扭曲。发散只能发生在扭曲内。因此,如果您能够以这样的方式安排线程if条件在整个扭曲中以相同的方式评估,没有分歧。

当一个问题出现分歧时if,从概念上讲,GPU 只是忽略来自线程的结果和内存请求。if条件是假的。

那么,说if评估为true对于特定经纱中的 10 根纱线。当里面if,warp 的潜在计算性能从 100% 降低到 10 / 32 * 100 = 31%,因为 22 个线程被禁用if本来可以做工作,但现在只是在亚空间中占据空间。

一旦退出if,禁用的线程再次启用,并且扭曲以 100% 的潜在计算性能继续进行。

An if-else行为方式大致相同。当扭曲达到else,启用的线程if变为禁用,并且禁用的变为启用。

In a for对于 warp 中的每个线程循环不同次数的循环,当线程的迭代计数达到设定数量时,线程将被禁用,但整个 warp 必须保持循环,直到具有最高迭代计数的线程完成。

当考虑潜在的内存吞吐量时,事情有点复杂。如果算法受内存限制,则可能不会因扭曲发散而导致太多或任何性能损失,因为内存事务的数量可能会减少。如果 warp 中的每个线程都从全局内存中完全不同的位置读取(对于 GPU 来说这是一个糟糕的情况),则每个禁用线程都可以节省时间,因为不必执行它们的内存事务。另一方面,如果线程正在读取已针对 GPU 访问进行优化的数组,则多个线程将共享单个事务的结果。在这种情况下,将从内存中读取用于禁用线程的值,然后与禁用线程可能完成的计算一起丢弃。

因此,现在您可能已经有了足够的了解,能够对扭曲发散将影响您的性能的程度做出很好的判断。最坏的情况是扭曲中只有一个线程处于活动状态。那么您将获得 1/32 = 3.125% 的计算限制性能潜力。最好的情况是 31/32 = 96.875%。为if这是完全随机的,你得到 50%。如前所述,内存限制性能取决于所需内存事务数量的变化。

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

分支发散、CUDA 和 Kinetic Monte Carlo 的相关文章

  • 带有闭包的 JavaScript 性能

    var name function n var digits one two three four return digits n var namenew function digits one two three four return
  • 优化 CSS 交付 - Google 的建议

    谷歌建议在 head 中使用非常重要的 CSS 内联 并在内部使用其他 CSS
  • 为什么 System.nanoTime() 比 System.currentTimeMillis() 慢(性能)?

    今天我做了一个快速基准测试来测试速度性能System nanoTime and System currentTimeMillis long startTime System nanoTime for int i 0 i lt 1000000
  • 循环内的局部变量会被垃圾收集吗?

    我想知道将循环内引用的任何变量放在循环外是否更有效 或者它们可以像函数内的变量一样被垃圾收集吗 var obj key val for var i 0 i lt 10 i console log obj or for var i 0 i l
  • 优化数据可视化 Web 应用程序的性能

    我正在重写 3 年前编写的数据可视化网络工具 从那时起 浏览器的 JavaScript 引擎变得更快 所以我正在考虑将部分工作从服务器转移到客户端 在页面上 数据在表格和地图 或图表 中可视化 它使用相同的数据 但以不同的方式 因此准备显示
  • VS 程序在调试模式下崩溃,但在发布模式下不崩溃?

    我正在 VS 2012 中运行以下程序来尝试 Thrust 函数查找 include cuda runtime h include device launch parameters h include
  • 页面上首次调用 Url.Action 速度很慢

    我有一个相当简单的 ASP MVC 视图的性能问题 这是一个登录页面 应该几乎是即时的 但需要大约半秒钟 经过大量挖掘后 问题似乎出在第一个调用上Url Action 大约需要 450 毫秒 根据迷你分析器 http miniprofile
  • 降低Python中的浮点精度以提高性能[重复]

    这个问题在这里已经有答案了 我正在树莓派上使用 python 我使用互补滤波器从陀螺仪中获得更好的值 但它消耗了太多树莓派的电量 大约为 70 我认为可以通过降低浮点精度来提高性能 现在 结果大约有 12 位小数 这超出了我的需要 有什么办
  • Android 性能:SharedPreferences 的成本

    当我的应用程序启动时 我使用分片首选项中的值填充容器类 这个想法是处理 SharedPreferences 和 PreferenceManager 一次 因为我猜它们很重 这是一个示例 SharedPreferences prefs Pre
  • 为什么 Web Worker 性能在 30 秒后急剧下降?

    我正在尝试提高在网络工作人员中执行时脚本的性能 它旨在解析浏览器中的大型文本文件而不会崩溃 一切都运行得很好 但我注意到使用网络工作者时大文件的性能存在严重差异 于是我做了一个简单的实验 我在同一输入上运行脚本两次 第一次运行在页面的主线程
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • * 到底有多慢?

    大家都表示 选择器非常慢 但它到底有多慢呢 我总是试图避免它 但有时它非常有用 例如 h1 margin top 1em 简单来说 通用选择器 速度只与页面上的元素一样慢 Since 从右到左匹配浏览器获取每个元素并将其与所有候选规则进行匹
  • 为什么n++执行速度比n=n+1快?

    在C语言中 为什么n 执行速度快于n n 1 int n n int n n n 1 我们的老师在今天的课堂上问了这个问题 这不是家庭作业 如果您正在开发一个 石器时代 编译器 的情况下 石器时代 n比n 比n n 1 机器通常有incre
  • 为什么列表理解在数组相乘方面比 numpy 快得多?

    最近我回答了THIS https stackoverflow com questions 31596979 multiplication between 2 lists 31597029 31597029想要两个列表相乘的问题 一些用户建议
  • 模块化算术和 NTT(有限域 DFT)优化

    我想使用 NTT 进行快速平方 参见快速大数平方计算 https stackoverflow com q 18465326 2521214 但即使对于非常大的数字 结果也很慢 超过 12000 位 所以我的问题是 有没有办法优化我的 NTT
  • “gld/st_throughput”和“dram_read/write_throughput”指标之间有什么区别?

    在 CUDA 可视化分析器版本 5 中 我知道 gld st requested throughput 是应用程序请求的内存吞吐量 然而 当我试图找到硬件的实际吞吐量时 我很困惑 因为有两对似乎合格的指标 它们是 gld st throug
  • 为什么 Collections.counter 这么慢?

    我正在尝试解决罗莎琳德的基本问题 即计算给定序列中的核苷酸 并在列表中返回结果 对于那些不熟悉生物信息学的人来说 它只是计算字符串中 4 个不同字符 A C G T 出现的次数 我期望collections Counter是最快的方法 首先
  • 针对约 225 万行的单表选择查询的优化技术?

    我有一个在 InnoDB 引擎上运行的 MySQL 表 名为squares大约有 2 250 000 行 表结构如下 squares square id int 7 unsigned NOT NULL ref coord lat doubl
  • 正则表达式库基准

    我最近一直想知道正则表达式实现的性能 并且很难想出很多有用的信息 它很容易对浏览器 javascript 正则表达式性能进行基准测试 网上有很多工具 Chrome 和 Opera 中的 javascript 正则表达式实现几乎摧毁了所有其他
  • R 数据结构的运算效率

    我想知道是否有任何关于操作效率的文档R 特别是那些与数据操作相关的 例如 我认为向数据框添加列是有效的 因为我猜您只是向链接列表添加一个元素 我想添加行会更慢 因为向量保存在数组中C level你必须分配一个新的长度数组n 1并将所有元素复

随机推荐

  • 如何在正在运行的线程上调用方法?

    在控制台应用程序上 我当前正在启动一组线程 线程被传递一个对象并在其中运行一个方法 我想知道如何在各个运行线程内的对象上调用方法 调度员不工作 SynchronizationContext Send 在调用线程上运行 Post 使用新线程
  • 如何从两个列表中删除一个列表中的目录?

    我正在编写一个 c shell 脚本 其中我正在两个字符串中 grep 两个不同的目录 我想删除相同目录的名称 我只想要两个目录中唯一的目录 而忽略重复的目录 我对如何做到这一点有点困惑 sta views 和 pnr views 字符串中
  • Git 推送到错误的存储库 - 需要将我的本地存储库重命名为我远程创建的存储库

    我对 git 还比较陌生 我想我已经把自己逼到了墙角 为了测试一些功能 我在本地复制并粘贴了一个存储库目录 我知道 绝对错误的做法 我没有想到 从那时起 我一直在工作并创建分支机构 我希望保持这种进步 当然 当我尝试设置一个新的存储库并推送
  • 如何将基板模块中的块号转换为整数类型?

    我正在测试Substrate Off chain Worker 我想做的是接收当前的块号 然后进行一些计算 就像下面的代码if get block 10 0 我得到一些错误 如何将块号转换为Integer类型 my code use fra
  • SSIS 问题无法解密受保护的 XML 节点

    我创建了一个 SSIS 包 它从 ftp 服务器中提取文件并将其保存到我的本地驱动器 但我遇到了这个问题 有了同样的错误消息 我只收到警告 但今天作业失败了 Message 以用户身份执行 cam Package Runner 适用于 64
  • 使用 Google 本机客户端 (NaCl) 的并行端口访问

    我正在尝试写一个Chrome应用程序 https developer chrome com apps about apps这将支持通过连接到计算机的旧打印机进行打印并口 http en wikipedia org wiki Parallel
  • android 进入电影院时如何通知用户?

    在我的 Android 应用程序中 我有地图视图和当前位置 现在显示最近的剧院 我想在用户进入剧院 如地理围栏 时通知用户 我在 NET 上搜索并没有找到任何支持地理围栏的 Android api 请帮助如何做到这一点 注意 我尝试过htt
  • 导入 .svg 并调整 .svg 大小在 next.js 中使用样式组件

    我目前正在尝试将 svg 导入 next js 项目 但失败了 我尝试以与 React 项目相同的方式导入 svg 创建了typing d ts 并导入 svg 之类的组件 但这不起作用 declare module svg import
  • !IsPostBack 上的隐藏字段为 null,IsPostBack 上的隐藏字段不为 null

    首先 我对我的问题标题不明确表示歉意 我不确定如何在标题中简洁地描述我的问题 我的 aspx 中有一个隐藏字段
  • 将数字拆分为四舍五入的数字

    是否有一个库可以将一个数字分成多个部分 但确保所有部分都是四舍五入的数字 例如 将 100 分成 3 将是33 33 但我希望对其进行四舍五入并确保总和也保持为 100 34 33 33 您可以使用内置函数divmod https docs
  • 如何在 WordPress 中集成 Razorpay 支付网关

    我计划将 Razorpay 支付网关集成到我的客户网站中 该网站是用 WordPress 开发的 其中场景如下 用户将根据他的要求填写查询表 然后根据客户的要求 业主将回复费用和一些代码给客户 通过手机 电子邮件通信 客户将进入网站的支付页
  • 如何正确格式化 python 日志格式化程序?

    我尝试按照 Python 日志格式化程序输出字符串的方式进行格式化 我写了一个简单的例子来说明这个问题 import logging from pathlib import Path create auxiliary variables l
  • 如何使 Install-Module 也安装任何所需的模块?

    我正在开发一个 PS 模块 它依赖于 SqlServer 这是模块清单文件 ModuleVersion 1 0 19103 11 GUID 59bc8fa6 b480 4226 9bcc ec243102f3cc Author Compan
  • 使用 purrr 递归处理任意层次结构

    假设我想根据某些特定标准修剪由 R 中的嵌套列表层次结构组成的树 我可以使用 轻松 地做到这一点lapply Based an example from the NetworkD3 documentation https christoph
  • 使用 Requests 库通过 Python 3.7 发出异步请求

    我需要做异步请求 http docs python requests org en v0 10 6 user advanced asynchronous requests使用请求库 在 Python 3 7 中如果我尝试from reque
  • 如何在 Swift 中检查位字段(特别是 SCNetworkReachabilityFlags)中的标志?

    我有一个SCNetworkReachabilityFlags变量并想要检查它的特定值 例如如果网络可通过 WWAN 访问 The SCNetworkReachabilityFlags类型是一个typealias for UInt32各种选项
  • WooCommerce REST API 按 ID 获取多个产品

    我需要按列表中的每个产品显示所有相关产品 例如 在我的应用程序中 我有 3 个产品 id 为 1 2 3 产品 ID 1 具有相关的 5 6 7 产品 ID 2 具有相关的 8 和 9 等 现在我有一个包含所有相关的数组 5 6 7 8 9
  • 可移植类库的实体框架

    当我尝试使用 Nuget EntityFramework 时 我正在尝试为可移植类库创建存储库 实体框架 无法添加对 System ComponentModel DataAnnotations 的引用 请确保它位于全局程序集缓存中 有什么想
  • C++ 中的构造函数和析构函数是如何实现的?

    我有 2 个类 Base 和 Derived 从 Base 公开派生 当我写下 Derived d1 new Derived delete d1 编译器认为 d1 是 Derived 类型对象 因此它调用派生类构造函数 派生类构造函数调用基
  • 分支发散、CUDA 和 Kinetic Monte Carlo

    因此 我有一个在晶格上使用动力学蒙特卡罗的代码来模拟某些东西 我正在使用 CUDA 在我的 GPU 上运行此代码 尽管我相信同样的问题也适用于 OpenCl 这意味着我将格子划分为小的子格子 每个线程都在其中一个子格子上运行 由于我正在进行