如何减少 CUDA 同步延迟/延迟

2024-01-25

这个问题与使用cuda流运行多个内核有关

CUDA中有很多同步命令 cudaStream同步, Cuda设备同步, cuda线程同步, 还有 cudaStreamQuery 来检查流是否为空。

我注意到在使用探查器时,这些同步命令会给程序带来很大的延迟。我想知道是否有人知道减少这种延迟的任何方法,当然除了使用尽可能少的同步命令之外。

还有有没有数字来判断最有效的同步方法。考虑在一个应用程序中使用 3 个流,其中两个需要完成才能启动第四个流,我应该使用 2 个 cudaStreamSync 还是仅使用一个 cudaDeviceSync,什么会产生更少的损失?


同步方法之间的主要区别是“轮询”和“阻塞”。

“轮询”是驱动程序等待 GPU 的默认机制 - 它等待 32 位内存位置以获得 GPU 写入的某个值。在等待解决后,它可能会更快地返回等待,但在等待时,它会消耗查看该内存位置的 CPU 核心。

可以通过致电请求“阻止”cudaSetDeviceFlags() with cudaDeviceScheduleBlockingSync,或致电cudaEventCreate() with cudaEventBlockingSync。阻塞等待会导致驱动程序将命令插入 DMA 命令缓冲区,当缓冲区中所有前面的命令都已执行时,该命令会发出中断信号。然后,驱动程序可以将中断映射到 Windows 事件或 Linux 文件句柄,从而使同步命令能够等待,而不会像默认轮询方法那样不断消耗 CPU。

查询基本上是对用于轮询等待的 32 位内存位置的手动检查;所以在大多数情况下,它们非常便宜。但如果启用了 ECC,查询将进入内核模式以检查是否存在任何 ECC 错误;在 Windows 上,任何待处理的命令都将刷新到驱动程序(这需要内核 thunk)。

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

