6.8. 上下文管理

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

请注意,某些功能在主上下文管理部分中进行了描述。

函数

CUresult cuCtxCreate ( CUcontext* pctx, unsigned int  flags, CUdevice dev )
创建 CUDA 上下文。
CUresult cuCtxCreate_v3 ( CUcontext* pctx, CUexecAffinityParam* paramsArray, int  numParams, unsigned int  flags, CUdevice dev )
创建具有执行亲和性的 CUDA 上下文。
CUresult cuCtxCreate_v4 ( CUcontext* pctx, CUctxCreateParams* ctxCreateParams, unsigned int  flags, CUdevice dev )
创建 CUDA 上下文。
CUresult cuCtxDestroy ( CUcontext ctx )
销毁 CUDA 上下文。
CUresult cuCtxGetApiVersion ( CUcontext ctx, unsigned int* version )
获取上下文的 API 版本。
CUresult cuCtxGetCacheConfig ( CUfunc_cache* pconfig )
返回当前上下文的首选缓存配置。
CUresult cuCtxGetCurrent ( CUcontext* pctx )
返回绑定到调用 CPU 线程的 CUDA 上下文。
CUresult cuCtxGetDevice ( CUdevice* device )
返回当前上下文的设备句柄。
CUresult cuCtxGetExecAffinity ( CUexecAffinityParam* pExecAffinity, CUexecAffinityType type )
返回当前上下文的执行亲和性设置。
CUresult cuCtxGetFlags ( unsigned int* flags )
返回当前上下文的标志。
CUresult cuCtxGetId ( CUcontext ctx, unsigned long long* ctxId )
返回与提供的上下文关联的唯一 ID。
CUresult cuCtxGetLimit ( size_t* pvalue, CUlimit limit )
返回资源限制。
CUresult cuCtxGetStreamPriorityRange ( int* leastPriority, int* greatestPriority )
返回与最小和最大流优先级对应的数值。
CUresult cuCtxPopCurrent ( CUcontext* pctx )
从当前 CPU 线程弹出当前 CUDA 上下文。
CUresult cuCtxPushCurrent ( CUcontext ctx )
将上下文推送到当前 CPU 线程上。
CUresult cuCtxRecordEvent ( CUcontext hCtx, CUevent hEvent )
记录一个事件。
CUresult cuCtxResetPersistingL2Cache ( void )
将缓存中的所有持久化行重置为正常状态。
CUresult cuCtxSetCacheConfig ( CUfunc_cache config )
设置当前上下文的首选缓存配置。
CUresult cuCtxSetCurrent ( CUcontext ctx )
将指定的 CUDA 上下文绑定到调用 CPU 线程。
CUresult cuCtxSetFlags ( unsigned int  flags )
设置当前上下文的标志。
CUresult cuCtxSetLimit ( CUlimit limit, size_t value )
设置资源限制。
CUresult cuCtxSynchronize ( void )
阻止当前上下文的任务完成。
CUresult cuCtxWaitEvent ( CUcontext hCtx, CUevent hEvent )
使上下文等待事件。

函数

CUresult cuCtxCreate ( CUcontext* pctx, unsigned int  flags, CUdevice dev )
创建 CUDA 上下文。
参数
pctx
- 返回的新上下文的上下文句柄
flags
- 上下文创建标志
dev
- 在其上创建上下文的设备
描述

注意

在大多数情况下,建议使用 cuDevicePrimaryCtxRetain

创建一个新的 CUDA 上下文并将其与调用线程关联。下面描述了flags参数。创建的上下文的使用计数为 1,并且 cuCtxCreate() 的调用者必须在完成上下文使用后调用 cuCtxDestroy()。如果上下文已是线程的当前上下文,则它将被新创建的上下文取代,并且可以通过后续调用 cuCtxPopCurrent() 来恢复。

