6.7. 主上下文管理
本节介绍底层CUDA驱动程序应用程序编程接口的主要上下文管理功能。
每个设备的主上下文是唯一的,并与CUDA运行时API共享。这些函数允许与其他使用CUDA的库进行集成。
Functions
- CUresult cuDevicePrimaryCtxGetState ( CUdevice dev, unsigned int* flags, int* active )
- Get the state of the primary context.
- CUresult cuDevicePrimaryCtxRelease ( CUdevice dev )
- Release the primary context on the GPU.
- CUresult cuDevicePrimaryCtxReset ( CUdevice dev )
- Destroy all allocations and reset all state on the primary context.
- CUresult cuDevicePrimaryCtxRetain ( CUcontext* pctx, CUdevice dev )
- Retain the primary context on the GPU.
- CUresult cuDevicePrimaryCtxSetFlags ( CUdevice dev, unsigned int flags )
- Set flags for the primary context.
Functions
- CUresult cuDevicePrimaryCtxGetState ( CUdevice dev, unsigned int* flags, int* active )
-
获取主上下文的状态。
参数
- dev
- - Device to get primary context flags for
- flags
- - Pointer to store flags
- active
- - Pointer to store context state; 0 = inactive, 1 = active
返回
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_DEVICE, CUDA_ERROR_INVALID_VALUE,
描述
返回*flags中dev主上下文的标志位,并在*active中返回其是否处于活动状态。有关标志值请参阅cuDevicePrimaryCtxSetFlags。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
cuDevicePrimaryCtxSetFlags, cuCtxGetFlags, cuCtxSetFlags, cudaGetDeviceFlags
- CUresult cuDevicePrimaryCtxRelease ( CUdevice dev )
-
释放GPU上的主上下文。
参数
- dev
- - Device which primary context is released
返回
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_DEVICE, CUDA_ERROR_INVALID_CONTEXT
描述
释放设备上的主上下文互操作。用户使用完毕后,应始终释放保留的上下文。当最后一个引用被释放时,上下文会自动重置。这种行为与CUDA 4.0及更早版本中由CUDA运行时保留主上下文的情况不同。在这种情况下,主上下文始终保持活动状态。
释放一个之前未被保留的主上下文将失败,并返回CUDA_ERROR_INVALID_CONTEXT错误。
请注意,与cuCtxDestroy()不同,该方法在任何情况下都不会从堆栈中弹出上下文。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
cuDevicePrimaryCtxRetain, cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCtxSynchronize
- CUresult cuDevicePrimaryCtxReset ( CUdevice dev )
-
销毁主上下文上的所有分配并重置所有状态。
参数
- dev
- - Device for which primary context is destroyed
返回
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_DEVICE, CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE
描述
显式销毁并清理当前进程中与当前设备关联的所有资源。
请注意,调用函数有责任确保进程中不再有其他模块使用该设备。因此,在大多数情况下建议使用cuDevicePrimaryCtxRelease()。不过即使重置设备后,其他模块调用cuDevicePrimaryCtxRelease()也是安全的。重置主上下文不会释放它,保留主上下文的应用程序应显式释放其使用。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
cuDevicePrimaryCtxRetain, cuDevicePrimaryCtxRelease, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCtxSynchronize, cudaDeviceReset
- CUresult cuDevicePrimaryCtxRetain ( CUcontext* pctx, CUdevice dev )
-
在GPU上保留主要上下文。
参数
- pctx
- - Returned context handle of the new context
- dev
- - Device for which primary context is requested
返回
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_CONTEXT, CUDA_ERROR_INVALID_DEVICE, CUDA_ERROR_INVALID_VALUE, CUDA_ERROR_OUT_OF_MEMORY, CUDA_ERROR_UNKNOWN
描述
在设备上保留主上下文。一旦用户成功保留主上下文,该主上下文将保持活动状态并可供用户使用,直到用户通过cuDevicePrimaryCtxRelease()释放它或通过cuDevicePrimaryCtxReset()重置它。与cuCtxCreate()不同,新保留的上下文不会被推入堆栈。
如果设备的计算模式为CU_COMPUTEMODE_PROHIBITED,首次保留主上下文将失败并返回CUDA_ERROR_UNKNOWN错误。可以使用cuDeviceGetAttribute()函数配合CU_DEVICE_ATTRIBUTE_COMPUTE_MODE参数来查询设备的计算模式。nvidia-smi工具可用于设置设备的计算模式。通过向nvidia-smi传递-h选项可以获取其使用文档。
请注意,主上下文始终支持固定分配。其他标志可通过cuDevicePrimaryCtxSetFlags()指定。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
cuDevicePrimaryCtxRelease, cuDevicePrimaryCtxSetFlags, cuCtxCreate, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCtxSynchronize
- CUresult cuDevicePrimaryCtxSetFlags ( CUdevice dev, unsigned int flags )
-
为主上下文设置标志。
参数
- dev
- - Device for which the primary context flags are set
- flags
- - New flags for the device
返回
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_DEVICE, CUDA_ERROR_INVALID_VALUE,
描述
设置设备上主上下文的标志,覆盖之前设置的标志。
flags 参数的最低三位可用于控制在API调用时拥有CUDA上下文的操作系统线程在等待GPU返回结果时与操作系统调度器的交互方式。创建上下文时只能设置其中一个调度标志。
-
CU_CTX_SCHED_SPIN: 指示CUDA在等待GPU结果时主动进行轮询。这可以减少等待GPU时的延迟,但如果CPU线程与CUDA线程并行执行工作,可能会降低CPU线程的性能。
-
CU_CTX_SCHED_YIELD: 指示CUDA在等待GPU返回结果时让出线程。这可能会增加等待GPU时的延迟,但能提升与GPU并行工作的CPU线程性能。
-
CU_CTX_SCHED_BLOCKING_SYNC: 指示CUDA在等待GPU完成工作时,使用同步原语阻塞CPU线程。
-
CU_CTX_BLOCKING_SYNC: 指示CUDA在等待GPU完成工作时,使用同步原语阻塞CPU线程。
已弃用: 该标志从CUDA 4.0起已被弃用,并被CU_CTX_SCHED_BLOCKING_SYNC取代。
-
CU_CTX_SCHED_AUTO: 当flags参数为零时的默认值,采用基于进程C中活跃CUDA上下文数量与系统P中逻辑处理器数量的启发式算法。若C > P,则CUDA在等待GPU时会主动让出CPU给其他操作系统线程(CU_CTX_SCHED_YIELD);否则CUDA将在等待结果时不主动让出CPU,而是保持处理器忙等待状态(CU_CTX_SCHED_SPIN)。此外,在Tegra设备上,CU_CTX_SCHED_AUTO还会根据平台的电源配置方案采用启发式策略,可能为低功耗设备选择CU_CTX_SCHED_BLOCKING_SYNC模式。
-
CU_CTX_LMEM_RESIZE_TO_MAX: 指示CUDA在调整内核的本地内存后不缩减本地内存。这可以防止在启动多个高本地内存占用的内核时因内存分配导致的抖动,但代价是可能增加内存使用量。
已弃用:此标志已被弃用,该标志启用的行为现在已成为默认行为且无法禁用。
-
CU_CTX_COREDUMP_ENABLE: 如果尚未通过cuCoredumpSetAttributeGlobal或环境变量全局启用GPU核心转储,则可以在创建上下文时设置此标志,指示CUDA在该上下文执行期间引发异常时生成核心转储。这些环境变量在CUDA-GDB用户指南的"GPU核心转储支持"章节中有详细说明。初始设置将取自上下文创建时的全局设置。控制核心转储输出的其他设置可以通过在创建的上下文变为当前上下文后调用cuCoredumpSetAttribute来修改。
-
CU_CTX_USER_COREDUMP_ENABLE: 如果尚未通过cuCoredumpSetAttributeGlobal或环境变量全局启用用户触发的GPU核心转储功能,则可在上下文创建时设置此标志,指示CUDA在数据写入操作系统空间中的特定管道时生成核心转储文件。这些环境变量的说明详见CUDA-GDB用户指南中"GPU核心转储支持"章节。需特别注意:若使用此标志,必须在创建上下文前通过cuCoredumpSetAttributeGlobal设置管道名称。设置此标志意味着同时设置了CU_CTX_COREDUMP_ENABLE。初始设置将继承上下文创建时的全局配置,其他控制核心转储输出的设置可通过在上下文变为当前上下文后调用cuCoredumpSetAttribute进行修改。
-
CU_CTX_SYNC_MEMOPS: 确保在此上下文中发起的同步内存操作将始终保持同步。有关同步内存操作可能表现出异步行为的情况,请参阅标题为"API同步行为"章节中的进一步文档说明。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
cuDevicePrimaryCtxRetain, cuDevicePrimaryCtxGetState, cuCtxCreate, cuCtxGetFlags, cuCtxSetFlags, cudaSetDeviceFlags