6.7. 主上下文管理

本节介绍低级别 CUDA 驱动程序应用程序编程接口的主上下文管理功能。

主上下文对于每个设备都是唯一的,并与 CUDA 运行时 API 共享。 这些函数允许与其他使用 CUDA 的库集成。

函数

CUresult cuDevicePrimaryCtxGetState ( CUdevice dev, unsigned int* flags, int* active )
获取主上下文的状态。
CUresult cuDevicePrimaryCtxRelease ( CUdevice dev )
释放 GPU 上的主上下文。
CUresult cuDevicePrimaryCtxReset ( CUdevice dev )
销毁所有分配并重置主上下文上的所有状态。
CUresult cuDevicePrimaryCtxRetain ( CUcontext* pctx, CUdevice dev )
保留 GPU 上的主上下文。
CUresult cuDevicePrimaryCtxSetFlags ( CUdevice dev, unsigned int  flags )
设置主上下文的标志。

函数

CUresult cuDevicePrimaryCtxGetState ( CUdevice dev, unsigned int* flags, int* active )
获取主上下文的状态。
参数
dev
- 获取主上下文标志的设备
flags
- 存储标志的指针
active
- 存储上下文状态的指针; 0 = 非活动,1 = 活动
描述

返回值在*flags中的主上下文的标志dev,以及在*active中,它是否处于活动状态。 有关标志值,请参阅 cuDevicePrimaryCtxSetFlags

注意

请注意,此函数也可能返回来自先前异步启动的错误代码。

另请参阅

cuDevicePrimaryCtxSetFlags, cuCtxGetFlags, cuCtxSetFlags, cudaGetDeviceFlags

CUresult cuDevicePrimaryCtxRelease ( CUdevice dev )
释放 GPU 上的主上下文。
参数
dev
- 释放主上下文的设备
描述

释放设备上的主上下文互操作。 一旦用户完成使用,应始终释放保留的上下文。 一旦释放对它的最后一个引用,上下文将自动重置。 当主上下文由 CUDA 运行时从 CUDA 4.0 及更早版本保留时,此行为有所不同。 在这种情况下,主上下文始终保持活动状态。

释放未事先保留的主上下文将失败,并显示 CUDA_ERROR_INVALID_CONTEXT

请注意,与 cuCtxDestroy() 不同,此方法在任何情况下都不会从堆栈中弹出上下文。

注意

请注意,此函数也可能返回来自先前异步启动的错误代码。

另请参阅

cuDevicePrimaryCtxRetain, cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCtxSynchronize

CUresult cuDevicePrimaryCtxReset ( CUdevice dev )
销毁所有分配并重置主上下文上的所有状态。
参数
dev
- 要销毁主上下文的设备
描述

显式销毁并清理与当前进程中当前设备关联的所有资源。

请注意,调用函数有责任确保进程中没有其他模块再使用该设备。 因此,在大多数情况下建议使用 cuDevicePrimaryCtxRelease()。 但是,即使在重置设备后,其他模块也可以安全地调用 cuDevicePrimaryCtxRelease()。 重置主上下文不会释放它,保留了主上下文的应用程序应显式释放其使用权。

注意

请注意,此函数也可能返回来自先前异步启动的错误代码。

另请参阅

cuDevicePrimaryCtxRetain, cuDevicePrimaryCtxRelease, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCtxSynchronize, cudaDeviceReset

CUresult cuDevicePrimaryCtxRetain ( CUcontext* pctx, CUdevice dev )
保留 GPU 上的主上下文。
参数
pctx
- 返回的新上下文的上下文句柄
dev
- 请求主上下文的设备
描述

在设备上保留主上下文。 一旦用户成功保留主上下文,主上下文将处于活动状态并可供用户使用,直到用户使用 cuDevicePrimaryCtxRelease() 释放它或使用 cuDevicePrimaryCtxReset() 重置它。 与 cuCtxCreate() 不同,新保留的上下文不会被推入堆栈。

如果设备的计算模式为 CU_COMPUTEMODE_PROHIBITED,则首次保留主上下文将失败,并显示 CUDA_ERROR_UNKNOWN。 函数 cuDeviceGetAttribute() 可以与 CU_DEVICE_ATTRIBUTE_COMPUTE_MODE 一起使用,以确定设备的计算模式。 nvidia-smi 工具可用于设置设备的计算模式。 可以通过向其传递 -h 选项来获取 nvidia-smi 的文档。

请注意,主上下文始终支持固定分配。 其他标志可以通过 cuDevicePrimaryCtxSetFlags() 指定。

注意

请注意,此函数也可能返回来自先前异步启动的错误代码。

另请参阅

cuDevicePrimaryCtxRelease, cuDevicePrimaryCtxSetFlags, cuCtxCreate, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCtxSynchronize

CUresult cuDevicePrimaryCtxSetFlags ( CUdevice dev, unsigned int  flags )
设置主上下文的标志。
参数
dev
- 要设置主上下文标志的设备
flags
- 设备的新标志
描述

设置设备上主上下文的标志,覆盖先前设置的标志。

的三个 LSBflags参数可用于控制在 API 调用时拥有 CUDA 上下文的 OS 线程在等待 GPU 结果时如何与 OS 调度程序交互。 创建上下文时,只能设置一个调度标志。

  • CU_CTX_SCHED_SPIN: 指示 CUDA 在等待 GPU 结果时主动自旋。 这可以减少等待 GPU 时的延迟,但如果 CPU 线程与 CUDA 线程并行执行工作,则可能会降低 CPU 线程的性能。

  • CU_CTX_SCHED_YIELD: 指示 CUDA 在等待 GPU 结果时让出其线程。 这可能会增加等待 GPU 时的延迟,但可以提高与 GPU 并行执行工作的 CPU 线程的性能。

  • CU_CTX_SCHED_AUTO: 如果flags参数为零时的默认值,使用基于进程 C 中活动的 CUDA 上下文数和系统 P 中逻辑处理器数的启发式方法。 如果 C > P,则 CUDA 将在等待 GPU 时让步给其他 OS 线程 (CU_CTX_SCHED_YIELD),否则 CUDA 将在等待结果时不会让步,而是在处理器上主动自旋 (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 在数据写入到 OS 空间中存在的某个管道时创建崩溃转储。 这些环境变量在 CUDA-GDB 用户指南的“GPU 核心转储支持”部分中进行了描述。 重要的是要注意,如果使用此标志,则 *必须* 在创建上下文之前使用 cuCoredumpSetAttributeGlobal 设置管道名称。 设置此标志意味着已设置 CU_CTX_COREDUMP_ENABLE。 初始设置将从上下文创建时的全局设置中获取。 可以通过从创建的上下文中调用 cuCoredumpSetAttribute 并在其变为当前上下文后修改控制崩溃转储输出的其他设置。

  • CU_CTX_SYNC_MEMOPS: 确保在此上下文中启动的同步内存操作将始终同步。 有关同步内存操作可能表现出异步行为的情况的更多信息,请参见标题为“API 同步行为”的部分中的进一步文档。

注意

请注意,此函数也可能返回来自先前异步启动的错误代码。

另请参阅

cuDevicePrimaryCtxRetain, cuDevicePrimaryCtxGetState, cuCtxCreate, cuCtxGetFlags, cuCtxSetFlags, cudaSetDeviceFlags