如何减少 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 同步延迟/延迟 的相关文章

  • Scala 中用于阻止调用的 Future

    The Akka文档说 you may be tempted to just wrap the blocking call inside a Future and work with that instead but this strate
  • OpenCV 2.4.3rc 和 CUDA 4.2:“OpenCV 错误:没有 GPU 支持”

    我在这张专辑中上传了几张截图 https i stack imgur com TELST jpg https i stack imgur com TELST jpg 我正在尝试在 Visual Studio 2008 中的 OpenCV 中
  • 这个单例能够抵抗序列化和反射攻击吗?

    以下代码是否能够抵抗序列化和反射攻击 public class Example private static Example instance new Example private Example public static Exampl
  • Cuda:最小二乘求解,速度较差

    最近 我使用Cuda编写了一个名为 正交匹配追踪 的算法 在我丑陋的 Cuda 代码中 整个迭代需要 60 秒 而 Eigen lib 只需 3 秒 在我的代码中 矩阵 A 是 640 1024 y 是 640 1 在每一步中 我从 A 中
  • 在 CUDA 中的设备内存上分配 2D 数组

    如何在 Cuda 中的设备内存中分配和传输 往返于主机 2D 数组 我找到了解决这个问题的方法 我不必展平阵列 内置的cudaMallocPitch 函数完成了这项工作 我可以使用以下命令将阵列传输到设备或从设备传输阵列cudaMemcpy
  • 为什么我会得到以下结果? [复制]

    这个问题在这里已经有答案了 我做了以下测试 看看如何 PriorityBlockingQueue
  • 在 eclipse pdt 中同步时 - 比较 php 文件的版本时出现空白灰色窗口

    我已经安装了适用于 64 位 Linux 的 Eclipse PDT Helios SR1 GTK Ubuntu Maverick 全新安装 我添加了用于使用 Subversion 的 Subversive 插件 并安装了 SVNKit 1
  • C 中的可重入和可重入?

    我正在读一本书 名叫Linux系统编程 引用这本书里的话 系统调用和其他库函数怎么样 如果你的 进程正在写入文件或分配内存 并且信号处理程序写入同一文件或还调用 malloc 有些函数显然是不可重入的 如果一个程序在 执行不可重入函数的中间
  • 如何安装libcusolver.so.11

    我正在尝试安装 Tensorflow 但它要求 libcusolver so 11 而我只有 libcusolver so 10 有人可以告诉我我做错了什么吗 这是我的 Ubuntu nvidia 和 CUDA 版本 uname a Lin
  • 直接在主机上访问设备向量元素的最快方法

    我请您参考以下页面http code google com p thrust wiki QuickStartGuide Vectors http code google com p thrust wiki QuickStartGuide V
  • 从多个进程附加到单个文件的“线程安全”?

    假设我有 X 个进程打开文件 Y 进行追加 每个进程一次只写入一行 带有 n 真正的日志条目 文件 Y 中的每一行是否保证不会错误地交错 更新 本地附加文件系统 问题取决于正在进行什么类型的写入 如果您使用带缓冲的标准 I O 这通常是大多
  • 使用推力来处理 CUDA 类中的向量?

    我对 C 类的推力的适用性有疑问 我正在尝试实现一个类对象 该对象接收顶点的 x y z 坐标作为 ver1 ver2 和 ver3 然后 分配给一个三角形并计算面积和法向量 然而 我不太明白如何创建一类推力向量 这是我从文件中读取的顶点坐
  • 对 CUDA 操作进行计时

    我需要计算 CUDA 内核执行的时间 最佳实践指南说我们可以使用事件或标准计时函数 例如clock 在Windows中 我的问题是使用这两个函数给出了完全不同的结果 事实上 与实践中的实际速度相比 事件给出的结果似乎是巨大的 我实际上需要这
  • CUDA-Kernel 应该根据块大小动态崩溃

    我想做稀疏矩阵 密集向量乘法 假设用于压缩矩阵中条目的唯一存储格式是压缩行存储 CRS 我的内核如下所示 global void krnlSpMVmul1 float data mat int num nonzeroes unsigned
  • 完全禁用 NVCC 优化

    我正在尝试测量 GPU 上的峰值单精度触发器 为此我正在修改 PTX 文件以在寄存器上执行连续的 MAD 指令 不幸的是 编译器正在删除所有代码 因为它实际上没有做任何有用的事情 因为我没有执行任何数据的加载 存储 是否有编译器标志或编译指
  • 何时在多线程中使用 易失性?

    如果有两个线程访问全局变量 那么许多教程都说使该变量成为易失性的 以防止编译器将变量缓存在寄存器中 从而无法正确更新 然而 两个线程都访问共享变量需要通过互斥体进行保护 不是吗 但在这种情况下 在线程锁定和释放互斥体之间 代码位于关键部分
  • 一维纹理内存访问比一维全局内存访问更快吗?

    我正在测量标准纹理和 1Dtexture 内存访问之间的差异 为此 我创建了两个内核 global void texture1D float doarray int size int index calculate each thread
  • 原子变量能保证内存可见性吗?

    关于内存可见性的小问题 代码示例1 class CustomLock private boolean locked false public boolean lock if locked locked true return true re
  • 有哪些学习线程编程的好资源? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 随着多核CPU在桌面上的兴起 多线程技能将成为程序员的宝贵资产 您能为想要学习线程编程的程序员推荐一些好的资源 书籍 教程 网站等 吗 看
  • 如何转储所有 NVCC 预处理器定义?

    我想达到同样的效果 gcc dM E lt dev null 如所描述的here https stackoverflow com q 2224334 1593077 但对于 nvcc 也就是说 我想转储所有 nvcc 的预处理器定义 唉 n

随机推荐

  • 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 来检查流是否为空 我注意到在使用探查器时 这些同步命令会给程序带来很大的