-2

看来我不了解 CUDA 的一些基本内容。我正在使用 C++ GUI 应用程序在双 GPU 卡上启动一些内核。当我启动主机进程时,没有列出任何进程nvidia-smi。这是意料之中的,因为主机进程一直等到我单击按钮才使用 CUDA 并启动内核。如果我按下按钮,两个内核在两个 GPU 上运行良好,退出并返回预期结果。然后主机进程被 列出两次nvidia-smi,每个 GPU 一次。nvidia-smi在我退出主机进程之前,这两个进程都是可见的。

我有点困惑,因为没有cudaOpen()orcudaClose()函数(或类似的函数对)之类的东西。

哪个 CUDA API 调用导致进程被列出nvidia-smi?哪个 CUDA API 调用会导致进程从列表中删除?

4

1 回答 1

2

这在 CUDA 文档第 3.2.1 节中进行了解释。 https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#initialization

3.2.1。初始化

运行时没有显式的初始化函数;它在第一次调用运行时函数时进行初始化(更具体地说,除了参考手册的错误处理和版本管理部分中的函数之外的任何函数)。在计时运行时函数调用以及将第一次调用的错误代码解释到运行时时,需要牢记这一点。

运行时为系统中的每个设备创建一个 CUDA 上下文(有关 CUDA 上下文的更多详细信息,请参阅上下文)。此上下文是此设备的主要上下文,并在需要此设备上的活动上下文的第一个运行时函数中初始化。它在应用程序的所有主机线程之间共享。作为此上下文创建的一部分,设备代码会在必要时进行即时编译(请参阅即时编译)并加载到设备内存中。这一切都是透明地发生的。如果需要,例如对于驱动程序 API 互操作性,可以从驱动程序 API 访问设备的主要上下文,如运行时和驱动程序 API 之间的互操作性中所述。

当主机线程调用 cudaDeviceReset() 时,这会破坏主机线程当前操作的设备的主要上下文(即,设备选择中定义的当前设备)。任何将此设备作为当前设备的主机线程进行的下一个运行时函数调用将为该设备创建一个新的主上下文。注意:CUDA 接口使用在主机程序启动期间初始化并在主机程序终止期间销毁的全局状态。CUDA 运行时和驱动程序无法检测此状态是否无效,因此在程序启动或 main 后终止期间使用任何这些接口(隐式或显式)将导致未定义的行为。

于 2022-02-25T17:43:19.243 回答