warp 如何与原子操作一起工作?

2024-03-16

warp 中的线程在物理上并行运行,因此如果其中一个(称为线程 X)启动原子操作,其他线程会做什么?等待?这是否意味着,当线程 X 被推入原子队列时,所有线程都将等待,获得访问权限(互斥体)并对受该互斥体保护的内存执行一些操作,然后再释放互斥体?

有没有办法让其他线程执行某些工作,例如读取一些内存,以便原子操作将隐藏其延迟?我的意思是,15 个空闲线程……我猜这不太好。 Atomic 真的很慢,是吗?我怎样才能加速它?有什么模式可以使用吗?

共享内存的原子操作是否会锁定一个存储体或整个内存? 例如(没有互斥体),有__shared__ float smem[256];

  • 线程1运行atomicAdd(smem, 1);
  • 线程2运行atomicAdd(smem + 1, 1);

这些线程与不同的存储体一起工作,但通常共享内存。它们是并行运行还是会排队?如果 Thread1 和 Thread2 来自单独的线程束或通用线程束,则此示例有什么区别吗?


我数了一下大概有10个问题。这使得回答变得相当困难。建议您每个问题问一个问题。

一般来说,warp 中的所有线程都执行相同的指令流。那么我们可以考虑两种情况:

  1. 没有条件(例如 if...then...else)在这种情况下,所有线程都执行相同的指令,这恰好是原子指令。然后所有 32 个线程都将执行一个原子操作,尽管不一定在同一位置。所有这些原子都将由 SM 处理,并在某种程度上将序列化(如果它们更新相同的位置,它们将完全序列化)。
  2. 带条件句例如,假设我们有if (!threadIdx.x) AtomicAdd(*data, 1);然后线程 0 将执行原子操作,并且 其他人则不会。看起来我们可以让其他人去做 其他的东西,但是锁步扭曲执行不允许这样做。 Warp 执行被序列化,使得所有线程都采用if (true)path 将一起执行,并且所有执行该路径的线程if (false)path 会一起执行,但是 true 和 false 路径将被序列化。再说一次,我们真的不能有不同的 warp 中的线程执行不同的指令同时地.

其本质是,在扭曲中,我们不能让一个线程执行原子操作,而其他线程同时执行其他操作。

您的许多其他问题似乎期望内存事务在它们起源的指令周期结束时完成。事实并非如此。对于全局内存和共享内存,我们必须在代码中采取特殊步骤,以确保以前的写入事务对其他线程可见(这可以被认为是事务完成的证据)。实现此目的的一种典型方法是使用屏障指令,例如__syncthreads() or __threadfence()但如果没有这些屏障指令,线程就不会“等待”写入完成。读取(依赖于读取的操作)可能会停止线程。写入通常不能阻止线程。

现在我们来看看您的问题:

那么如果其中一个启动原子操作,其他会做什么呢?等待?

不,他们不会等待。原子操作被分派到 SM 上处理原子的功能单元,并且所有线程一起继续同步进行。由于原子通常意味着读取,是的,读取可以使扭曲停止。但线程不会等到原子操作完成(即写入)。然而,随后读取该位置could再次停止扭曲,等待原子(写入)完成。在保证更新全局内存的全局原子的情况下,如果原始 SM 中的 L1(如果启用)和 L2 包含该位置作为条目,它将使它们无效。

有没有办法让其他线程执行某些工作,例如读取一些内存,以便原子操作将隐藏其延迟?

事实并非如此,原因就如我在开头所说的那样。

Atomic 真的很慢,是吗?我怎样才能加速它?有什么模式可以使用吗?

是的,如果原子主导了活动(例如朴素的归约或朴素的直方图),原子可以使程序运行得更慢。一般来说,加速原子操作的方法是不使用它们,或者谨慎地使用它们,以这样的方式:不主导程序活动。例如,简单的归约将使用原子将每个元素添加到全局总和中。智能并行缩减将根本不使用原子来完成线程块中完成的工作。在线程块缩减结束时,可以使用单个原子将线程块部分和更新为全局和。这意味着我可以快速并行减少任意数量的元素,可能需要 32 个原子添加或更少。这种对原子的节约使用在整个程序执行中基本上不会被注意到,除了它使得并行减少能够在单个内核调用而不是 2 个内核调用中完成。