的三个最低有效位flags参数可用于控制在 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_MAP_HOST:指示 CUDA 支持映射的固定分配。必须设置此标志才能分配 GPU 可访问的固定主机内存。

  • CU_CTX_LMEM_RESIZE_TO_MAX:指示 CUDA 在为内核调整本地内存大小后不要减小本地内存。这可以防止在启动许多具有高本地内存使用率的内核时本地内存分配的抖动,但代价是可能增加内存使用量。

    已弃用: 此标志已弃用,并且此标志启用的行为现在是默认行为,无法禁用。相反,可以使用 cuCtxSetLimit() 控制每个线程的堆栈大小。

  • 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_COREDUMP_ENABLE_USER_TRIGGER 属性设置为true全局。

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

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

注意

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

另请参阅

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

CUresult cuCtxCreate_v3 ( CUcontext* pctx, CUexecAffinityParam* paramsArray, int  numParams, unsigned int  flags, CUdevice dev )
创建具有执行亲和性的 CUDA 上下文。
参数
pctx
- 返回的新上下文的上下文句柄
paramsArray
- 执行亲和性参数
numParams
- 执行亲和性参数的数量
flags
- 上下文创建标志
dev
- 在其上创建上下文的设备
描述

创建一个新的具有执行亲和性的 CUDA 上下文,并将其与调用线程关联。下面描述了paramsArrayflags参数。创建的上下文的使用计数为 1,并且 cuCtxCreate() 的调用者必须在完成上下文使用后调用 cuCtxDestroy()。如果上下文已是线程的当前上下文,则它将被新创建的上下文取代,并且可以通过后续调用 cuCtxPopCurrent() 来恢复。

上下文可以使用的执行资源的类型和数量受paramsArraynumParams限制。paramsArrayCUexecAffinityParam数组,numParams描述了数组的大小。如果数组中的两个CUexecAffinityParam具有相同的类型,则后面的执行亲和性参数将覆盖前面的执行亲和性参数。支持的执行亲和性类型为

  • CU_EXEC_AFFINITY_TYPE_SM_COUNT 限制了上下文可以使用的 SM 的部分。SM 的部分指定为 SM 的数量,通过CUexecAffinitySmCount。此限制将在内部向上舍入到下一个硬件支持的数量。因此,必须通过cuCtxGetExecAffinity在上下文创建后查询上下文的实际执行亲和性。目前,此属性仅在 Volta+ MPS 下受支持。

的三个最低有效位flags参数可用于控制在 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_MAP_HOST:指示 CUDA 支持映射的固定分配。必须设置此标志才能分配 GPU 可访问的固定主机内存。

  • CU_CTX_LMEM_RESIZE_TO_MAX:指示 CUDA 在为内核调整本地内存大小后不要减小本地内存。这可以防止在启动许多具有高本地内存使用率的内核时本地内存分配的抖动,但代价是可能增加内存使用量。

    已弃用: 此标志已弃用,并且此标志启用的行为现在是默认行为,无法禁用。相反,可以使用 cuCtxSetLimit() 控制每个线程的堆栈大小。

  • 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_COREDUMP_ENABLE_USER_TRIGGER 属性设置为true全局。

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

注意

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

另请参阅

cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCtxSynchronize, cuCoredumpSetAttributeGlobal, cuCoredumpSetAttribute, CUexecAffinityParam

CUresult cuCtxCreate_v4 ( CUcontext* pctx, CUctxCreateParams* ctxCreateParams, unsigned int  flags, CUdevice dev )
创建 CUDA 上下文。
参数
pctx
- 返回的新上下文的上下文句柄
ctxCreateParams
- Context creation parameters
flags
- 上下文创建标志
dev
- 在其上创建上下文的设备
描述

创建一个新的 CUDA 上下文并将其与调用线程关联。下面描述了flags参数。创建的上下文的使用计数为 1,并且 cuCtxCreate() 的调用者必须在完成上下文使用后调用 cuCtxDestroy()。如果上下文已是线程的当前上下文,则它将被新创建的上下文取代,并且可以通过后续调用 cuCtxPopCurrent() 来恢复。

