与 cudaSetDevice 等效的 CUDA 驱动程序 API

rit*_*ter 3 c cuda

CUDA 驱动程序的运行时 API 函数的等效 API 是cudaSetDevice什么?

我正在查看驱动程序 API,但找不到等效的功能。我能做的是

cuDeviceGet(&cuDevice, device_no);
cuCtxCreate(&cuContext, 0, cuDevice);
Run Code Online (Sandbox Code Playgroud)

这是不等价的,因为除了设置设备之外,它还创建了一个上下文。运行时 APIcudaSetDevice本身并不创建上下文。在运行时 API 中,CUDA 上下文是通过需要设备状态的第一个 CUDA 调用隐式创建的。

此问题的背景:CUDA-aware MPI (MVAPICH2 1.8/9) 初始化需要在MPI_init调用之前设置 CUDA 设备。使用 CUDA 运行时 API,这可以通过

cudaSetDevice(device_no);
MPI_init();
Run Code Online (Sandbox Code Playgroud)

但是,我不想使用对 CUDA 运行时的调用,因为我的应用程序的其余部分纯粹使用驱动程序 API,我想避免也链接到运行时。

在 MPI 初始化之前创建上下文有什么问题?原则上没有。只是想知道驱动程序 API 中是否有等效的调用。

tal*_*ies 5

您可以在编程指南附录有关驱动程序API有关这方面的信息,但短期的版本是这样的:

  • cuCtxCreate充当第一个 cudaSetDevice调用(即它在驱动程序上下文堆栈上创建一个上下文)
  • cuCtxPushCurrent()cuCtxPopCurrent()一对(或cuCtxSetCurrent取决于哪个API版本您正在使用)用作任何后续cudaSetDevice呼叫(即,直到上下文被弹出驾驶员上下文堆栈它推动或选择一个先前创建的上下文对于所有后续的API调用活动上下文或取消选择)