6.34. 与CUDA驱动API的交互

本节描述CUDA驱动API与CUDA运行时API之间的交互

主要上下文

在CUDA运行时API中的CUDA设备与进程内CUDA驱动API中的CUcontext之间存在一一对应关系。CUDA运行时API为设备使用的特定上下文称为该设备的主上下文。从CUDA运行时API的角度来看,设备与其主上下文是同义的。

初始化和销毁

CUDA Runtime API 调用操作的是当前调用主机线程对应的 CUDA Driver API CUcontext

函数cudaInitDevice()确保为请求的设备初始化主上下文,但不会使其成为调用线程的当前上下文。

函数 cudaSetDevice() 通过调用 cuCtxSetCurrent() 初始化指定设备的主上下文,并将其设置为当前调用线程的上下文。

CUDA运行时API会在首次需要活动上下文的CUDA运行时API调用时自动初始化设备的主上下文。当进行需要活动上下文的CUDA运行时API调用时,如果调用线程当前没有CUcontext,则将选择设备的主上下文,使其成为调用线程的当前上下文并进行初始化。

CUDA运行时API初始化的上下文将使用由以下CUDA运行时API函数指定的参数进行初始化:cudaSetDeviceFlags()cudaD3D9SetDirect3DDevice()cudaD3D10SetDirect3DDevice()cudaD3D11SetDirect3DDevice()cudaGLSetGLDevice()cudaVDPAUSetVDPAUDevice()。请注意,当指定设备的主上下文已初始化时,这些函数调用将失败并返回cudaErrorSetOnActiveProcess错误,但cudaSetDeviceFlags()函数除外,它会直接覆盖之前的设置。

主上下文将保持活动状态,直到使用cudaDeviceReset()显式取消初始化为止。函数cudaDeviceReset()将立即取消初始化调用线程当前设备的主上下文。该上下文将继续作为所有曾将其设为当前上下文的线程的当前上下文。任何线程上需要活动上下文的后续CUDA运行时API调用,都将触发该设备主上下文的重新初始化。

请注意,主上下文是共享资源。建议除非在即将退出或需要从未指定的启动故障中恢复时,否则不要重置主上下文。

上下文互操作性

请注意,在单个进程内对每个设备使用多个CUcontext会显著降低性能,因此强烈不建议这样做。相反,强烈建议使用CUDA运行时API为进程提供的隐式一对一设备到上下文映射。

如果线程当前使用的是由CUDA Driver API创建的非主CUcontext,那么该线程调用的CUDA Runtime API将在该CUcontext上运行,以下列出了一些例外情况。数据类型之间的互操作性将在后续章节中讨论。

如果查询的指针是由非主上下文分配的,函数cudaPointerGetAttributes()将返回错误cudaErrorIncompatibleDriverContext。当非主CUcontext处于当前状态时,不得调用函数cudaDeviceEnablePeerAccess()及其他对等访问API。要使用通过CUDA Driver API创建的上下文来调用指针查询和对等访问API,必须使用CUDA Driver API来访问这些功能。

所有CUDA运行时API状态(例如全局变量的地址和值)都与其底层的CUcontext相关联。特别地,如果一个CUcontext从一个线程转移到另一个线程,那么所有CUDA运行时API状态也将随之转移到该线程。

请注意,无法附加到旧版上下文(即由cuCtxGetApiVersion()返回版本号为3010的上下文)。在这种情况下,CUDA Runtime将返回cudaErrorIncompatibleDriverContext错误。

CUstream与cudaStream_t之间的交互

类型 CUstreamcudaStream_t 是相同的,可以互换使用。

CUevent 与 cudaEvent_t 之间的交互

类型 CUeventcudaEvent_t 是相同的,可以互换使用。

CUarray与cudaArray_t之间的交互

类型 CUarray 和结构体 cudaArray * 表示相同的数据类型,可以通过在两者之间进行强制类型转换来互换使用。

为了在需要传入struct cudaArray *的CUDA Runtime API函数中使用CUarray,必须将CUarray显式转换为struct cudaArray *。

