分支发散、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 的相关文章

  • 无法编译cuda_ndarray.cu:libcublas.so.7.5:无法打开共享对象文件

    我正在尝试在 aws 实例中导入 theano 库以使用 GPU 我已经使用 boto 编写了一个 python 脚本来自动执行 aws 设置 该脚本本质上会从我的本地计算机对实例执行 ssh 然后启动一个 bash 脚本 其中我执行 py
  • 为什么我的 Maven 在 Ubuntu 上这么慢?

    我在 Ubuntu 服务器上有 Maven 它似乎尝试了很多很多的地方来下载 但是下载超时了 但是超时需要很长时间 所以我的整个构建花了一个多小时 Downloading http scala tools org repo releases
  • 为什么我的 Project Euler Problem 12 算法这么慢?

    我已经在 Scala 中为 PE P12 创建了解决方案 但速度非常非常慢 有人可以告诉我为什么吗 如何优化这个 calculateDevisors 简单的方法和calculateNumberOfDivisors 除数函数具有相同的速度 i
  • 是否有更快的方法来检查 LINQ to XML 中的 XML 元素并解析 bool?

    仅供参考 这与我的上一个问题非常相似 是否有更快的方法来检查 LINQ to XML 中的 XML 元素 https stackoverflow com questions 2065665 is there a faster way to
  • 反序列化 XML 文件而不将其全部加载到内存中 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 假设您的应用程序使用 XmlSerializer 序列化对象 当应用程序的另一部分 例如外部服务或另一个组件 处理该 XML 文件时 会返回一个
  • 加快 pandas groupby 中的滚动总和计算

    我想按组计算大量组的滚动总和 但我很难快速地完成它 Pandas 内置了滚动和展开计算器的方法 这是一个例子 import pandas as pd import numpy as np obs per g 20 g 10000 obs g
  • 有什么办法可以让这个 C# 代码更快吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在读取一个大文件 X12 并解析其中的信息 我有两个瓶颈功能 我似乎无法解决 read line 和 get element 有什
  • 处置 StreamResourceInfo.Stream

    I use StreamResourceInfo Stream to get BitmapImage来自资源 是否正确Close and Dispose使用后的流 我问这个问题是因为在内存分析器中 如果这样做我会收到错误 内存分析器表示已处
  • 如何加快编辑距离计算速度

    我正在尝试运行模拟来测试平均值编辑距离 http en wikipedia org wiki Levenshtein distance之间随机 二进制字符串 我的程序是用 python 编写的 但我正在使用这个C扩展 https githu
  • ElasticSearch 匹配多个前缀术语

    我试图为 ElasticSearch 提供一个包含多个术语的查询 然后给出匹配的文档 其中指定的术语位于目标字段中的任何位置 这些术语可以是完整的单词或单词前缀 示例文档 msg 你好 我是一条短信 示例查询字符串 你好消息 你好 和 消息
  • 从 JavaScript 数组中获取对象值的最大值和最小值

    从 JavaScript 对象数组中获取最大值和最小值的最佳方法是什么 Given var a x 1 y 0 x 1 y 10 x 12 y 20 x 61 y 10 var minX Infinity maxX Infinity for
  • MySQL InnoDB 查询性能

    我正在尝试优化一个简单的 sql 查询 该查询将多次运行大量数据 这是场景 MySQL 与 InnoDB 表 where 和 join 中使用的所有字段都已索引 表有 FK 我不需要查询的整个缓存 但每个表的缓存是可能的 表有更多的更新 插
  • 空 while 循环有什么影响?

    我知道这可能是一个有点 愚蠢 的问题 但有时 我只想循环直到条件为假 但我不喜欢让循环保持为空 所以代替 Visible true while IsRunning Visible false 我通常prefer while IsRunnin
  • C# 写入文件的性能

    我的情况概述 我的任务是从文件中读取字符串 并将它们重新格式化为更有用的格式 重新格式化输入后 我必须将其写入输出文件 这是必须完成的操作的示例 文件行示例 ANO 2010 CPF 17834368168 YEARS 2010 2009
  • IEnumerable 作为 DataTable 性能问题

    我有以下扩展 它生成一个DataTable从一个IEnumerable public static DataTable AsDataTable
  • 如何有效地从 DB2 表中删除所有行

    我有一个大约有 50 万行的表 我想删除所有行 如果我做简单的delete from tbl 事务日志已满 我不关心这种情况下的事务 无论如何我都不想回滚 我可以删除许多事务中的行 但是有更好的方法吗 如何有效地从 DB2 中的表中删除所有
  • 只读有运行时开销吗?

    出于某种原因 我一直认为readonly字段有与其相关的开销 我认为这是 CLR 跟踪是否存在readonly字段是否已初始化 这里的开销是一些额外的内存使用量 用于跟踪状态以及分配值时的检查 也许我这么认为是因为我不知道readonly字
  • Java ByteBuffer 性能问题

    在处理多个千兆字节文件时 我注意到一些奇怪的事情 似乎使用文件通道从文件读取到使用 allocateDirect 分配的重用 ByteBuffer 对象比从 MappedByteBuffer 读取要慢得多 事实上它甚至比读取到字节还要慢使用
  • 在 nHibernate 关系中使用实体的 Lite 版本?

    在某些情况下 出于性能原因 创建一个实体的轻量级版本 指向同一个表 但映射的列较少 这是一个好主意吗 例如 如果我有一个包含 50 列的联系人表 并且在一些相关实体中 我可能对 FirstName 和 LastName 属性感兴趣 那么创建
  • 将数据从 GPU 复制到 CPU - CUDA

    我在将数据从 GPU 复制到 CPU 时遇到问题 一开始我在 GPU 空间中创建变量 device float gpu array 在此 GPU 函数中 我想将数据从 od fS gi 值 0 43 复制到 gpu array global

随机推荐

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

    在控制台应用程序上 我当前正在启动一组线程 线程被传递一个对象并在其中运行一个方法 我想知道如何在各个运行线程内的对象上调用方法 调度员不工作 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 这意味着我将格子划分为小的子格子 每个线程都在其中一个子格子上运行 由于我正在进行