6.8. 上下文管理
本节介绍底层CUDA驱动应用程序编程接口的上下文管理功能。
请注意,部分功能在Primary Context Management章节中有详细说明。
Functions
- CUresult cuCtxCreate ( CUcontext* pctx, unsigned int flags, CUdevice dev )
- Create a CUDA context.
- CUresult cuCtxCreate_v3 ( CUcontext* pctx, CUexecAffinityParam* paramsArray, int numParams, unsigned int flags, CUdevice dev )
- Create a CUDA context with execution affinity.
- CUresult cuCtxCreate_v4 ( CUcontext* pctx, CUctxCreateParams* ctxCreateParams, unsigned int flags, CUdevice dev )
- Create a CUDA context.
- CUresult cuCtxDestroy ( CUcontext ctx )
- Destroy a CUDA context.
- CUresult cuCtxGetApiVersion ( CUcontext ctx, unsigned int* version )
- Gets the context's API version.
- CUresult cuCtxGetCacheConfig ( CUfunc_cache* pconfig )
- Returns the preferred cache configuration for the current context.
- CUresult cuCtxGetCurrent ( CUcontext* pctx )
- Returns the CUDA context bound to the calling CPU thread.
- CUresult cuCtxGetDevice ( CUdevice* device )
- Returns the device handle for the current context.
- CUresult cuCtxGetExecAffinity ( CUexecAffinityParam* pExecAffinity, CUexecAffinityType type )
- Returns the execution affinity setting for the current context.
- CUresult cuCtxGetFlags ( unsigned int* flags )
- Returns the flags for the current context.
- CUresult cuCtxGetId ( CUcontext ctx, unsigned long long* ctxId )
- Returns the unique Id associated with the context supplied.
- CUresult cuCtxGetLimit ( size_t* pvalue, CUlimit limit )
- Returns resource limits.
- CUresult cuCtxGetStreamPriorityRange ( int* leastPriority, int* greatestPriority )
- Returns numerical values that correspond to the least and greatest stream priorities.
- CUresult cuCtxPopCurrent ( CUcontext* pctx )
- Pops the current CUDA context from the current CPU thread.
- CUresult cuCtxPushCurrent ( CUcontext ctx )
- Pushes a context on the current CPU thread.
- CUresult cuCtxRecordEvent ( CUcontext hCtx, CUevent hEvent )
- Records an event.
- CUresult cuCtxResetPersistingL2Cache ( void )
- Resets all persisting lines in cache to normal status.
- CUresult cuCtxSetCacheConfig ( CUfunc_cache config )
- Sets the preferred cache configuration for the current context.
- CUresult cuCtxSetCurrent ( CUcontext ctx )
- Binds the specified CUDA context to the calling CPU thread.
- CUresult cuCtxSetFlags ( unsigned int flags )
- Sets the flags for the current context.
- CUresult cuCtxSetLimit ( CUlimit limit, size_t value )
- Set resource limits.
- CUresult cuCtxSynchronize ( void )
- Block for the current context's tasks to complete.
- CUresult cuCtxWaitEvent ( CUcontext hCtx, CUevent hEvent )
- Make a context wait on an event.
Functions
- CUresult cuCtxCreate ( CUcontext* pctx, unsigned int flags, CUdevice dev )
-
创建一个CUDA上下文。
参数
- pctx
- - Returned context handle of the new context
- flags
- - Context creation flags
- dev
- - Device to create context on
返回
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
描述
Note:在大多数情况下,建议使用cuDevicePrimaryCtxRetain。
创建一个新的CUDA上下文并将其与调用线程关联。flags参数说明如下。该上下文创建时使用计数为1,cuCtxCreate()的调用者在使用完上下文后必须调用cuCtxDestroy()。如果线程已存在当前上下文,它将被新创建的上下文取代,并可通过后续调用cuCtxPopCurrent()来恢复。
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_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在数据写入操作系统空间中的特定管道时生成核心转储。这些环境变量在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选项可以获取其使用文档。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
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
- - Returned context handle of the new context
- paramsArray
- - Execution affinity parameters
- numParams
- - Number of execution affinity parameters
- flags
- - Context creation flags
- dev
- - Device to create context on
返回
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_UNSUPPORTED_EXEC_AFFINITY, CUDA_ERROR_UNKNOWN
描述
创建一个具有执行亲和性的新CUDA上下文,并将其与调用线程关联。paramsArray和flags参数如下所述。该上下文的初始使用计数为1,调用cuCtxCreate()的一方在使用完上下文后必须调用cuCtxDestroy()。如果线程已存在当前上下文,它将被新创建的上下文取代,并可通过后续调用cuCtxPopCurrent()来恢复。
上下文可以使用的执行资源类型和数量受paramsArray和numParams限制。paramsArray是一个CUexecAffinityParam数组,numParams描述该数组的大小。如果数组中有两个CUexecAffinityParam具有相同类型,则后者的执行亲和性参数会覆盖前者的执行亲和性参数。 支持的执行亲和性类型包括:
-
CU_EXEC_AFFINITY_TYPE_SM_COUNT 限制上下文可使用的SM部分。SM部分通过CUexecAffinitySmCount指定为SM数量。该限制将在内部向上取整至下一个硬件支持的数值。因此,必须在上下文创建后通过cuCtxGetExecAffinity查询上下文实际执行亲和性。目前该属性仅在Volta+ MPS环境下受支持。
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_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在数据写入操作系统空间中的特定管道时生成核心转储文件。这些环境变量的说明详见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选项可以获取其使用文档。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
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
- - Returned context handle of the new context
- ctxCreateParams
- - Context creation parameters
- flags
- - Context creation flags
- dev
- - Device to create context on
返回
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_CONTEXT, CUDA_ERROR_INVALID_DEVICE, CUDA_ERROR_INVALID_VALUE, CUDA_ERROR_NOT_SUPPORTED, CUDA_ERROR_OUT_OF_MEMORY, CUDA_ERROR_UNKNOWN
描述
创建一个新的CUDA上下文并将其与调用线程关联。flags参数说明如下。该上下文创建时使用计数为1,cuCtxCreate()的调用者在使用完上下文后必须调用cuCtxDestroy()。如果线程已存在当前上下文,它将被新创建的上下文取代,并可通过后续调用cuCtxPopCurrent()来恢复。
CUDA上下文可以通过执行亲和性创建。上下文可使用的执行资源类型和数量受限于execAffinity中的paramsArray和numExecAffinityParams。paramsArray是一个CUexecAffinityParam数组,numExecAffinityParams描述了paramsArray的大小。如果数组中有两个CUexecAffinityParam具有相同类型,后者的执行亲和性参数将覆盖前者的执行亲和性参数。 支持的执行亲和性类型包括:
-
CU_EXEC_AFFINITY_TYPE_SM_COUNT 限制上下文可使用的SM(流式多处理器)数量比例。通过CUexecAffinitySmCount指定SM数量作为比例限制。该限制会在内部向上取整至硬件支持的最小单位,因此必须在创建上下文后通过cuCtxGetExecAffinity查询上下文实际获得的执行亲和性。当前该属性仅在Volta及以上架构的MPS环境下受支持。
可以通过设置cigParams在CIG(CUDA in Graphics)模式下创建CUDA上下文。来自图形客户端的数据通过cigParams中的sharedData与CUDA共享。可以使用cuDeviceGetAttribute()函数配合CU_DEVICE_ATTRIBUTE_D3D12_CIG_SUPPORTED参数来检测是否支持D3D12图形客户端。sharedData是一个ID3D12CommandQueue句柄。execAffinityParams或cigParams可以设置为非空值。如果同时设置为非空值将导致未定义行为。
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_MAP_HOST: 指示CUDA支持映射固定内存分配。必须设置此标志才能分配可供GPU访问的固定主机内存。
-
CU_CTX_LMEM_RESIZE_TO_MAX: 指示CUDA在调整内核的本地内存大小后不缩减本地内存。这可以防止在启动多个高本地内存占用的内核时因内存分配导致的抖动,但可能会增加内存使用量。
已弃用: 此标志已被弃用,该标志启用的行为现在已成为默认行为且无法禁用。相反,可以使用cuCtxSetLimit()来控制每线程堆栈大小。
-
CU_CTX_COREDUMP_ENABLE: 如果尚未通过cuCoredumpSetAttributeGlobal或环境变量全局启用GPU核心转储功能,则可在创建上下文时设置此标志,指示CUDA在该上下文执行期间引发异常时生成核心转储文件。这些环境变量的说明详见CUDA-GDB用户指南中"GPU核心转储支持"章节。初始属性将从上下文创建时的全局属性中继承。控制核心转储输出的其他属性可通过在创建的上下文变为当前上下文后调用cuCoredumpSetAttribute进行修改。当CUDA上下文以CIG(图形模式下的CUDA)模式创建时,不支持此标志。
-
CU_CTX_USER_COREDUMP_ENABLE: 如果尚未通过cuCoredumpSetAttributeGlobal或环境变量全局启用用户触发的GPU核心转储,则可在上下文创建时设置此标志,指示CUDA在数据写入操作系统空间中的特定管道时生成核心转储。这些环境变量在CUDA-GDB用户指南的"GPU核心转储支持"章节中有详细说明。需特别注意:若使用此标志,必须在创建上下文前通过cuCoredumpSetAttributeGlobal设置管道名称。设置此标志意味着同时设置了CU_CTX_COREDUMP_ENABLE。初始属性将从上下文创建时的全局属性中获取。其他控制核心转储输出的属性可通过在上下文变为当前后调用cuCoredumpSetAttribute进行修改。在任何上下文创建时设置此标志等同于将CU_COREDUMP_ENABLE_USER_TRIGGER属性全局设为true。当CUDA上下文以CIG(图形模式下的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错误。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCoredumpSetAttributeGlobal, cuCoredumpSetAttribute, cuCtxSynchronize
- CUresult cuCtxDestroy ( CUcontext ctx )
-
销毁一个CUDA上下文。
参数
- ctx
- - Context to destroy
返回
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_CONTEXT, CUDA_ERROR_INVALID_VALUE
描述
销毁由ctx指定的CUDA上下文。无论当前有多少线程正在使用该上下文,ctx都将被销毁。调用函数有责任确保在执行cuCtxDestroy()时没有使用ctx发出API调用。
销毁并清理与上下文关联的所有资源。调用方有责任确保在后续API调用中不再访问或传递该上下文或其资源,否则将导致未定义行为。这些资源包括CUDA类型CUmodule、CUfunction、CUstream、CUevent、CUarray、CUmipmappedArray、CUtexObject、CUsurfObject、CUtexref、CUsurfref、CUgraphicsResource、CUlinkState、CUexternalMemory和CUexternalSemaphore。这些资源还包括通过cuMemAlloc()、cuMemAllocHost()、cuMemAllocManaged()和cuMemAllocPitch()进行的内存分配。
如果ctx是调用线程的当前上下文,那么ctx也将从当前线程的上下文栈中弹出(就像调用了cuCtxPopCurrent()一样)。如果ctx是其他线程的当前上下文,那么ctx将保持作为这些线程的当前上下文,尝试从这些线程访问ctx将导致错误CUDA_ERROR_CONTEXT_IS_DESTROYED。
Note:cuCtxDestroy()不会销毁由cuMemCreate()、cuMemAllocAsync()和cuMemAllocFromPoolAsync()创建的内存分配。这些内存分配不与任何CUDA上下文关联,需要显式销毁。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
cuCtxCreate, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCtxSynchronize
- CUresult cuCtxGetApiVersion ( CUcontext ctx, unsigned int* version )
-
获取上下文的API版本。
参数
- ctx
- - Context to check
- version
- - Pointer to version
返回
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_CONTEXT, CUDA_ERROR_INVALID_VALUE, CUDA_ERROR_UNKNOWN
描述
返回与上下文功能对应的version中的版本号(例如3010或3020),库开发人员可用其引导调用者使用特定API版本。如果ctx为NULL,则返回用于创建当前绑定上下文的API版本。
请注意,只有当上下文功能变更导致二进制兼容性被破坏时,才会引入新的API版本,因此API版本与驱动程序版本可能不同。例如,API版本为3020而驱动程序版本为4020的情况是有效的。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
cuCtxCreate, cuCtxDestroy, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCtxSynchronize
- CUresult cuCtxGetCacheConfig ( CUfunc_cache* pconfig )
-
返回当前上下文的首选缓存配置。
参数
- pconfig
- - Returned cache configuration
返回
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_CONTEXT, CUDA_ERROR_INVALID_VALUE
描述
在使用相同硬件资源的L1缓存和共享内存的设备上,此函数通过pconfig返回当前上下文的首选缓存配置。这只是一个偏好设置。驱动程序会尽可能使用请求的配置,但必要时也可以自由选择不同的配置来执行函数。
在L1缓存和共享内存大小固定的设备上,这将返回一个CU_FUNC_CACHE_PREFER_NONE的pconfig配置。
支持的缓存配置包括:
-
CU_FUNC_CACHE_PREFER_NONE: 对共享内存或L1缓存无偏好(默认设置)
-
CU_FUNC_CACHE_PREFER_SHARED: 优先使用更大的共享内存和更小的L1缓存
-
CU_FUNC_CACHE_PREFER_L1: 优先更大的L1缓存和更小的共享内存
-
CU_FUNC_CACHE_PREFER_EQUAL: 倾向于使用大小相等的L1缓存和共享内存
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
cuCtxCreate, cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCtxSynchronize, cuFuncSetCacheConfig, cudaDeviceGetCacheConfig
- CUresult cuCtxGetCurrent ( CUcontext* pctx )
-
返回绑定到当前CPU线程的CUDA上下文。
参数
- pctx
- - Returned context handle
描述
在*pctx中返回绑定到当前CPU线程的CUDA上下文。如果当前CPU线程未绑定任何上下文,则将*pctx设为NULL并返回CUDA_SUCCESS。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
- CUresult cuCtxGetDevice ( CUdevice* device )
-
返回当前上下文的设备句柄。
参数
- device
- - Returned device handle for the current context
返回
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_CONTEXT, CUDA_ERROR_INVALID_VALUE,
描述
在*device中返回当前上下文设备的句柄。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
cuCtxCreate, cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCtxSynchronize, cudaGetDevice
- CUresult cuCtxGetExecAffinity ( CUexecAffinityParam* pExecAffinity, CUexecAffinityType type )
-
返回当前上下文的执行亲和性设置。
参数
- pExecAffinity
- - Returned execution affinity
- type
- - Execution affinity type to query
返回
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_CONTEXT, CUDA_ERROR_INVALID_VALUE, CUDA_ERROR_UNSUPPORTED_EXEC_AFFINITY
描述
返回*pExecAffinity中type的当前值。支持的CUexecAffinityType值为:
-
CU_EXEC_AFFINITY_TYPE_SM_COUNT: 上下文被限制使用的SM数量。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
- CUresult cuCtxGetFlags ( unsigned int* flags )
-
返回当前上下文的标志位。
参数
- flags
- - Pointer to store flags of current context
返回
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_CONTEXT, CUDA_ERROR_INVALID_VALUE,
描述
返回当前上下文的标志到*flags中。有关标志值请参阅cuCtxCreate。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
cuCtxCreate, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetCurrent, cuCtxGetDevice, cuCtxGetLimit, cuCtxGetSharedMemConfig, cuCtxGetStreamPriorityRange, cuCtxSetFlags, cudaGetDeviceFlags
- CUresult cuCtxGetId ( CUcontext ctx, unsigned long long* ctxId )
-
返回与提供的上下文关联的唯一ID。
参数
- ctx
- - Context for which to obtain the Id
- ctxId
- - Pointer to store the Id of the context
返回
CUDA_SUCCESS, CUDA_ERROR_CONTEXT_IS_DESTROYED, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_CONTEXT, CUDA_ERROR_INVALID_VALUE
描述
在ctxId中返回与给定上下文关联的唯一ID。该ID在此CUDA实例的程序生命周期内是唯一的。如果传入的上下文为NULL且存在当前上下文,则返回当前上下文的ID。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
cuCtxCreate, cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPushCurrent
- CUresult cuCtxGetLimit ( size_t* pvalue, CUlimit limit )
-
返回资源限制。
参数
- pvalue
- - Returned size of limit
- limit
- - Limit to query
描述
返回*pvalue中limit的当前大小。支持的CUlimit值为:
-
CU_LIMIT_STACK_SIZE: 每个GPU线程的堆栈大小(以字节为单位)。
-
CU_LIMIT_PRINTF_FIFO_SIZE: printf()设备系统调用使用的FIFO大小(以字节为单位)。
-
CU_LIMIT_MALLOC_HEAP_SIZE: malloc()和free()设备系统调用使用的堆大小(以字节为单位)。
-
CU_LIMIT_DEV_RUNTIME_SYNC_DEPTH: 线程可以调用设备运行时函数cudaDeviceSynchronize()等待子网格启动完成的最大网格深度。
-
CU_LIMIT_DEV_RUNTIME_PENDING_LAUNCH_COUNT: 该上下文可发起的未完成设备运行时启动的最大数量。
-
CU_LIMIT_MAX_L2_FETCH_GRANULARITY: L2缓存获取粒度。
-
CU_LIMIT_PERSISTING_L2_CACHE_SIZE: 持久化L2缓存大小(以字节为单位)
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
cuCtxCreate, cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCtxSynchronize, cudaDeviceGetLimit
- CUresult cuCtxGetStreamPriorityRange ( int* leastPriority, int* greatestPriority )
-
返回与最小和最大流优先级对应的数值。
参数
- leastPriority
- - Pointer to an int in which the numerical value for least stream priority is returned
- greatestPriority
- - Pointer to an int in which the numerical value for greatest stream priority is returned
描述
在*leastPriority和*greatestPriority中分别返回对应最低和最高流优先级的数值。流优先级遵循数值越小优先级越高的约定。有效流优先级的范围由[*greatestPriority, *leastPriority]给出。如果用户尝试创建优先级值超出此API指定有效范围的流,优先级将自动向下或向上截取为*leastPriority或*greatestPriority。有关创建优先级流的详细信息,请参阅cuStreamCreateWithPriority。如果不需要该值,可以向*leastPriority或*greatestPriority传入NULL。
如果当前上下文设备不支持流优先级(参见cuDeviceGetAttribute),该函数将在*leastPriority和*greatestPriority中返回'0'。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
cuStreamCreateWithPriority, cuStreamGetPriority, cuCtxGetDevice, cuCtxGetFlags, cuCtxSetLimit, cuCtxSynchronize, cudaDeviceGetStreamPriorityRange
- CUresult cuCtxPopCurrent ( CUcontext* pctx )
-
从当前CPU线程弹出当前的CUDA上下文。
参数
- pctx
- - Returned popped context handle
描述
从CPU线程弹出当前的CUDA上下文,并通过*pctx传回旧上下文句柄。然后可以通过调用cuCtxPushCurrent()将该上下文设置为另一个CPU线程的当前上下文。
如果在调用cuCtxCreate()或cuCtxPushCurrent()之前CPU线程已有当前上下文,此函数会将该上下文重新设置为CPU线程的当前上下文。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
cuCtxCreate, cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCtxSynchronize
- CUresult cuCtxPushCurrent ( CUcontext ctx )
-
在当前CPU线程上推送一个上下文。
参数
- ctx
- - Context to push
返回
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_CONTEXT, CUDA_ERROR_INVALID_VALUE
描述
将给定的上下文ctx推送到CPU线程的当前上下文堆栈中。指定的上下文将成为CPU线程的当前上下文,因此所有在当前上下文上操作的CUDA函数都会受到影响。
可以通过调用cuCtxDestroy()或cuCtxPopCurrent()将之前的当前上下文重新设置为当前状态。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
cuCtxCreate, cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cuCtxSynchronize
- CUresult cuCtxRecordEvent ( CUcontext hCtx, CUevent hEvent )
-
记录一个事件。
参数
- hCtx
- - Context to record event for
- hEvent
- - Event to record
返回
CUDA_SUCCESSCUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_CONTEXT, CUDA_ERROR_INVALID_HANDLE, CUDA_ERROR_STREAM_CAPTURE_UNSUPPORTED
描述
在本次调用时,将上下文hCtx的所有活动捕获到hEvent中。hEvent和hCtx必须来自同一个CUDA上下文,否则将返回CUDA_ERROR_INVALID_HANDLE。随后,诸如cuEventQuery()或cuCtxWaitEvent()等调用将检查或等待被捕获的工作完成。本次调用后对hCtx的使用不会修改hEvent。如果传递给hCtx的上下文是主上下文,hEvent将捕获主上下文及其绿色上下文的所有活动。如果传递给hCtx的上下文是通过cuCtxFromGreenCtx()从绿色上下文转换而来的上下文,hEvent将仅捕获该绿色上下文的活动。
Note:如果指定的上下文hCtx中有流处于捕获模式,API将返回CUDA_ERROR_STREAM_CAPTURE_UNSUPPORTED。在这种情况下,调用将使所有冲突的捕获失效。
另请参阅:
cuCtxWaitEvent, cuGreenCtxRecordEvent, cuGreenCtxWaitEvent, cuEventRecord
- CUresult cuCtxResetPersistingL2Cache ( void )
-
将缓存中所有持久化的行重置为正常状态。
- CUresult cuCtxSetCacheConfig ( CUfunc_cache config )
-
为当前上下文设置首选的缓存配置。
参数
- config
- - Requested cache configuration
返回
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_CONTEXT, CUDA_ERROR_INVALID_VALUE
描述
在使用相同硬件资源的L1缓存和共享内存的设备上,这通过config设置当前上下文的首选缓存配置。这只是一个偏好设置。驱动程序会尽可能使用请求的配置,但必要时可以自由选择不同的配置来执行函数。通过cuFuncSetCacheConfig()或cuKernelSetCacheConfig()设置的任何函数偏好将优先于此上下文范围的设置。将上下文范围的缓存配置设置为CU_FUNC_CACHE_PREFER_NONE将导致后续内核启动时优先不更改缓存配置,除非启动内核需要。
在L1缓存和共享内存大小固定的设备上,此设置不起作用。
使用与最近偏好设置不同的偏好启动内核可能会插入一个设备端同步点。
支持的缓存配置包括:
-
CU_FUNC_CACHE_PREFER_NONE: 对共享内存或L1缓存无偏好(默认设置)
-
CU_FUNC_CACHE_PREFER_SHARED: 优先分配更大的共享内存和更小的L1缓存
-
CU_FUNC_CACHE_PREFER_L1: 优先使用更大的L1缓存和更小的共享内存
-
CU_FUNC_CACHE_PREFER_EQUAL: 倾向于使用大小相等的L1缓存和共享内存
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
cuCtxCreate, cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetLimit, cuCtxSynchronize, cuFuncSetCacheConfig, cudaDeviceSetCacheConfig, cuKernelSetCacheConfig
- CUresult cuCtxSetCurrent ( CUcontext ctx )
-
将指定的CUDA上下文绑定到调用它的CPU线程。
参数
- ctx
- - Context to bind to the calling CPU thread
描述
将指定的CUDA上下文绑定到调用它的CPU线程。如果ctx为NULL,则解除之前绑定到该CPU线程的CUDA上下文,并返回CUDA_SUCCESS。
如果调用CPU线程上存在CUDA上下文堆栈,这将用ctx替换该堆栈的顶部。如果ctx为NULL,则相当于弹出调用CPU线程的CUDA上下文堆栈的顶部(如果调用CPU线程的CUDA上下文堆栈为空,则不执行任何操作)。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
- CUresult cuCtxSetFlags ( unsigned int flags )
-
设置当前上下文的标志。
参数
- flags
- - Flags to set on the current context
返回
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_CONTEXT, CUDA_ERROR_INVALID_VALUE,
描述
设置当前上下文的标志位,覆盖之前设置的标志。有关标志值请参阅cuDevicePrimaryCtxSetFlags。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
cuCtxCreate, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetCurrent, cuCtxGetDevice, cuCtxGetLimit, cuCtxGetSharedMemConfig, cuCtxGetStreamPriorityRange, cuCtxGetFlags, cudaGetDeviceFlags, cuDevicePrimaryCtxSetFlags,
- CUresult cuCtxSetLimit ( CUlimit limit, size_t value )
-
设置资源限制。
参数
- limit
- - Limit to set
- value
- - Size of limit
返回
CUDA_SUCCESS, CUDA_ERROR_INVALID_VALUE, CUDA_ERROR_UNSUPPORTED_LIMIT, CUDA_ERROR_OUT_OF_MEMORY, CUDA_ERROR_INVALID_CONTEXT
描述
将limit设置为value是应用程序请求更新上下文维护的当前限制。驱动程序可以自由修改请求的值以满足硬件要求(这可能包括钳制到最小或最大值、向上舍入到最近的元素大小等)。应用程序可以使用cuCtxGetLimit()来准确查看限制被设置为何值。
设置每个CUlimit都有其特定的限制条件,因此这里分别进行讨论。
-
CU_LIMIT_STACK_SIZE 控制每个GPU线程的堆栈大小(以字节为单位)。驱动程序会根据需要自动增加每次内核启动时的每线程堆栈大小。该大小在每次启动后不会重置为原始值。设置此值将立即生效,如有必要,设备将阻塞直到所有先前请求的任务完成。
-
CU_LIMIT_PRINTF_FIFO_SIZE 控制printf()设备系统调用使用的FIFO缓冲区大小(以字节为单位)。必须在启动任何使用printf()设备系统调用的内核之前设置CU_LIMIT_PRINTF_FIFO_SIZE,否则将返回CUDA_ERROR_INVALID_VALUE错误。
-
CU_LIMIT_MALLOC_HEAP_SIZE 控制由malloc()和free()设备系统调用使用的堆大小(以字节为单位)。必须在启动任何使用malloc()或free()设备系统调用的内核之前设置CU_LIMIT_MALLOC_HEAP_SIZE,否则将返回CUDA_ERROR_INVALID_VALUE错误。
-
CU_LIMIT_DEV_RUNTIME_SYNC_DEPTH 控制网格的最大嵌套深度,在此深度下线程可以安全调用cudaDeviceSynchronize()。必须在首次启动使用设备运行时并在默认同步深度(两层网格)之上调用cudaDeviceSynchronize()的内核之前设置此限制。如果违反此限制,调用cudaDeviceSynchronize()将返回错误代码cudaErrorSyncDepthExceeded。此限制可以设置为小于默认值或最高24层的最大启动深度。设置此限制时需注意,额外的同步深度层级需要驱动程序预留大量设备内存,这些内存将无法用于用户分配。如果设备内存预留失败,cuCtxSetLimit()将返回CUDA_ERROR_OUT_OF_MEMORY,此时可将限制重置为较低值。此限制仅适用于计算能力<9.0的设备。尝试在其他计算能力版本的设备上设置此限制将返回错误CUDA_ERROR_UNSUPPORTED_LIMIT。
-
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缓存的字节大小。这纯粹是一个性能提示,根据平台的不同可能会被忽略或限制。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
cuCtxCreate, cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSynchronize, cudaDeviceSetLimit
- CUresult cuCtxSynchronize ( void )
-
阻塞当前上下文的任务直至完成。
描述
阻塞当前上下文,直到完成所有先前请求的任务。如果当前上下文是主上下文,已创建的绿色上下文也将同步。cuCtxSynchronize()如果前置任务中有失败则会返回错误。如果上下文创建时使用了CU_CTX_SCHED_BLOCKING_SYNC标志,CPU线程将阻塞直到GPU上下文完成其工作。
Note:请注意,此函数也可能返回之前异步启动的错误代码。
另请参阅:
cuCtxCreate, cuCtxDestroy, cuCtxGetApiVersion, cuCtxGetCacheConfig, cuCtxGetDevice, cuCtxGetFlags, cuCtxGetLimit, cuCtxPopCurrent, cuCtxPushCurrent, cuCtxSetCacheConfig, cuCtxSetLimit, cudaDeviceSynchronize
- CUresult cuCtxWaitEvent ( CUcontext hCtx, CUevent hEvent )
-
让上下文等待某个事件。
参数
- hCtx
- - Context to wait
- hEvent
- - Event to wait on
返回
CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_CONTEXT, CUDA_ERROR_INVALID_HANDLE, CUDA_ERROR_STREAM_CAPTURE_UNSUPPORTED
描述
使所有后续提交到上下文hCtx的工作等待hEvent中捕获的所有工作完成。该同步操作将在设备上执行,不会阻塞调用CPU线程。关于事件捕获内容的详细信息,请参阅cuCtxRecordEvent()。如果传递给hCtx的上下文是主上下文,则主上下文及其绿色上下文都将等待hEvent。如果传递给hCtx的上下文是通过cuCtxFromGreenCtx()从绿色上下文转换而来的上下文,则该绿色上下文将等待hEvent。
Note:-
hEvent可能来自与hCtx不同的上下文或设备。
-
如果指定的事件hEvent属于正在进行的捕获序列,或者指定的上下文hCtx中有流处于捕获模式,API将返回CUDA_ERROR_STREAM_CAPTURE_UNSUPPORTED并使捕获失效。
另请参阅:
cuCtxRecordEvent, cuGreenCtxRecordEvent, cuGreenCtxWaitEvent, cuStreamWaitEvent