CUDA 上下文可以使用执行亲和性创建。上下文可以使用的执行资源类型和数量受以下因素限制:paramsArraynumExecAffinityParamsexecAffinity限制。paramsArrayCUexecAffinityParam数组,numExecAffinityParams中描述了 paramsArray 的大小。如果两个CUexecAffinityParam具有相同的类型,则后面的执行亲和性参数将覆盖前面的执行亲和性参数。支持的执行亲和性类型为

  • CU_EXEC_AFFINITY_TYPE_SM_COUNT 限制了上下文可以使用的 SM 的部分。SM 的部分指定为 SM 的数量,通过CUexecAffinitySmCount。此限制将在内部向上舍入到下一个硬件支持的数量。因此,必须通过cuCtxGetExecAffinity在上下文创建后查询上下文的实际执行亲和性。目前,此属性仅在 Volta+ MPS 下受支持。

可以通过设置以下参数,在 CIG (图形中的 CUDA) 模式下创建 CUDA 上下文cigParams。来自图形客户端的数据通过以下方式与 CUDA 共享sharedDatacigParams。可以使用 cuDeviceGetAttribute()CU_DEVICE_ATTRIBUTE_D3D12_CIG_SUPPORTED 来确定对 D3D12 图形客户端的支持。sharedData是一个 ID3D12CommandQueue 句柄。可以设置execAffinityParamscigParams为非空值。将两者都设置为非空值将导致未定义的行为。

的三个最低有效位flags参数可用于控制在 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_MAP_HOST:指示 CUDA 支持映射的固定分配。必须设置此标志才能分配 GPU 可访问的固定主机内存。

  • CU_CTX_LMEM_RESIZE_TO_MAX:指示 CUDA 在为内核调整本地内存大小后不要减小本地内存。这可以防止在启动许多具有高本地内存使用率的内核时本地内存分配的抖动,但代价是可能增加内存使用量。

    已弃用: 此标志已弃用,并且此标志启用的行为现在是默认行为,无法禁用。相反,可以使用 cuCtxSetLimit() 控制每个线程的堆栈大小。

  • CU_CTX_COREDUMP_ENABLE: 如果 GPU 核心转储尚未通过 cuCoredumpSetAttributeGlobal 或环境变量全局启用,则可以在上下文创建期间设置此标志,以指示 CUDA 在此上下文在执行期间引发异常时创建核心转储。这些环境变量在 CUDA-GDB 用户指南的“GPU 核心转储支持”部分中进行了描述。初始属性将从上下文创建时的全局属性中获取。可以通过在创建的上下文变为当前上下文后,从中调用 cuCoredumpSetAttribute 来修改控制核心转储输出的其他属性。当在 CIG (图形中的 CUDA) 模式下创建 CUDA 上下文时,不支持此标志。

  • CU_CTX_USER_COREDUMP_ENABLE:如果尚未使用 cuCoredumpSetAttributeGlobal 或环境变量全局启用用户触发的 GPU 核心转储,则可以在上下文创建期间设置此标志,以指示 CUDA 在数据写入到 OS 空间中存在的特定管道时创建核心转储。这些环境变量在 CUDA-GDB 用户指南的“GPU 核心转储支持”部分中进行了描述。重要的是要注意,如果使用此标志,则管道名称 *必须* 在创建上下文之前使用 cuCoredumpSetAttributeGlobal 设置。设置此标志意味着设置了 CU_CTX_COREDUMP_ENABLE。初始属性将从上下文创建时的全局属性中获取。可以通过从创建的上下文中调用 cuCoredumpSetAttribute (使其成为当前上下文后)来修改控制核心转储输出的其他属性。在任何上下文创建时设置此标志等效于将 CU_COREDUMP_ENABLE_USER_TRIGGER 属性设置为true全局启用。当在 CIG (图形中的 CUDA) 模式下创建 CUDA 上下文时,不支持此标志。

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

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

如果客户端传递了无效参数以创建 CUDA 上下文,则上下文创建将失败,并返回 :: CUDA_ERROR_INVALID_VALUE。

如果设备或驱动程序不支持 CIG,则在 CIG 模式下创建上下文将失败,并返回 CUDA_ERROR_NOT_SUPPORTED

注意

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

另请参阅

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

CUresult cuCtxDestroy ( CUcontext ctx )
销毁 CUDA 上下文。
参数
ctx
- 要销毁的上下文
描述