为了在需要CUarray的CUDA Driver API函数中使用struct cudaArray *,必须将struct cudaArray *显式转换为CUarray

CUgraphicsResource与cudaGraphicsResource_t之间的交互

类型 CUgraphicsResourcecudaGraphicsResource_t 表示相同的数据类型,可以通过相互类型转换来互换使用。

为了在接收cudaGraphicsResource_t的CUDA Runtime API函数中使用CUgraphicsResource,需要将CUgraphicsResource显式转换为cudaGraphicsResource_t

为了在需要CUgraphicsResource的CUDA驱动API函数中使用cudaGraphicsResource_t,必须将cudaGraphicsResource_t显式转换为CUgraphicsResource

CUtexObject与cudaTextureObject_t之间的交互

类型 CUtexObjectcudaTextureObject_t 表示相同的数据类型,可以通过在两者之间进行类型转换来互换使用。

为了在需要cudaTextureObject_t的CUDA Runtime API函数中使用CUtexObject,必须将CUtexObject显式转换为cudaTextureObject_t

为了在需要CUtexObject的CUDA驱动API函数中使用cudaTextureObject_t,必须将cudaTextureObject_t显式转换为CUtexObject

CUsurfObject与cudaSurfaceObject_t之间的交互

类型 CUsurfObjectcudaSurfaceObject_t 表示相同的数据类型,可以通过在两者之间进行类型转换来互换使用。

为了在接收cudaSurfaceObject_t的CUDA Runtime API函数中使用CUsurfObject,需要将CUsurfObject显式转换为cudaSurfaceObject_t

为了在需要CUsurfObject的CUDA驱动API函数中使用cudaSurfaceObject_t,必须将cudaSurfaceObject_t显式转换为CUsurfObject

CUfunction与cudaFunction_t之间的交互

类型 CUfunctioncudaFunction_t 表示相同的数据类型,可以通过相互转换来互换使用。

为了在需要CUfunction的CUDA驱动API函数中使用cudaFunction_t,必须将cudaFunction_t显式转换为CUfunction

CUkernel与cudaKernel_t之间的交互

类型 CUkernelcudaKernel_t 表示相同的数据类型,可以通过相互转换来互换使用。

为了在需要CUkernel的CUDA驱动API函数中使用cudaKernel_t,必须将cudaKernel_t显式转换为CUkernel

Functions

__host__cudaError_t cudaGetFuncBySymbol ( cudaFunction_t* functionPtr, const void* symbolPtr )
Get pointer to device entry function that matches entry function symbolPtr.
__host__cudaError_t cudaGetKernel ( cudaKernel_t* kernelPtr, const void* entryFuncAddr )
Get pointer to device kernel that matches entry function entryFuncAddr.

Functions

__host__cudaError_t cudaGetFuncBySymbol ( cudaFunction_t* functionPtr, const void* symbolPtr )
Get pointer to device entry function that matches entry function symbolPtr.
参数
functionPtr
- Returns the device entry function
symbolPtr
- Pointer to device entry function to search for
返回

cudaSuccess

描述

functionPtr中返回与符号symbolPtr对应的设备入口函数。

__host__cudaError_t cudaGetKernel ( cudaKernel_t* kernelPtr, const void* entryFuncAddr )
Get pointer to device kernel that matches entry function entryFuncAddr.
参数
kernelPtr
- Returns the device kernel
entryFuncAddr
- Address of device entry function to search kernel for
返回

cudaSuccess

描述

kernelPtr中返回与入口函数entryFuncAddr对应的设备内核。

Note that it is possible that there are multiple symbols belonging to different translation units with the same entryFuncAddr registered with this CUDA Runtime and so the order which the translation units are loaded and registered with the CUDA Runtime can lead to differing return pointers in kernelPtr . Suggested methods of ensuring uniqueness are to limit visibility of __global__ device functions by using static or hidden visibility attribute in the respective translation units.

另请参阅:

cudaGetKernel (C++ API)