cuDevicePrimaryCtxRetain() 是否用于在多个进程之间拥有持久的 CUDA 上下文对象?

2024-02-14

例如,仅使用驱动程序 api,我对下面的单个进程进行了分析(cuCtxCreate),cuCtxCreate 开销几乎相当于与 GPU 之间的 300MB 数据复制:

在 CUDA 文档中here http://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__PRIMARY__CTX.html#group__CUDA__PRIMARY__CTX_1g9051f2d5c31501997a6cb0530290a300,它说(对于 cuDevicePrimaryCtxRetain)Retains the primary context on the device, creating it **if necessary**。这是从命令行重复调用同一进程的预期行为吗(例如运行一个进程 1000 次以显式处理 1000 个不同的输入图像)?设备是否需要 CU_COMPUTEMODE_EXCLUSIVE_PROCESS 才能按预期工作(多次调用时重新使用相同的上下文)?

目前,即使我多次调用该进程,上图也是相同的。即使不使用探查器,计时也显示大约 1 秒完成时间。

Edit:根据文档,主要上下文是one per device per process。这是否意味着使用多线程单应用程序时不会出现问题?

主要上下文的重用时间限制是多少?进程之间间隔 1 秒可以吗?还是必须间隔几毫秒才能保持主上下文处于活动状态?

我已经将 ptx 代码缓存到文件中,因此唯一剩下的开销看起来像 cuMemAlloc()、malloc() 和cuMemHostRegister()因此,重新使用上次调用同一进程的最新上下文可以很好地优化时间。

Edit-2:文件说The caller must call cuDevicePrimaryCtxRelease() when done using the context. for cuDevicePrimaryCtxRetain. Is caller这里有什么流程吗?我可以在数百个顺序调用的进程的列表中仅在第一个调用的进程中使用保留并在最后一个调用的进程上使用释放吗?如果最后一个进程无法启动,系统是否需要重置?cuDevicePrimaryCtxRelease没叫?

Edit-3:

主要上下文是为此目的吗?

process-1: retain (creates)
process-2: retain (re-uses)
...
process-99: retain (re-uses)
process-100: 1 x retain and 100 x release (to decrease counter and unload at last)

  • 一切都是为 sm_30 编译的,设备是 Grid K520。
  • GPU 在 cuCtxCreate() 期间处于提升频率
  • 项目是在 Windows Server 2016 操作系统和 CUDA 驱动程序安装上编译的 64 位(发布模式),具有 Windows-7 兼容性(这是适用于 K520 + windows_server_2016 的唯一方法)

tl;dr:不,事实并非如此。

cuDevicePrimaryCtxRetain() 是否用于在多个进程之间拥有持久的 CUDA 上下文对象?

不。它的目的是允许驱动程序 API 绑定到使用运行时 API 的库已经延迟创建的上下文。仅此而已。曾几何时,需要使用驱动程序 API 创建上下文,然后将运行时绑定到它们。现在,有了这些 API,您就不必这样做了。例如,您可以看看这是如何在 Tensorflow 中完成的here https://github.com/tensorflow/tensorflow/blob/4806cb0646bd21f713722bd97c0d0262c575f7e0/tensorflow/stream_executor/cuda/cuda_driver.cc#L517.

这是否意味着使用多线程单应用程序时不会出现问题?

从 CUDA 2.0 开始,驱动程序 API 就已经完全线程安全了

调用者这里有什么进程吗?我可以在数百个顺序[原文如此]调用的进程的列表中仅在第一个调用的进程中使用retain并在最后一个调用的进程上使用release吗?

不会。对于给定流程来说,上下文始终是唯一的。它们不能以这种方式在进程之间共享

主要上下文是为此目的吗?

process-1: retain (creates)
process-2: retain (re-uses)
...
process-99: retain (re-uses)
process-100: 1 x retain and 100 x release (to decrease counter and unload at last)

No.

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