销毁由ctx指定的 CUDA 上下文。上下文ctx将被销毁,无论它当前在多少个线程中。调用函数有责任确保在使用ctx时,没有 API 调用发出,同时 cuCtxDestroy() 正在执行。

销毁并清理与上下文关联的所有资源。调用者有责任确保在后续 API 调用中不访问或传递上下文或其资源,否则将导致未定义的行为。这些资源包括 CUDA 类型 CUmodule, CUfunction, CUstream, CUevent, CUarray, CUmipmappedArray, CUtexObject, CUsurfObject, CUtexref, CUsurfref, CUgraphicsResource, CUlinkState, CUexternalMemoryCUexternalSemaphore。这些资源还包括通过 cuMemAlloc(), cuMemAllocHost(), cuMemAllocManaged()cuMemAllocPitch() 进行的内存分配。

如果ctx是调用线程的当前上下文,则ctx也将从当前线程的上下文堆栈中弹出(就像调用了 cuCtxPopCurrent() 一样)。如果ctx是其他线程的当前上下文,则ctx将保持为这些线程的当前上下文,并且尝试从这些线程访问ctx将导致错误 CUDA_ERROR_CONTEXT_IS_DESTROYED

注意

cuCtxDestroy() 不会销毁通过 cuMemCreate(), cuMemAllocAsync()cuMemAllocFromPoolAsync() 进行的内存分配。这些内存分配不与任何 CUDA 上下文关联,需要显式销毁。

注意

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

另请参阅

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

CUresult cuCtxGetApiVersion ( CUcontext ctx, unsigned int* version )
获取上下文的 API 版本。
参数
ctx
- 要检查的上下文
version
- 指向版本的指针
描述

version中返回一个版本号,该版本号对应于上下文的功能(例如 3010 或 3020),库开发人员可以使用该版本号来指导调用者使用特定的 API 版本。如果ctx为 NULL,则返回用于创建当前绑定上下文的 API 版本。

请注意,只有在上下文功能发生更改并破坏二进制兼容性时,才会引入新的 API 版本,因此 API 版本和驱动程序版本可能不同。例如,API 版本为 3020 而驱动程序版本为 4020 是有效的。

注意

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

另请参阅

cuCtxCreate, cuCtxDestroy, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCtxSynchronize

CUresult cuCtxGetCacheConfig ( CUfunc_cache* pconfig )
返回当前上下文的首选缓存配置。
参数
pconfig
- 返回的缓存配置
描述

在 L1 缓存和共享内存使用相同硬件资源的设备上,此函数通过pconfig返回当前上下文的首选缓存配置。这仅是一种偏好。驱动程序将在可能的情况下使用请求的配置,但如果需要执行函数,则可以自由选择不同的配置。

这将返回一个pconfig在 L1 缓存和共享内存大小固定的设备上,返回 CU_FUNC_CACHE_PREFER_NONE

支持的缓存配置为

注意

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

另请参阅

cuCtxCreate, cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCtxSynchronize, cuFuncSetCacheConfig, cudaDeviceGetCacheConfig

CUresult cuCtxGetCurrent ( CUcontext* pctx )
返回绑定到调用 CPU 线程的 CUDA 上下文。
参数
pctx
- 返回的上下文句柄
描述

*pctx中返回绑定到调用 CPU 线程的 CUDA 上下文。如果没有任何上下文绑定到调用 CPU 线程,则*pctx设置为 NULL 并返回 CUDA_SUCCESS

注意

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

另请参阅

cuCtxSetCurrent, cuCtxCreate, cuCtxDestroy, cudaGetDevice

CUresult cuCtxGetDevice ( CUdevice* device )
返回当前上下文的设备句柄。
参数
device
- 返回的当前上下文的设备句柄
描述

*device当前上下文设备的句柄。

注意

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

另请参阅

cuCtxCreate, cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCtxSynchronize, cudaGetDevice

CUresult cuCtxGetExecAffinity ( CUexecAffinityParam* pExecAffinity, CUexecAffinityType type )
返回当前上下文的执行亲和性设置。
参数
pExecAffinity
- 返回的执行亲和性
type
- 要查询的执行亲和性类型
描述

*pExecAffinity的值。type支持的 CUexecAffinityType 值包括

注意

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