共享内存:它们是并行运行还是排队?

他们将排队。其原因是,可以在共享内存上处理原子操作的功能单元数量有限,不足以在单个周期内服务于 warp 的所有请求。

我避免尝试回答与原子操作的吞吐量相关的问题,因为据我所知,这些数据在文档中没有得到很好的指定。如果您发出足够多的同步或接近同步的原子操作,则由于为原子功能单元提供数据的队列已满,某些扭曲可能会在原子指令上停滞。我不知道这是真的,也无法回答相关问题。

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

warp 如何与原子操作一起工作? 的相关文章

  • 在 C/C++ 中获得正模数的最快方法

    通常在我的内部循环中 我需要以 环绕 方式索引数组 因此 例如 如果数组大小为 100 并且我的代码要求元素 2 则应该给它元素 98 高级语言 例如 Python 可以简单地使用my array index array size 但由于某
  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • 为什么这个没有特殊字符的正则表达式会匹配更长的字符串?

    我正在使用此方法来尝试查找匹配项 例如 Regex Match A2 TS OIL TS OIL RegexOptions IgnoreCase Success 我得到了真实的结果 我很困惑 我认为这应该返回 false 因为模式中没有特殊
  • ASP.Net Core 内容配置附件/内联

    我正在从 WebAPI 控制器返回一个文件 Content Disposition 标头值自动设置为 附件 例如 处置 附件 文件名 30956 pdf 文件名 UTF 8 30956 pdf 当它设置为附件时 浏览器将要求保存文件而不是打
  • 从 WebBrowser 控件 C# 获取滚动值

    我试图在 WebBrowser 控件中获取网页的 Y 滚动索引 但无法访问内置滚动条的值 有任何想法吗 对于标准模式下的 IE 使用文档类型 正如你所说 scrollTop是的财产元素 而不是 HtmlDocument htmlDoc th
  • std::forward_as_tuple 将参数传递给 2 个构造函数

    我想传递多个参数以便在函数内构造两个对象 以同样的方式std pair
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • AES 输出是否小于输入?

    我想加密一个字符串并将其嵌入到 URL 中 因此我想确保加密的输出不大于输入 AES 是可行的方法吗 不可能创建任何始终会创建比输入更小的输出的算法 但可以将任何输出反转回输入 如果您允许 不大于输入 那么基本上您只是在谈论同构算法alwa
  • 无法在内存位置找到异常源:cudaError_enum

    我正在尝试确定 Microsoft C 异常的来源 test fft exe 中 0x770ab9bc 处的第一次机会异常 Microsoft C 异常 内存位置 0x016cf234 处的 cudaError enum 我的构建环境是 I
  • 运行选定的代码生成器时出错:“未将对象引用设置到对象的实例。”错误?

    我已经尝试了所有解决方案 例如修复 VS 2013 但没有用 当您通过右键单击控制器文件夹来创建控制器并添加控制器时 然后右键单击新创建的控制器的操作并选择添加视图 当我尝试创建视图时 就会发生这种情况 它不是一个新项目 而是一个现有项目
  • 如何通过 JsonConvert.DeserializeObject 在动态 JSON 中使用 null 条件运算符

    我正在使用 Newtonsoft 反序列化已知的 JSON 对象并从中检索一些值 如果存在 关键在于对象结构可能会不断变化 因此我使用动态来遍历结构并检索值 由于对象结构不断变化 我使用 null 条件运算符来遍历 JSON 代码看起来像这
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 使用restsharp序列化对象并将其传递给WebApi而不是序列化列表

    我有一个看起来像的视图模型 public class StoreItemViewModel public Guid ItemId get set public List
  • 新任务中使用的依赖注入服务

    我在需要时使用依赖项注入来访问我的服务 但我现在想要创建一个并发任务 但这会由于依赖项注入对象及其生命周期而导致问题 我读过这篇文章 标题 防止多线程 Link http mehdi me ambient dbcontext in ef6
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