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 = 活动
返回值
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_DEVICE, CUDA_ERROR_INVALID_VALUE,
描述
返回值在*flags中的主上下文的标志dev,以及在*active中,它是否处于活动状态。 有关标志值,请参阅 cuDevicePrimaryCtxSetFlags。
注意请注意,此函数也可能返回来自先前异步启动的错误代码。
另请参阅
cuDevicePrimaryCtxSetFlags, cuCtxGetFlags, cuCtxSetFlags, cudaGetDeviceFlags
- CUresult cuDevicePrimaryCtxRelease ( CUdevice dev )
-
释放 GPU 上的主上下文。
参数
- dev
- - 释放主上下文的设备
返回值
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_DEVICE, CUDA_ERROR_INVALID_CONTEXT
描述
释放设备上的主上下文互操作。 一旦用户完成使用,应始终释放保留的上下文。 一旦释放对它的最后一个引用,上下文将自动重置。 当主上下文由 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
- - 要销毁主上下文的设备
返回值
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_DEVICE, CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE
描述
显式销毁并清理与当前进程中当前设备关联的所有资源。
请注意,调用函数有责任确保进程中没有其他模块再使用该设备。 因此,在大多数情况下建议使用 cuDevicePrimaryCtxRelease()。 但是,即使在重置设备后,其他模块也可以安全地调用 cuDevicePrimaryCtxRelease()。 重置主上下文不会释放它,保留了主上下文的应用程序应显式释放其使用权。
注意请注意,此函数也可能返回来自先前异步启动的错误代码。
另请参阅
cuDevicePrimaryCtxRetain, cuDevicePrimaryCtxRelease, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCtxSynchronize, cudaDeviceReset
- CUresult cuDevicePrimaryCtxRetain ( CUcontext* pctx, CUdevice dev )
-
保留 GPU 上的主上下文。
参数
- pctx
- - 返回的新上下文的上下文句柄
- dev
- - 请求主上下文的设备
返回值
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 工具可用于设置设备的计算模式。 可以通过向其传递 -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
- - 设备的新标志
返回值
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_DEVICE, CUDA_ERROR_INVALID_VALUE,
描述
设置设备上主上下文的标志,覆盖先前设置的标志。
的三个 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_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 时让步给其他 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