问题标签 [cuda-context]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1271 浏览

cuda - 创建 cuda 上下文管理器失败

我正在使用 PhysiX 实现流体模拟器。不幸的是,cuda 上下文管理器有问题,我无法识别它是什么。我有一个如下所示的 init 方法:

当我尝试运行我的应用程序时,mCudaContextManger从未正确创建。“创建 cuda 上下文管理器失败”正在控制台上写入,并且:

“....\LowLevel\software\src\PxsContext.cpp (1122) : 警告:GPU 操作失败。没有可用的 px::CudaContextManager. ....\SimulationController\src\particles\ScParticleSystemSim.cpp (73):警告:GPU 粒子系统创建失败。回退到 CPU 实现。”

我有带有最新驱动程序的 GeForce560Ti(我朋友笔记本电脑上的 GeForce460 上也出现错误)。Physix 设置为在 NVidia 控制面板中使用 GPU。

有人知道我们做错了什么以及如何让 GPU 工作吗?提前致谢!

0 投票
1 回答
548 浏览

c++ - CUDA 5.0 上下文管理与多 GPU 环境中的单个应用程序线程

网络上的大多数教程、指南、书籍和问答似乎都指的是 CUDA 3 和 4.x,所以这就是我专门询问 CUDA 5.0 的原因。对于这个问题...

我想为一个有两个 CUDA 设备的环境编程,但只使用一个线程,以使设计简单(特别是因为它是一个原型)。我想知道以下代码是否有效:

我想特别知道cudaMalloc(...)在测试之前的 s 是否持久,即使交换cudaSetDevice()发生在同一个线程中。另外,我想知道与上下文相关的对象是否也会发生同样的情况,例如cudaEvent_tcudaStream_t

我问它是因为我有一个这种风格的应用程序,它不断出现一些映射错误,如果缺少内存泄漏或错误的 API 使用,我找不到它是什么。

注意:在我的原始代码中,我会检查每个 CUDA 调用。我没有把它放在这里是为了代码的可读性。

0 投票
1 回答
3444 浏览

cuda - 无法在启用 ECC 的 NVIDIA 设备上创建上下文

在具有 4 个 NVIDIA GPU 的节点上,我在设备 0 上启用了 ECC 内存保护(所有其他都禁用了 ECC)。由于我在设备 0 上启用了 ECC,因此我的应用程序(CUDA,仅使用一个设备)在尝试在此设备 0(驱动程序 API)上创建上下文时挂起。我不知道为什么它会在那个时候挂起。如果我根据另一个设备使用不同的设备设置 CUDA_VISIBLE_DEVICE 它工作正常。它必须与启用 ECC 有关。有什么想法吗?这里的输出nvidia-smi:(为什么它报告 99% 不稳定的 GPU 利用率,那里没有运行?)

编辑:nvidia-smi -a报告在所有设备上启用了 ECC。奇怪的!

0 投票
1 回答
147 浏览

boost - 上下文创建时内核启动过多

最近我开始扩展一个非常依赖于 boost 的项目,以将 CUDA 用于其最内层循环。我认为值得在这里发布一些我一直看到的奇怪行为。简单地包含某些 boost 标头将导致我的第一个 cuda 调用生成大量内核。

如果编译调试以下代码:simpleCase.cu

我在执行 cudaMalloc 时收到以下调试消息行(如果我运行我定义的内核,行为相同。似乎任何触发上下文创建的东西都会触发这个。):

到目前为止,我已经确定了两个导致问题的标头: boost/thread.hpp boost/mpi.hpp

这里有一些信息可能对复制问题有用:

  • IDE:nSight Eclipse 版
  • 操作系统:ubuntu 12.04 x64
  • GPU:GeForce GTX 580(我相信我的操作系统正在使用我的 GeForce GT 520)
  • 提升库:1.52
  • 猫 /proc/driver/nvidia/版本:
    • NVRM 版本:NVIDIA UNIX x86_64 内核模块 310.32 Mon Jan 14 14:41:13 PST 2013
    • GCC 版本:gcc 版本 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)

项目设置:

  • Properties->Build->CUDA->DeviceLinkerMode = 单独编译
  • 属性->构建->CUDA->生成GPUCode = 2.0
  • Properties->Build->Settings->ToolSettings->NVCCLinker->Libraries = boost_system
  • 属性-> 名称 = simple_case_example

我认为这就是一切。

编辑:

谢谢你让我注意到我没有问过一个问题。我知道我忘记了一些重要的事情。我的问题是这样的:

对我来说,非常具体的包含在它们的生成外围内核调用中似乎很奇怪,特别是因为我不使用这些包含,而且我看不出它们如何影响我与 CUDA 的交互。cuda 是否应该为我什至不使用的代码启动这么多额外的内核?我看到我现在正在处理的项目中启动了 100 多个内核,而我的项目中唯一与 CUDA 相关的代码是程序入口点的单个 cudaMalloc。

编辑2:

也发生在 Tesla K20(开普勒架构卡,而我认为 GTX 580 是费米)上。

编辑3:

将 cuda 驱动程序更新到版本 319.23。我上面提到的行为没有改变,但这确实解决了我在大型程序中遇到的调试器问题。

0 投票
2 回答
2039 浏览

cuda - 在不同的 CUDA 上下文中共享 GPU 缓冲区

