运行时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中是否有一个等价的调用。
发布于 2013-08-19 20:28:56
您可以在编程指南附录中找到有关驱动程序API的相关信息,但简短的版本如下:
cuCtxCreate
充当第一个cudaSetDevice
调用(也就是说,它在驱动程序上下文堆栈上创建上下文)cuCtxPushCurrent()
和cuCtxPopCurrent()
对(或根据您使用的API版本而定)充当任何后续cudaSetDevice
调用(也就是说,它推送或选择先前创建的上下文作为所有后续cudaSetDevice
调用的活动上下文,直到上下文从驱动程序上下文堆栈中弹出或取消选择为止)。发布于 2021-11-15 19:56:23
实际上,cudaSetDevice()
并不完全像创建来检索上下文,就像调用了cuCtxCreate()
一样。这是非常相似的,但是CUDA运行时API使用的是一个特殊的上下文。此上下文称为设备的主上下文。有用于处理此特殊上下文的特定驱动程序API函数:
CUresult cuDevicePrimaryCtxGetState ( CUdevice dev, unsigned int* flags, int* active );
CUresult cuDevicePrimaryCtxRelease ( CUdevice dev );
CUresult cuDevicePrimaryCtxReset ( CUdevice dev );
CUresult cuDevicePrimaryCtxRetain ( CUcontext* pctx, CUdevice dev );
CUresult cuDevicePrimaryCtxSetFlags ( CUdevice dev, unsigned int flags );
那么,为什么您想要实现cudaSetDevice()
的等效化,这将涉及(忽略错误检查)这样的事情:
CUcontext* primary_context;
cuDevicePrimaryCtxRetain(&primary_context, device_id);
cuCtxSetCurrent(primary_context);
备注:
https://stackoverflow.com/questions/18321493
复制相似问题