【发布时间】:2013-08-21 16:53:42
【问题描述】:
与运行时 API 函数 cudaSetDevice 等效的 CUDA 驱动程序 API 是什么?
我正在查看驱动程序 API,但找不到等效函数。我能做的是
cuDeviceGet(&cuDevice, device_no);
cuCtxCreate(&cuContext, 0, cuDevice);
这是不等价的,因为除了设置设备之外,它还创建了一个上下文。运行时 API cudaSetDevice 本身不会创建上下文。在运行时 API 中,CUDA 上下文是使用第一个需要设备状态的 CUDA 调用隐式创建的。
此问题的背景:CUDA 感知 MPI (MVAPICH2 1.8/9) 初始化需要在调用 MPI_init 之前设置 CUDA 设备。使用 CUDA 运行时 API,这可以通过
cudaSetDevice(device_no);
MPI_init();
但是,我不想使用对 CUDA 运行时的调用,因为我的应用程序的其余部分纯粹使用驱动程序 API,我想避免也链接到运行时。
在 MPI 初始化之前创建上下文有什么问题?原则上什么都没有。只是想知道驱动 API 中是否存在等效调用。
【问题讨论】:
-
再想想。我认为没有等效的调用,因为在驱动程序 API 中没有设置设备。相反,正如我发布的那样:创建设备句柄并创建上下文(隐式设置设备)。有了这个 MVAPICH2 很开心。
-
换句话说:使用驱动程序 API 必须在使用 CUDA 感知 MPI 时创建上下文。
-
在运行时 API 中,从 CUDA 4.0 开始,
cudaSetDevice确实创建一个上下文,如果相关设备上尚不存在该上下文。