问题标签 [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 回答
104 浏览

cuda - 检查给定资源的上下文

让我们想象一下这种情况,我有很多初始化资源,例如:流、主机和设备内存结束事件,其中一部分在一个 GPU 的上下文中初始化,其余的属于另一个 GPU 上下文。

有没有办法检查给定的资源(事件、流或内存)是否属于某个 GPU 上下文?

在某些情况下,在命令内存复制或内核执行然后 get 之前断言这样的事情是值得的cudaErrorInvalidArgument

0 投票
1 回答
1836 浏览

linux - 是否可以在应用程序之间共享 Cuda 上下文?

我想在两个独立的 Linux 进程之间传递一个 Cuda 上下文(使用我已经设置的 POSIX 消息队列)。

使用cuCtxPopCurrent()andcuCtxPushCurrent()可以得到上下文指针,但是这个指针是在我调用函数的进程的内存中引用的,在进程之间传递是没有意义的。

我正在寻找其他解决方案。到目前为止,我的想法是:

  1. 尝试对CUcontext结构进行深度复制,然后传递副本。
  2. 看看我是否能找到一个共享内存解决方案,将我所有的 Cuda 指针都放在那里,以便两个进程都可以访问它们。
  3. 将流程合并到一个程序中。
  4. Cuda 4.0 中可能有更好的上下文共享,我可以切换到它。

我不确定选项 (1) 是否可行,也不确定 (2) 是否可用或可能。(3) 如果我想让事情变得通用(这是在劫持垫片中),那并不是一个真正的选择。(4) 我会看看 Cuda 4.0,但我也不确定它是否能在那里工作。

谢谢!

0 投票
1 回答
6252 浏览

c++ - CUDA 流和上下文

我目前正在使用一个应用程序,它产生一堆 pthreads (linux),每个线程都创建它自己的 CUDA 上下文。(现在使用 cuda 3.2)。

我遇到的问题是,似乎每个线程都有自己的上下文会在 GPU 上消耗大量内存。每个线程大约 200MB,所以这真的限制了我。

我可以简单地在主机线程中创建流,将流引用传递给工作线程,然后它们就可以将它们的流编号传递给我的 CUDA 库,并且所有工作都在相同的上下文中工作?

工作线程是否自动知道与其父线程相同的 CUDA 上下文?

谢谢

0 投票
1 回答
1033 浏览

c++ - 将 cuda 上下文传递给工作线程

我有一些 CUDA 内核想在单独的 pthread 中运行。

我基本上必须让每个 pthread 执行,比如 3 个 cuda 内核,并且它们必须按顺序执行。

我想我会尝试向每个 pthread 传递对流的引用,因此这 3 个 cuda 内核中的每一个都将在同一个流中按顺序执行。

我可以在 pthread 的不同上下文中使用它,然后它会正常执行内核,但这似乎需要很多开销。

那么如何让每个 pthread 在同一个上下文中工作,同时与其他 pthread 一起工作呢?

谢谢

0 投票
1 回答
4753 浏览

cuda - 运行时 API 应用程序中的 cuda 上下文创建和资源关联

我想了解 cuda 上下文是如何在 cuda 运行时 API 应用程序中创建并与内核相关联的?

我知道它是由驱动程序 API 在后台完成的。但我想了解创作的时间线。

首先,我知道 cudaRegisterFatBinary 是第一个 cuda api 调用,它在运行时注册了一个 fatbin 文件。紧随其后的是一些在驱动层调用 cuModuleLoad 的 cuda 函数注册 API。但是,如果我的 Cuda 运行时 API 应用程序调用 cudaMalloc,那么提供给这个函数的指针是如何与上下文相关联的,我认为它应该是事先创建的。如何获得这个已经创建的上下文的句柄并将未来的运行时 API 调用与它相关联?请揭开内部运作的神秘面纱。

引用 NVIDIA 的文档

CUDA 运行时 API 调用在绑定到当前主机线程的 CUDA 驱动程序 API CUcontext 上运行。

如果在 CUDA Runtime API 调用时不存在绑定到当前线程的 CUDA Driver API CUcontext,则 CUDA Runtime 将在执行调用之前隐式创建一个新的 CUcontext。

如果 CUDA 运行时创建 CUcontext,则将使用 CUDA 运行时 API 函数 cudaSetDevice、cudaSetValidDevices、cudaSetDeviceFlags、cudaGLSetGLDevice、cudaD3D9SetDirect3DDevice、cudaD3D10SetDirect3DDevice 和 cudaD3D11SetDirect3DDevice 指定的参数创建 CUcontext。请注意,如果在 CUcontext 绑定到当前主机线程时调用这些函数,它们将失败并显示 cudaErrorSetOnActiveProcess。

CUcontext 的生命周期由引用计数机制管理。CUcontext 的引用计数最初设置为 0,并由 cuCtxAttach 递增并由 cuCtxDetach 递减。

如果 CUDA 运行时创建了 CUcontext,则 CUDA 运行时将在函数 cudaThreadExit 中减少该 CUcontext 的引用计数。如果一个 CUcontext 由 CUDA Driver API 创建(或由 CUDA Runtime API 库的单独实例创建),则 CUDA Runtime 不会增加或减少该 CUcontext 的引用计数。

所有 CUDA 运行时 API 状态(例如,全局变量的地址和值)都与它的底层 CUcontext 一起移动。特别是,如果 CUcontext 从一个线程移动到另一个线程(使用 cuCtxPopCurrent 和 cuCtxPushCurrent),那么所有 CUDA Runtime API 状态也将移动到该线程。

但我不明白的是 cuda 运行时如何创建上下文?为此使用了哪些 API 调用?nvcc 编译器是在编译时插入一些 API 调用来执行此操作,还是完全在运行时完成?如果前者是真的,那么什么运行时 API 用于此上下文管理?后者是真的,它究竟是如何完成的?

如果上下文与主机线程相关联,我们如何访问该上下文?它是否自动与线程处理的所有变量和指针引用相关联?

最终如何在上下文中完成模块加载?

0 投票
1 回答
2135 浏览

cuda - cuCtxCreate 失败并显示 CUDA_ERROR_INVALID_DEVICE

通过 cuCtxCreate 创建 cuda 上下文时出现 CUDA_ERROR_INVALID_DEVICE 错误。

我的代码正在创建一个上下文并从中获取设备并创建一个新的上下文。

知道为什么我不能创建另一个上下文吗?

0 投票
2 回答
6715 浏览

cuda - 如何创建 CUDA 上下文?

如何创建 CUDA 上下文?CUDA 的第一次调用很慢,我想在启动内核之前创建上下文。

0 投票
1 回答
276 浏览

cuda - 如何从驱动程序 API 使用运行时 API 创建的上下文

我链接到的库使用 cuda 运行时 API。因此,它在第一次调用 cuda 函数时隐式创建了一个 cuda 上下文。

我的代码(使用库的)应该使用驱动程序 API。现在,我怎样才能让(运行时和驱动程序 API)同时工作?

库在库初始化时调用 cudaSetDevice 函数。(我无法改变这一点)。

我可以以某种方式确定上下文并告诉驱动程序 API 使用该上下文吗?

0 投票
1 回答
598 浏览

cuda - 为什么 cuCtxCreate 返回旧上下文?

我已经安装了:CUDA sdk 4.2 64、CUDA toolkit 4.2 64、CUDA devdriver 4.2 64、

我检查了 \windows 中的每个 nvcuda.dll - 它们都是 4.2 版本,但是当我使用驱动程序 api 创建上下文并使用 cuCtxGetApiVersion 检查它的版本时 - 它显示“3010”

我并不真正关心那个版本,但是当我尝试在该上下文中使用运行时 api 时(需要混合它们) - 它显示错误 49(cudaErrorIncompatibleDriverContext)

任何想法,发生了什么以及如何使其协同工作?

似乎这不是 Windows 的问题 - 在 linux 下运行相同的项目会导致相同的 3010 API 版本。

0 投票
1 回答
358 浏览

cuda - 创建 CUDA 上下文的区别

我有一个使用三个内核的程序。为了获得加速,我正在做一个虚拟内存复制来创建一个上下文,如下所示:

它是在我想要计时的内核之前启动的,如下所示:

我还阅读了其他最简单的方法来创建上下文作为 o cudaFree(0)​​r cudaDevicesynchronize()。但是使用这些 API 调用比使用虚拟内核要糟糕得多。

在强制上下文之后,程序的执行时间0.000031对于虚拟内核来说​​是秒0.000064,对于 cudaDeviceSynchronize() 和 cudaFree(0) 来说都是秒。时间是程序执行 10 次的平均值。

因此,我得出的结论是,启动内核会初始化一些在以规范方式创建上下文时未初始化的内容。

那么,使用内核和使用 API 调用这两种方式创建上下文有什么区别呢?

我在 GTX480 上运行测试,在 Linux 下使用 CUDA 4.0。