另请参阅

CUexecAffinityParam

CUresult cuCtxGetFlags ( unsigned int* flags )
返回当前上下文的标志。
参数
flags
- 指向存储当前上下文标志的指针
描述

*flags当前上下文的标志。有关标志值,请参阅 cuCtxCreate

注意

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

另请参阅

cuCtxCreate, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetCurrent, cuCtxGetDevice, cuCtxGetLimit, cuCtxGetSharedMemConfig, cuCtxGetStreamPriorityRange, cuCtxSetFlags, cudaGetDeviceFlags

CUresult cuCtxGetId ( CUcontext ctx, unsigned long long* ctxId )
返回与提供的上下文关联的唯一 ID。
参数
ctx
- 要获取 ID 的上下文
ctxId
- 指向存储上下文 ID 的指针
描述

ctxId与给定上下文关联的唯一 ID。对于此 CUDA 实例,ID 在程序的生命周期内是唯一的。如果提供的上下文为 NULL 且存在当前上下文,则返回当前上下文的 ID。

注意

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

另请参阅

cuCtxCreate, cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPushCurrent

CUresult cuCtxGetLimit ( size_t* pvalue, CUlimit limit )
返回资源限制。
参数
pvalue
- 返回的限制大小
limit
- 要查询的限制
描述

*pvalue的当前大小。limit支持的 CUlimit 值包括

注意

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

另请参阅

cuCtxCreate, cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCtxSynchronize, cudaDeviceGetLimit

CUresult cuCtxGetStreamPriorityRange ( int* leastPriority, int* greatestPriority )
返回与最小和最大流优先级对应的数值。
参数
leastPriority
- 指向 int 的指针,其中返回最小流优先级的数值
greatestPriority
- 指向 int 的指针,其中返回最大流优先级的数值
描述

*leastPriority*greatestPriority分别对应于最小和最大流优先级的数值。流优先级遵循一个约定,即数字越小表示优先级越高。有意义的流优先级范围由 [*greatestPriority, *leastPriority] 给出。如果用户尝试创建优先级值超出此 API 指定的有意义范围的流,则优先级将自动向下或向上钳制为*leastPriority*greatestPriority。有关创建优先级流的详细信息,请参阅 cuStreamCreateWithPriority。可以为*leastPriority*greatestPriority传入 NULL,如果不需要该值。

如果当前上下文的设备不支持流优先级(请参阅 cuDeviceGetAttribute),则此函数将在*leastPriority*greatestPriority中都返回“0”。

注意

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

另请参阅

cuStreamCreateWithPriority, cuStreamGetPriority, cuCtxGetDevice, cuCtxGetFlags, cuCtxSetLimit, cuCtxSynchronize, cudaDeviceGetStreamPriorityRange

CUresult cuCtxPopCurrent ( CUcontext* pctx )
从当前 CPU 线程弹出当前的 CUDA 上下文。
参数
pctx
- 返回弹出的上下文句柄
描述

从 CPU 线程弹出当前的 CUDA 上下文,并将旧的上下文句柄传递回*pctx。然后可以通过调用 cuCtxPushCurrent() 使该上下文再次成为不同 CPU 线程的当前上下文。

如果在调用 cuCtxCreate()cuCtxPushCurrent() 之前,某个上下文是 CPU 线程的当前上下文,则此函数使该上下文再次成为 CPU 线程的当前上下文。

注意

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

另请参阅

cuCtxCreate, cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCtxSynchronize

CUresult cuCtxPushCurrent ( CUcontext ctx )
将上下文推送到当前 CPU 线程上。
参数
ctx
- 要推送的上下文
描述

将给定的上下文ctx推送到 CPU 线程的当前上下文堆栈中。指定的上下文成为 CPU 线程的当前上下文,因此所有对当前上下文进行操作的 CUDA 函数都会受到影响。

可以通过调用 cuCtxDestroy()cuCtxPopCurrent(),使之前的当前上下文再次成为当前上下文。

注意

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

另请参阅

cuCtxCreate, cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCtxSynchronize

CUresult cuCtxRecordEvent ( CUcontext hCtx, CUevent hEvent )
记录一个事件。
参数
hCtx
- 要记录事件的上下文
hEvent
- 要记录的事件
描述