cuDevicePrimaryCtxRetain() 是否用于在多个进程之间拥有持久的 CUDA 上下文对象? 的相关文章

  • 在 Windows 上的 Qt Creator 中编译 Cuda 代码

    几天来我一直在尝试获取在 32 位 Windows 7 系统上运行的 Qt 项目文件 我希望 需要在其中包含 Cuda 代码 这种组合要么非常简单 以至于没有人愿意在网上放一个例子 要么非常困难 似乎没有人成功 不管怎样 我发现的唯一有用的
  • 加强托管线程和操作系统线程之间的关系(CUDA 用例)

    Problem 我正在尝试创建一个与 net 良好集成的 CUDA 应用程序 设计目标是拥有多个可以从托管代码调用的 CUDA 函数 数据还应该能够在函数调用之间保留在设备上 以便可以将其传递给多个 CUDA 函数 重要的是 每个单独的数据
  • CUDA错误:在python中使用并行时初始化错误

    我的代码使用 CUDA 但运行速度仍然很慢 因此 我将其更改为使用 python 中的多处理 pool map 并行运行 但我有CUDA ERROR initialization error 这是函数 def step M self ite
  • 是否可以在设备函数中调用cufft库调用?

    我在主机代码中使用 cuFFT 库调用 它们工作正常 但我想从内核调用 cuFFT 库 早期版本的 CUDA 没有这种支持 但是有了动态并行性 这可能吗 如果有任何关于如何实现这一目标的示例 那就太好了 尽管在 Kepler cc 3 5
  • CUDA:如何检查计算能力是否正确?

    使用较高计算能力编译的 CUDA 代码将在计算能力较低的设备上完美执行很长一段时间 然后有一天在某些内核中默默地失败 我花了半天时间追寻一个难以捉摸的错误 结果发现构建规则已经sm 21而该设备 Tesla C2050 是2 0 是否有任何
  • cudaMemcpyToSymbol 与 cudaMemcpy [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我试图找出
  • 某些子网格未使用 CUDA 动态并行执行

    我正在尝试 CUDA 5 0 GTK 110 中的新动态并行功能 我遇到了一个奇怪的行为 即我的程序没有返回某些配置的预期结果 不仅是意外的 而且每次启动都会出现不同的结果 现在我想我找到了问题的根源 似乎当生成太多子网格时 某些子网格 由
  • 用于类型比较的 Boost 静态断言

    以下问题给我编译器错误 我不知道如何正确编写它 struct FalseType enum value false struct TrueType enum value true template
  • cudaMemcpyToSymbol 的问题

    我正在尝试复制到恒定内存 但我不能 因为我对 cudaMemcpyToSymbol 函数的用法有误解 我正在努力追随this http developer download nvidia com compute cuda 4 1 rel t
  • 寻找 CUDA 中的最大值

    我正在尝试在 CUDA 中编写代码来查找最大值 对于给定的一组数字 假设您有 20 个数字 并且内核在 2 个块 每块 5 个线程 上运行 现在假设 10 个线程同时比较前 10 个值 并且thread 2找到最大值 因此线程 2 正在更新
  • 在 cuda 的 nvcc 编译器中使用 C++20

    我正在尝试使用std countr zero 函数从
  • “计算能力”是什么意思? CUDA?

    我是CUDA编程新手 对此了解不多 您能告诉我 CUDA 计算能力 是什么意思吗 当我在大学服务器上使用以下代码时 它向我显示了以下结果 for device 0 device lt deviceCount device cudaDevic
  • 当我有表面声明时,如何为 sm_1X 和 sm_2X 编译 CUDA 程序

    我正在编写一个使用表面 重新采样并写入纹理 来提高性能的库 surface
  • 如何优化这个 CUDA 内核

    我已经分析了我的模型 似乎该内核约占我总运行时间的 2 3 我一直在寻找优化它的建议 代码如下 global void calcFlux double concs double fluxes double dt int idx blockI
  • Nvcc 的版本与 CUDA 不同

    我安装了 cuda 7 但是当我点击 nvcc version 时 它打印出 6 5 我想在 GTX 960 卡上安装 Theano 库 但它需要 nvcc 7 0 我尝试重新安装cuda 但它没有更新nvcc 当我运行 apt get i
  • 在 __device/global__ CUDA 内核中动态分配内存

    根据CUDA 编程指南 http developer download nvidia com compute cuda 3 2 prod toolkit docs CUDA C Programming Guide pdf 第 122 页 可
  • cuda中有模板化的数学函数吗? [复制]

    这个问题在这里已经有答案了 我一直在寻找 cuda 中的模板化数学函数 但似乎找不到 在普通的 C 中 如果我调用std sqrt它是模板化的 并且将根据参数是浮点数还是双精度数执行不同的版本 我想要这样的 CUDA 设备代码 我的内核将真
  • 如何在cmake中添加cuda源代码的定义

    我使用的是 Visual Studio 2013 Windows 10 CMake 3 5 1 一切都可以使用标准 C 正确编译 例如 CMakeLists txt project Test add definitions D WINDOW
  • 从 CUDA 设备写入输出文件

    我是 CUDA 编程的新手 正在将 C 代码重写为并行 CUDA 新代码 有没有一种方法可以直接从设备写入输出数据文件 而无需将数组从设备复制到主机 我假设如果cuPrintf存在 一定有地方可以写一个cuFprintf 抱歉 如果答案已经
  • 如何使用 CUDA/Thrust 对两个数组/向量根据其中一个数组中的值进行排序

    这是一个关于编程的概念问题 总而言之 我有两个数组 向量 我需要对一个数组 向量进行排序 并将更改传播到另一个数组 向量中 这样 如果我对 arrayOne 进行排序 则对于排序中的每个交换 arrayTwo 也会发生同样的情况 现在 我知

随机推荐

  • 选择选项卡时更改 div 高度

    我有一个选项卡式内容 有 4 个选项卡 每个选项卡中都有两个 div 构成边框设计 我遇到的问题是 当选择它们所在的选项卡时 我不知道如何对 div 进行动画处理以更改高度 我有一个小提琴供参考 http jsfiddle net jw6t
  • 如何将 CGRect 的大小增加一定的百分比值?

    如何将 CGRect 的大小增加一定的百分比值 我应该使用某种形式的CGRectInset去做吧 Example 假设我有一个 CGRect 10 10 110 110 我想将其大小增加 20 保留相同的中心点 0 0 120 120 您可
  • Android Preview M:授予权限后重新创建活动

    我使用 Preview M 并在其上测试我的应用程序 尤其是 将文件保存到外部存储 部分 在下载 保存过程开始之前 我请求 Manifest permission WRITE EXTERNAL STORAGE 开发者页面上描述的权限 htt
  • 从 Maven 部署到 Nexus 出现错误:ReasonPhrase:Forbidden

    http numberformat wordpress com 2011 05 18 nexus repository http numberformat wordpress com 2011 05 18 nexus repository
  • NetworkStream.Write 与 Socket.Send

    我有一个 C 应用程序 我使用自定义 FTP 库 现在我使用 Socket Send 发送数据 但我想知道使用套接字启动 NetworkStream 并使用 NetworkStream Write 是否会更好 使用其中一种比另一种有什么优势
  • Haskell 中的 HTTP POST 内容

    我正在尝试将一些数据发布到 Haskell 中的服务器 但服务器端为空 我正在使用 Network HTTP 库来处理请求 module Main main where import Network URI URI parseURI uri
  • Postgres `gin_trgm_ops` 索引未被使用

    我试图speed up https stackoverflow com questions 56483600 composite jsonb array query in postgresPostgres 中的一些文本匹配 使用pg trg
  • 如何在 dask/distributed 中存储工作线程局部变量

    使用dask 0 15 0 分布式1 17 1 我想记住每个工作人员的一些事情 比如访问谷歌云存储的客户端 因为实例化它是昂贵的 我宁愿将其存储在某种工作者属性中 执行此操作的规范方法是什么 或者全局变量是正确的选择吗 关于工人 您可以通过
  • jquery ajax 调用不起作用?!是firefox还是xss问题?

    我的问题是 在 Firefox 中我没有得到任何回应 在 ie 中它工作得很好 我想要对本地脚本进行 ajax 调用 以纯文本或其他方式获取一些信息 但这行不通 我认为跨脚本此时应该不是问题 或者 JavaScript 代码很简单 var
  • 如何在程序开始执行时设置断点

    如何在加载任何链接的 DLL 之前停止程序 我尝试过设置LoadLibraryExW函数在Break At Function调试选项 它会在该函数处停止 但在此之前 我在 Visual Studio 输出窗口中有以下内容 test exe
  • Sequelize - 通过匹配所有标签来过滤 FindAll

    assets tags foo tags bar 对上述端点的获取请求应仅返回包含所有提供的标签的记录 foo bar 我当前的尝试是返回与任何给定标签匹配的任何记录 const tags req query res send await
  • Angular 10 中主组件内的延迟加载模块

    我的应用程序中有两个模块 其中一个是app module另一个是user module这会被延迟加载 上app module我有一个sign in成分 sign up组件和main成分 这main component是由导航栏和侧边栏组成的
  • 设置回调数组并尝试使用数组索引作为回调中的值

    当我以这种方式设置回调数组时 我在所有回调的对话框窗口中得到 20 我想获取数组中的索引 这可能吗 调用回调的函数期望回调有一个参数 我不控制回调的调用者 因为它是外部库的一部分 任何帮助表示赞赏 for var i 0 i lt 20 i
  • 使用 CreateDesktop/SwitchDesktop 在新桌面中创建表单

    我需要为一个实用程序创建一个系统模式形式 该实用程序应该阻止整个窗口 直到输入某些值 所以我正在尝试创建桌面和切换 到目前为止 创建一个切换到它的桌面 然后返回对我来说效果很好 But 当我尝试从新线程中创建表单时 该表单不会显示 但应用程
  • NSwag - 如何添加评论?

    我在 ASP Net WebAPI 项目中使用 NSwag 来生成 swagger 界面 效果很好 假设我有一个方法想要添加一些解释 我该怎么做 我所说的注释是指当 API 用户查看文档时会看到的内容 我用谷歌搜索过 狂饮过 然后 躲开了
  • 从命令行运行程序时,C++ 出现错误“failure: locale::facet::_S_create_c_locale name not valid”

    我似乎对 C 中的区域设置有问题 当我从 Eclipse 中运行我的程序时 一切正常 但是 当我尝试从命令行运行时 我不断收到此错误 失败 locale facet S create c locale 名称无效 这是触发错误的代码 Set
  • Facebook 好友邀请的 Swift 2.0 代码

    我一直在为 iOS 应用程序的 Facebook 好友邀请寻找等效的 Swift 代码示例 但我找不到他们 我知道 Facebook 页面上有 Objective C 版本https developers facebook com docs
  • 有没有一种简单的方法可以在 Android 视图的顶部和底部添加边框?

    我有一个 TextView 我想沿着其顶部和底部边框添加黑色边框 我尝试添加android drawableTop and android drawableBottom到 TextView 但这只会导致整个视图变黑
  • 在java中,如何删除sqlite表?

    我正在开发 Android 应用程序 我必须在我的活动中开发一个 xml 按钮 并构建我的 sqlite 数据库和表 我怎样才能让用户按下按钮来删除表 谢谢 如果没有更多上下文 很难回答 但最终的 sqlite 查询将是 db execSQ
  • cuDevicePrimaryCtxRetain() 是否用于在多个进程之间拥有持久的 CUDA 上下文对象?

    例如 仅使用驱动程序 api 我对下面的单个进程进行了分析 cuCtxCreate cuCtxCreate 开销几乎相当于与 GPU 之间的 300MB 数据复制 在 CUDA 文档中here http docs nvidia com cu