是否可以在使用相同 GPU 的不同上下文(CPU 线程)之间共享一个 cudaMalloc 的 GPU 缓冲区?每个上下文分配一个输入缓冲区,该缓冲区需要由预处理内核填充,该内核将使用整个 GPU,然后将输出分配给它们。

这种情况非常适合避免与 GPU 之间进行多次数据传输。该应用程序是一个波束形成器,它将组合多个天线信号并生成多个波束,其中每个波束将由不同的 GPU 上下文处理。波束的整个处理流程已经到位,我只需要添加波束成形部分。让每个线程生成它自己的光束会复制输入数据,所以我想避免这种情况(而且,一次生成多个光束效率更高)。

0 投票
1 回答
190 浏览

cuda - CUDA 上下文生命周期

在我的应用程序中,我有一部分代码的工作方式如下

主文件

对象.cpp

对象.cu

所以(我希望)你可以在代码中看到,准备 GPU 的函数根据第一维的值被多次调用。

我发送到常量内存的所有值始终保持不变,并且在全局内存中分配的指针的大小始终相同(数据是唯一变化的)。

这是我的代码中的实际工作流程,但在使用 GPU 时我没有得到任何加速,我的意思是内核确实执行得更快,但内存传输成了我的问题(如 nvprof 所报告)。

所以我想知道 CUDA 上下文在我的应用程序中的哪个位置开始和结束,看看是否有一种方法可以只将副本复制到常量内存和内存分配。

0 投票
2 回答
768 浏览

linux - 主机进程终止时的 CUDA 上下文破坏

如果我的主机程序 [exit]/[segfault]/[iskilled] 关于 CUDA 上下文破坏和相应分配的资源的相应行为是什么?

“行为”是指自动 GPU 驱动程序端机制,如果我从未在我的程序中明确调用 cudaDeviceReset。

我在 Linux 下工作,我看到我的 GPU 内存使用量在几天(甚至一天)内逐渐增长,而我正在启动有时通过 (CTRL-C) 或简单的段错误(在主机端)...

0 投票
1 回答
1381 浏览

multithreading - 好策略 使用 CPU 线程进行多 GPU 处理,cuda 上下文创建开销

我们有一个多 GPU 框架(在 Windows 上),可以在其中指定“作业”(还指定它们应在哪个 GPU 上完成),然后在特定 GPU 上执行。目前,我们的方法是在启动框架时为每个 GPU 创建一个“工作线程”,然后等待作业被处理。具体来说,我们使用来自https://devtalk.nvidia.com/search/more/sitecommentsearch/GPUworker/的“GPUWorker”类

到目前为止它运行良好,但有一些严重的与性能相关的缺点:

  • 在我们的框架中,一个特定的 GPU 在“作业”的整个时间内都被锁定,即使 GPU 实际上仅在 50% 的作业时间内使用。请注意,作业具有非常粗略的粒度,例如“进行光流计算”,这可能需要 50 - 100 毫秒。

  • 不能指定不锁定 GPU 的“异步”作业(例如异步主机设备副本)

所以我现在正在考虑针对该问题的“更好”策略。我的想法如下:对于每个“启动”的新作业,我创建一个新的“临时”CPU 线程。CPU 线程然后设置要在其上完成工作的 GPU 的设备号(通过“cudaSetDevice”)。我想此时也(对我透明地)创建了一个 Cuda 上下文。在看到正确的设备后,作业的“doWork”功能由 CPU 线程执行。取决于作业是同步完成还是异步完成,是否完成了“加入”(等待 CPU 线程完成)。

我现在有几个问题:

  • 这是一个“好”的策略,还是有人知道如何处理这个更好的方法?当然它必须是线程安全的策略。

  • 在我提出的策略中,创建新 CPU 线程和(隐藏)创建 Cuda 上下文的典型开销(以毫秒为单位)是多少?此外,如果 Cuda 上下文的创建很重要,有没有办法(例如使用 cuda 设备 api 和某种“上下文迁移”)来减少这种开销?

0 投票
1 回答
341 浏览

matlab - CUDA 上下文中模块的持久性

我有一个 MATLAB mex 库,可以在运行时加载特定于问题的 cubin 文件。这个 mex 函数被 MATLAB 调用了几百次。当我调用 cuModuleLoad 时,CUDA 是否每次都重新加载内核?还是以某种方式缓存?如果没有,有没有办法在两者之间保留加载的模块?我目前没有调用 cuModuleUnload。

似乎 CUDA 上下文只为 MATLAB 进程创建了一次,因为只有第一次调用库很慢。随后对 mex 库的 matlab 函数调用速度很快。所以我想我可以假设相同的 CUDA 上下文正在被重用。

0 投票
1 回答
4640 浏览

cuda - GPU Context是什么意思,NVIDIA架构中的GPU硬件通道

在阅读一些与 GPU 计算相关的论文时,我一直在理解这两个术语GPU Context,下面的GPU 硬件通道是对它们的简要提及,但我无法理解它们的含义,

命令:GPU 使用特定于架构的命令进行操作。每个GPU 上下文都分配有一个 FIFO 队列,CPU 上运行的程序向该队列提交命令。GPU 上的计算和数据传输只有在 GPU 本身调度相应的命令时才会触发。

通道:每个GPU 上下文都分配有一个GPU 硬件通道,在该通道中管理命令调度。Fermi 不允许多个通道同时访问同一个 GPU 功能单元,而是允许它们共存并在硬件中自动切换。

所以对此有一个清晰而简单的解释。