捕获hEvent上下文中所有活动hCtx在此调用时。hEventhCtx必须来自同一个 CUDA 上下文,否则将返回 CUDA_ERROR_INVALID_HANDLE。然后,诸如 cuEventQuery()cuCtxWaitEvent() 等调用将检查或等待捕获的工作完成。在此调用之后,使用hCtx不会修改hEvent。如果传递给hCtx的上下文是主上下文,hEvent将捕获主上下文及其绿色上下文的所有活动。如果传递给hCtx的上下文是通过 cuCtxFromGreenCtx() 从绿色上下文转换而来的上下文,hEvent将仅捕获绿色上下文的活动。

注意

如果指定的上下文hCtx具有处于捕获模式的流,则 API 将返回 CUDA_ERROR_STREAM_CAPTURE_UNSUPPORTED。在这种情况下,调用将使所有冲突的捕获无效。

另请参阅

cuCtxWaitEvent, cuGreenCtxRecordEvent, cuGreenCtxWaitEvent, cuEventRecord

CUresult cuCtxResetPersistingL2Cache ( void )
将缓存中所有持久化行重置为正常状态。
描述

cuCtxResetPersistingL2Cache 将缓存中所有持久化行重置为正常状态。在函数返回时生效。

注意

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

另请参阅

CUaccessPolicyWindow

CUresult cuCtxSetCacheConfig ( CUfunc_cache config )
设置当前上下文的首选缓存配置。
参数
config
- 请求的缓存配置
描述

在 L1 缓存和共享内存使用相同硬件资源的设备上,此设置通过config设置当前上下文的首选缓存配置。这仅是一个偏好设置。如果可能,驱动程序将使用请求的配置,但如果执行该函数需要,它可以自由选择不同的配置。通过 cuFuncSetCacheConfig()cuKernelSetCacheConfig() 设置的任何函数偏好设置都将优先于此上下文范围的设置。将上下文范围的缓存配置设置为 CU_FUNC_CACHE_PREFER_NONE 将导致后续的内核启动优先选择不更改缓存配置,除非启动内核需要更改。

在 L1 缓存和共享内存大小固定的设备上,此设置不起作用。

使用与最近的偏好设置不同的偏好设置启动内核可能会插入设备端同步点。

支持的缓存配置为

注意

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

另请参阅

cuCtxCreate, cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetLimit, cuCtxSynchronize, cuFuncSetCacheConfig, cudaDeviceSetCacheConfig, cuKernelSetCacheConfig

CUresult cuCtxSetCurrent ( CUcontext ctx )
将指定的 CUDA 上下文绑定到调用 CPU 线程。
参数
ctx
- 要绑定到调用 CPU 线程的上下文
描述

将指定的 CUDA 上下文绑定到调用 CPU 线程。如果ctx为 NULL,则先前绑定到调用 CPU 线程的 CUDA 上下文将被解除绑定,并返回 CUDA_SUCCESS

如果调用 CPU 线程上存在 CUDA 上下文堆栈,这将用ctx替换该堆栈的顶部。如果ctx为 NULL,则这等效于弹出调用 CPU 线程的 CUDA 上下文堆栈的顶部(如果调用 CPU 线程的 CUDA 上下文堆栈为空,则不执行任何操作)。

注意

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

另请参阅

cuCtxGetCurrent, cuCtxCreate, cuCtxDestroy, cudaSetDevice

CUresult cuCtxSetFlags ( unsigned int  flags )
设置当前上下文的标志。
参数
flags
- 要在当前上下文中设置的标志
描述

设置当前上下文的标志,覆盖先前设置的标志。有关标志值,请参见 cuDevicePrimaryCtxSetFlags

注意

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

另请参阅

cuCtxCreate, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetCurrent, cuCtxGetDevice, cuCtxGetLimit, cuCtxGetSharedMemConfig, cuCtxGetStreamPriorityRange, cuCtxGetFlags, cudaGetDeviceFlags, cuDevicePrimaryCtxSetFlags,