如何减少 CUDA 同步延迟/延迟 的相关文章

  • __syncthreads() 死锁

    如果只有部分线程执行 syncthreads 会导致死锁吗 我有一个这样的内核 global void Kernel int N int a if threadIdx x
  • SQL Server 2008:在没有任何锁的情况下出现死锁

    我目前正在 SQL Server 2008 数据库上进行一些实验 更具体地说 我有一个 JDBC 应用程序 它使用数百个并发线程来执行数千个任务 每个任务都在数据库上运行以下查询 UPDATE from Table A where rowI
  • 串流期货列表的最有效方式

    我通过流式传输对象列表来调用异步客户端方法 该方法返回 Future 迭代调用后返回的 Future 列表的最佳方法是什么 以便处理先出现的 Future 注意 异步客户端仅返回 Future 而不返回 CompletableFuture
  • 易失性限定符是否会取消该内存的缓存?

    在本文中 http www drdobbs com parallel 易失性 vs 易失性 212701484 pgno 2 http www drdobbs com parallel volatile vs volatile 212701
  • Python中的键盘可中断阻塞队列

    It seems import Queue Queue Queue get timeout 10 键盘可中断 ctrl c 而 import Queue Queue Queue get 不是 我总是可以创建一个循环 import Queue
  • CUDA 矩阵加法时序,按行与按行比较按栏目

    我目前正在学习 CUDA 并正在做一些练习 其中之一是实现以 3 种不同方式添加矩阵的内核 每个元素 1 个线程 每行 1 个线程和每列 1 个线程 矩阵是方阵 并被实现为一维向量 我只需用以下命令对其进行索引 A N row col 直觉
  • TensorRT 多线程

    我正在尝试使用 python API 来使用 TensorRt 我试图在多个线程中使用它 其中 Cuda 上下文与所有线程一起使用 在单个线程中一切正常 我使用 docker 和 tensorrt 20 06 py3 图像 onnx 模型和
  • 使用 Golang 通道处理 HTTP 请求

    我正在尝试构建一个简单的 Golang Appengine 应用程序 它使用通道来处理每个 http 请求 原因是我希望每个请求执行合理的大型内存计算 并且每个请求都以线程安全的方式执行 即来自并发请求的计算不会混合 这一点很重要 本质上
  • Intel 64 和 IA-32 上的 MESI 有何意义

    MESI 的要点是保留共享内存系统的概念 然而 对于存储缓冲区 事情就变得复杂了 一旦数据到达 MESI 实现的缓存 下游内存就会保持一致 然而 在此之前 每个核心可能对内存位置 X 中的内容存在分歧 具体取决于每个核心的本地存储缓冲区中的
  • CUDA - 将 CPU 变量传输到 GPU __constant__ 变量

    与 CUDA 的任何事情一样 最基本的事情有时也是最难的 所以 我只想将变量从 CPU 复制到 GPUconstant变量 我很难过 这就是我所拥有的 constant int contadorlinhasx d int main int
  • 在 Swift async/await 中,我可以使用 Lock 还是 Semaphore

    这不是问题 这是一个想寻求帮助以及专业指导的问题 根据文档 Sendable 类型可以在 Swift Concurrency 中安全地传递 在旧项目中并非所有类型都是可发送的 并且可能使用Cocoa类型 但它们是线程安全的 例如 class
  • 并发:C++11 内存模型中的原子性和易失性

    全局变量在 2 个不同内核上的 2 个并发运行的线程之间共享 线程对变量进行写入和读取 对于原子变量 一个线程可以读取过时的值吗 每个核心可能在其缓存中具有共享变量的值 并且当一个线程写入缓存中的其副本时 不同核心上的另一个线程可能会从其自
  • Java 执行器和长寿命线程

    我继承了一些使用 Executors newFixedThreadPool 4 的代码运行 4 个长寿命线程来完成应用程序的所有工作 这是推荐的吗 我读过Java 并发实践 https rads stackoverflow com amzn
  • Java 8:并行 FOR 循环

    我听说 Java 8 提供了很多关于并发计算的实用程序 因此我想知道并行给定 for 循环的最简单方法是什么 public static void main String args Set
  • Laravel - 停止并发访问记录

    在 Laravel 中 有什么方法可以停止同时与同一条记录交互 例如 如果用户 A 正在编辑一条记录 那么我同时需要阻止用户 B 编辑同一条记录 注意 我在 Laravel 5 2 中使用 SESSION DRIVER file 目前大约有
  • 如何使信号量超时

    Go 中的信号量是通过通道来实现的 一个例子是这样的 https sites google com site gopatterns concurrency semaphores https sites google com site gop
  • Meteor.setTimeout 和 Meteor.methods 之间的并发

    在我的 Meteor 应用程序中实现回合制多人游戏服务器 客户端通过发布 订阅接收游戏状态 并且可以调用 Meteor 方法sendTurn将回合数据发送到服务器 他们无法直接更新游戏状态集合 var endRound function g
  • 将 nvidia 运行时添加到 docker 运行时

    我正在运行虚拟机GCP配备特斯拉 GPU 并尝试部署一个PyTorch基于应用程序使用 GPU 加速 我想让 docker 使用这个 GPU 可以从容器访问它 我设法在主机上安装了所有驱动程序 并且该应用程序在那里运行良好 但是当我尝试在
  • 在 Java EE 中手动启动新线程安全吗?

    对于在会话范围内的 JSF 托管 bean 中生成线程是否安全 我找不到明确的答案 线程需要调用无状态 EJB 实例 依赖注入到托管 bean 上的方法 背景是我们有一份需要很长时间才能生成的报告 由于我们无法更改服务器设置 这导致 HTT
  • 最小化 MC 模拟期间存储的 cuRAND 状态数量

    我目前正在 CUDA 中编写蒙特卡罗模拟 因此 我需要生成lots使用随机数cuRAND图书馆 每个线程处理一个巨大的元素floatarray 示例中省略 并在每次内核调用时生成 1 或 2 个随机数 通常的方法 参见下面的示例 似乎是为每