CUresult cuCtxSetLimit ( CUlimit limit, size_t value )
设置资源限制。
参数
limit
- 要设置的限制
value
- 限制大小
描述

limit设置为value是应用程序更新上下文维护的当前限制的请求。驱动程序可以自由修改请求的值以满足硬件要求(这可能是钳位到最小值或最大值、向上舍入到最接近的元素大小等)。应用程序可以使用 cuCtxGetLimit() 来准确了解已设置的限制。

设置每个 CUlimit 都有其特定的限制,因此此处将分别讨论每个限制。

  • CU_LIMIT_STACK_SIZE 控制每个 GPU 线程的堆栈大小(以字节为单位)。驱动程序会根据需要自动增加每次内核启动的每个线程的堆栈大小。此大小在每次启动后不会重置为原始值。设置此值将立即生效,如果需要,设备将阻塞,直到所有先前的请求任务完成。

  • CU_LIMIT_DEV_RUNTIME_PENDING_LAUNCH_COUNT 控制可以从当前上下文进行的未完成设备运行时启动的最大数量。网格从启动点到已知已完成之间都处于未完成状态。违反此限制的设备运行时启动将失败,并在启动后调用 cudaGetLastError() 时返回 cudaErrorLaunchPendingCountExceeded。如果使用设备运行时的模块需要比默认值(2048 次启动)更多的挂起启动,则可以增加此限制。请记住,能够维持额外的挂起启动将要求驱动程序预先保留更多的设备内存,这些内存将不再用于分配。如果这些保留失败,cuCtxSetLimit() 将返回 CUDA_ERROR_OUT_OF_MEMORY,并且可以将限制重置为较低的值。此限制仅适用于计算能力为 3.5 及更高的设备。尝试在计算能力低于 3.5 的设备上设置此限制将导致返回错误 CUDA_ERROR_UNSUPPORTED_LIMIT

  • CU_LIMIT_MAX_L2_FETCH_GRANULARITY 控制 L2 缓存的提取粒度。值范围可以从 0B 到 128B。这纯粹是一个性能提示,可以忽略或钳制,具体取决于平台。

  • CU_LIMIT_PERSISTING_L2_CACHE_SIZE 控制可用于持久化 L2 缓存的大小(以字节为单位)。这纯粹是一个性能提示,可以忽略或钳制,具体取决于平台。

注意

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

另请参阅

cuCtxCreate, cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSynchronize, cudaDeviceSetLimit

CUresult cuCtxSynchronize ( void )
阻塞,直到当前上下文的任务完成。
描述

阻塞,直到当前上下文完成所有先前的请求任务。如果当前上下文是主上下文,则已创建的绿色上下文也将被同步。cuCtxSynchronize() 在先前的任务之一失败时返回错误。如果上下文是使用 CU_CTX_SCHED_BLOCKING_SYNC 标志创建的,则 CPU 线程将阻塞,直到 GPU 上下文完成其工作。

注意

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

另请参阅

cuCtxCreate, cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cudaDeviceSynchronize

CUresult cuCtxWaitEvent ( CUcontext hCtx, CUevent hEvent )
使上下文等待事件。
参数
hCtx
- 要等待的上下文
hEvent
- 要等待的事件
描述

使提交到上下文的所有未来工作hCtx等待在以下项中捕获的所有工作hEvent。 同步将在设备上执行,并且不会阻塞调用 CPU 线程。 有关事件捕获内容的详细信息,请参阅 cuCtxRecordEvent()。 如果传递给hCtx的是主上下文,则主上下文及其绿色上下文将等待hEvent。如果传递给hCtx是通过 cuCtxFromGreenCtx() 从绿色上下文转换而来的上下文,则绿色上下文将等待hEvent.

注意
  • hEvent可能来自与以下项不同的上下文或设备hCtx.

  • 如果指定的事件hEvent是正在进行的捕获序列的一部分,或者如果指定的上下文hCtx具有处于捕获模式的流,则 API 将返回 CUDA_ERROR_STREAM_CAPTURE_UNSUPPORTED 并使捕获无效。

另请参阅

cuCtxRecordEvent, cuGreenCtxRecordEvent, cuGreenCtxWaitEvent, cuStreamWaitEvent