随机推荐

  • XmlAttribute/XmlText 不能用于编码复杂类型

    我在下面的类中收到以下错误 无法序列化 DataObjects Ingredient 类型的成员 Ingredient XmlAttribute XmlText 不能用于对复杂类型进行编码 有什么想法吗 DataContract Seria
  • Exchange Web 服务创建会议请求工作示例

    是否有关于如何使用 C 使用 EWS for Exchange 2007 创建会议请求的工作示例 需要哪些属性 我添加了一个 Web 服务引用 并且可以连接以创建和发送各种项目 但不断收到错误 设置操作对属性无效 关于响应消息 它从来没有说
  • 在 Visual Studio 2008 中更改字体大小和样式

    Visual Studio 2008 中更改字体大小和字体类型的设置在哪里 使用菜单Tools gt Options gt 内部环境 gt 字体和颜色
  • iFrame:如何使用 javascript 将服务器响应(HTML)直接显示到 iFrame 中?

    我收到一个简单的服务器响应 它是一个 html 文件 我想在 iFrame 中显示相同的内容 而不将该文件保存到我的工作区或计算机中 我正在进行 ajax 调用 如下所示 Ext Ajax request url url method PO
  • 字符识别(OCR算法)[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在开发一个项目 其中我必须开发 OCR 算法 我必须从图像中读取文本 然后将其转换为不同的语言 所以我的第一个任务是从图像中获取文
  • Android编程打开DataUsage设置页面

    在 Android 5 0 中 移动数据设置可在数据使用设置中使用 我想在android中打开数据使用设置页面 但我没有找到任何打开它的意图 为什么要打开数据使用设置页面 你尝试过这种方法吗 final Intent intent new
  • MIN 和 MAX 宏的 Swift 等效项

    在 C Objective C 中 可以使用 MIN 和 MAX 宏找到两个数字之间的最小值和最大值 Swift 不支持宏 并且语言 基础库中似乎没有等效的宏 是否应该采用自定义解决方案 也许基于这样的泛型one http www cplu
  • 未捕获的语法错误:意外的标记 e

    I am getting Uncaught Syntax Error newly the only addition is sending retrieve json data from server to client How to in
  • 通过 Bash Shell 脚本从 url 列表中提取父域名

    我有一个像这样的网址列表 http noto zrobimystrone pl pucenter images NGdocs http visionwebmkt com unsubscribe php M 879552 C b744d324
  • 列出给定库模块中的谓词

    有没有办法列出 SICStus Prolog 给定库模块中定义的所有谓词 例如如果我加载列表模块 use module library lists 我可以从提示符中运行另一个谓词来告诉我刚刚导入了哪些谓词吗 这适用于 SWI Prolog
  • 哪种 pyspark 抽象适合我的大型矩阵乘法?

    我想执行大型矩阵乘法 C A B T然后通过应用严格的阈值来过滤 C 收集形式为 行索引 列索引 值 的列表 A 和 B 很稀疏 条目大多为零 它们最初表示为稀疏 scipy csr 矩阵 矩阵的大小 当它们是密集格式时 答 9G 900
  • 有关构建 RDBMS 的资源 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在考虑实施 RDBMS 有没有关于数据库内部工作原理以及在开始构建自己的数据库时需要了解哪些内容的
  • JavaScript 选择/范围框架

    我一直在使用选择 范围对象 并且由于浏览器之间对于特定选择 范围内容 甚至超过 DOM 存在大量不一致 我想知道是否有一个框架可以帮助我解决这些问题 我编写了一个新的范围 选择库 名为Rangy http code google com p
  • 将字符串转换为带时区的日期

    我有一个格式为 yyyy MM dd hh mm a 的字符串 我可以单独获取时区对象 其中上面的字符串代表日期 我想将其转换为以下格式 yyyy MM dd HH mm ss Z 我怎样才能做到这一点 您可以使用简单日期格式 http d
  • AVAudioSession:某些蓝牙设备在我的应用程序上无法正常工作

    我正在使用 AVAudioSession 开发一个快速的音频 视频和文本聊天 iOS 应用程序 每当我选择使用某些蓝牙设备时 设备上播放的声音不是应用程序音频流 每当发送 接收消息时 它们仅播放文本聊天库发送的系统声音 并非所有蓝牙设备都会
  • null 参数的 IllegalArgumentException 或 NullPointerException? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有一个简单的属性设置方法null不适合此特定属性 我一直在这种情况下左右为难 我应该扔一个吗 IllegalArgumentException
  • 如何从 Oreo 的内部存储中打开 PDF 文件?

    我尝试在 Oreo 中打开 PDF 文件 但打不开 我没有收到任何错误 有什么问题吗 PDF 文件无法打开 仅显示黑屏 在 logcat 中没有显示错误 怎么了 我该如何解决这个问题 我引用了很多链接但没有得到解决方案 我也尝试了很多代码但
  • 对于简单的类型不匹配,出现错误“未为 `std::string::String` 实现特征 `std::ops::FnMut<(char,)>`”[重复]

    这个问题在这里已经有答案了 let mystring format the quick brown fox assert mystring ends with mystring Error the trait std ops FnMut l
  • 删除“NUL”字符

    我的记事本 中有这样的字符 当我尝试复制整行时 我实际上正在复制所有内容 直到 NUL File 1 我想做的就是替换那些空的 什么都没有 这样我就可以复制我的整行 也许有任何关键字可以告诉记事本 或任何其他可能有帮助的程序 替换这些字符
  • 如何减少 CUDA 同步延迟/延迟

    这个问题与使用cuda流运行多个内核有关 CUDA中有很多同步命令 cudaStream同步 Cuda设备同步 cuda线程同步 还有 cudaStreamQuery 来检查流是否为空 我注意到在使用探查器时 这些同步命令会给程序带来很大的