6.18. 流管理

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

函数

CUresult cuStreamAddCallback ( CUstream hStream, CUstreamCallback callback, void* userData, unsigned int  flags )
向计算流添加回调。
CUresult cuStreamAttachMemAsync ( CUstream hStream, CUdeviceptr dptr, size_t length, unsigned int  flags )
异步将内存附加到流。
CUresult cuStreamBeginCapture ( CUstream hStream, CUstreamCaptureMode mode )
在流上开始图捕获。
CUresult cuStreamBeginCaptureToGraph ( CUstream hStream, CUgraph hGraph, const CUgraphNode* dependencies, const CUgraphEdgeData* dependencyData, size_t numDependencies, CUstreamCaptureMode mode )
在流上开始图捕获到现有图。
CUresult cuStreamCopyAttributes ( CUstream dst, CUstream src )
将属性从源流复制到目标流。
CUresult cuStreamCreate ( CUstream* phStream, unsigned int  Flags )
创建流。
CUresult cuStreamCreateWithPriority ( CUstream* phStream, unsigned int  flags, int  priority )
使用给定优先级创建流。
CUresult cuStreamDestroy ( CUstream hStream )
销毁流。
CUresult cuStreamEndCapture ( CUstream hStream, CUgraph* phGraph )
结束流上的捕获,返回捕获的图。
CUresult cuStreamGetAttribute ( CUstream hStream, CUstreamAttrID attr, CUstreamAttrValue* value_out )
查询流属性。
CUresult cuStreamGetCaptureInfo ( CUstream hStream, CUstreamCaptureStatus* captureStatus_out, cuuint64_t* id_out, CUgraph* graph_out, const CUgraphNode** dependencies_out, size_t* numDependencies_out )
查询流的捕获状态。
CUresult cuStreamGetCaptureInfo_v3 ( CUstream hStream, CUstreamCaptureStatus* captureStatus_out, cuuint64_t* id_out, CUgraph* graph_out, const CUgraphNode** dependencies_out, const CUgraphEdgeData** edgeData_out, size_t* numDependencies_out )
查询流的捕获状态 (12.3+)。
CUresult cuStreamGetCtx ( CUstream hStream, CUcontext* pctx )
查询与流关联的上下文。
CUresult cuStreamGetCtx_v2 ( CUstream hStream, CUcontext* pCtx, CUgreenCtx* pGreenCtx )
查询与流关联的上下文。
CUresult cuStreamGetDevice ( CUstream hStream, CUdevice* device )
返回流的设备句柄。
CUresult cuStreamGetFlags ( CUstream hStream, unsigned int* flags )
查询给定流的标志。
CUresult cuStreamGetId ( CUstream hStream, unsigned long long* streamId )
返回与提供的流句柄关联的唯一 ID。
CUresult cuStreamGetPriority ( CUstream hStream, int* priority )
查询给定流的优先级。
CUresult cuStreamIsCapturing ( CUstream hStream, CUstreamCaptureStatus* captureStatus )
返回流的捕获状态。
CUresult cuStreamQuery ( CUstream hStream )
确定计算流的状态。
CUresult cuStreamSetAttribute ( CUstream hStream, CUstreamAttrID attr, const CUstreamAttrValue* value )
设置流属性。
CUresult cuStreamSynchronize ( CUstream hStream )
等待流的任务完成。
CUresult cuStreamUpdateCaptureDependencies ( CUstream hStream, CUgraphNode* dependencies, size_t numDependencies, unsigned int  flags )
更新捕获流中的依赖项集 (11.3+)。
CUresult cuStreamUpdateCaptureDependencies_v2 ( CUstream hStream, CUgraphNode* dependencies, const CUgraphEdgeData* dependencyData, size_t numDependencies, unsigned int  flags )
更新捕获流中的依赖项集 (12.3+)。
CUresult cuStreamWaitEvent ( CUstream hStream, CUevent hEvent, unsigned int  Flags )
使计算流等待事件。
CUresult cuThreadExchangeStreamCaptureMode ( CUstreamCaptureMode* mode )
交换线程的流捕获交互模式。

函数

CUresult cuStreamAddCallback ( CUstream hStream, CUstreamCallback callback, void* userData, unsigned int  flags )
向计算流添加回调。
参数
hStream
- 要向其添加回调的流
callback
- 先前流操作完成后要调用的函数
userData
- 要传递给回调函数的用户指定数据
flags
- 保留供将来使用,必须为 0
描述

注意

此函数计划最终弃用和删除。如果您不需要在设备错误的情况下执行回调,请考虑使用 cuLaunchHostFunc。此外,与 cuStreamBeginCapturecuStreamEndCapture 不同,此函数不支持它们,而 cuLaunchHostFunc 支持。

添加一个回调,以便在流中所有当前入队的项都完成后在主机上调用。对于每个 cuStreamAddCallback 调用,回调将精确执行一次。回调将阻止流中稍后的工作,直到它完成。

回调可能会传递 CUDA_SUCCESS 或错误代码。如果发生设备错误,所有后续执行的回调都将收到相应的 CUresult

回调不得进行任何 CUDA API 调用。尝试使用 CUDA API 将导致 CUDA_ERROR_NOT_PERMITTED。回调不得执行任何可能依赖于未完成的设备工作或未强制要求较早运行的其他回调的同步。没有强制顺序的回调(在独立的流中)以未定义的顺序执行,并且可能会被序列化。

为了统一内存的目的,回调执行做出了许多保证

  • 在回调期间,回调流被认为是空闲的。因此,例如,回调始终可以使用附加到回调流的内存。

  • 回调执行的开始与同步在回调之前立即在同一流中记录的事件具有相同的效果。因此,它同步了在回调之前“加入”的流。

  • 向任何流添加设备工作不会使流变为活动状态,直到所有先前的宿主函数和流回调都已执行完毕。因此,例如,即使已将工作添加到另一个流,回调也可能使用全局附加内存,如果使用事件将工作排序在回调之后。

  • 除非如上所述,否则回调的完成不会导致流变为活动状态。如果回调流之后没有设备工作,则回调流将保持空闲状态,并且在没有设备工作的情况下,跨连续回调将保持空闲状态。因此,例如,可以通过从流末尾的回调发出信号来完成流同步。

注意
  • 此函数使用标准 默认流 语义。

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

另请参阅

cuStreamCreate, cuStreamQuery, cuStreamSynchronize, cuStreamWaitEvent, cuStreamDestroy, cuMemAllocManaged, cuStreamAttachMemAsync, cuLaunchHostFunc, cudaStreamAddCallback

CUresult cuStreamAttachMemAsync ( CUstream hStream, CUdeviceptr dptr, size_t length, unsigned int  flags )
异步将内存附加到流。
参数
hStream
- 在其中入队附加操作的流
dptr
- 指向内存的指针(必须是指向托管内存或系统分配的可分页内存的有效主机可访问区域的指针)
length
- 内存长度
flags
- 必须是 CUmemAttach_flags 之一
描述

hStream中入队一个操作,以指定从length开始的dptr字节内存的流关联。此函数是流排序的操作,这意味着它依赖于流中先前的工作,并且只有在流中先前的工作完成后才会生效。任何先前的关联都会自动替换。

dptr必须指向以下类型的内存之一

  • 使用 __managed__ 关键字声明或使用 cuMemAllocManaged 分配的托管内存。

  • 系统分配的可分页内存的有效主机可访问区域。只有当与流关联的设备报告设备属性 CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS 的非零值时,才能指定此类型的内存。

对于托管分配,length必须为零或整个分配的大小。两者都表示正在更改整个分配的流关联。目前,无法更改托管分配的一部分的流关联。

对于可分页主机分配,length必须为非零。

流关联使用flags指定,它必须是 CUmemAttach_flags 之一。如果指定了 CU_MEM_ATTACH_GLOBAL 标志,则任何设备上的任何流都可以访问内存。如果指定了 CU_MEM_ATTACH_HOST 标志,则程序保证不会从设备属性 CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS 的值为零的设备上的任何流访问设备上的内存。如果指定了 CU_MEM_ATTACH_SINGLE 标志,并且hStream与设备属性 CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS 的值为零的设备关联,则程序保证仅从hStream访问设备上的内存。单次附加到 NULL 流是非法的,因为 NULL 流是虚拟全局流,而不是特定流。在这种情况下将返回错误。

当内存与单个流关联时,只要

hStream中的所有操作都已完成,统一内存系统将允许 CPU 访问此内存区域,而不管其他流是否处于活动状态。实际上,这会将活动 GPU 对托管内存区域的独占所有权限制为每个流的活动,而不是整个 GPU 的活动。

从未与其关联的流访问设备上的内存将产生未定义的结果。统一内存系统不执行错误检查以确保启动到其他流中的内核不访问此区域。

程序有责任通过事件、同步或其他方式对 cuStreamAttachMemAsync 的调用进行排序,以确保始终合法访问内存。数据可见性和一致性将为所有跟随流关联更改的内核进行适当的更改。

如果hStream在数据与其关联时被销毁,则关联将被删除,并且关联将恢复为在 cuMemAllocManaged 中指定的分配的默认可见性。对于 __managed__ 变量,默认关联始终为 CU_MEM_ATTACH_GLOBAL。请注意,销毁流是一个异步操作,因此,对默认关联的更改要等到流中的所有工作都完成后才会发生。

注意
  • 此函数使用标准 默认流 语义。

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

另请参阅

cuStreamCreate, cuStreamQuery, cuStreamSynchronize, cuStreamWaitEvent, cuStreamDestroy, cuMemAllocManaged, cudaStreamAttachMemAsync

CUresult cuStreamBeginCapture ( CUstream hStream, CUstreamCaptureMode mode )
在流上开始图捕获。
参数
hStream
- 在其中启动捕获的流
mode
- 控制此捕获序列与其他可能不安全的 API 调用的交互。有关更多详细信息,请参见 cuThreadExchangeStreamCaptureMode
描述

在以下对象上开始图形捕获:hStream。当流处于捕获模式时,所有推送到流中的操作将不会被执行,而是会被捕获到图形中,该图形将通过 cuStreamEndCapture 返回。如果满足以下条件,则可能无法启动捕获:是 CU_STREAM_LEGACY。捕获必须在启动捕获的同一流上结束,并且只有当流尚未处于捕获模式时才能启动捕获。捕获模式可以通过 cuStreamIsCapturing 查询。表示捕获序列的唯一 ID 可以通过 cuStreamGetCaptureInfo 查询。

如果mode不是 CU_STREAM_CAPTURE_MODE_RELAXED,cuStreamEndCapture 必须从同一线程在此流上调用。

注意

使用此 API 捕获的内核不得使用纹理和表面引用。通过任何纹理或表面引用进行读取或写入是未定义的行为。此限制不适用于纹理和表面对象。

注意

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

另请参阅

cuStreamCreate, cuStreamIsCapturing, cuStreamEndCapture, cuThreadExchangeStreamCaptureMode

CUresult cuStreamBeginCaptureToGraph ( CUstream hStream, CUgraph hGraph, const CUgraphNode* dependencies, const CUgraphEdgeData* dependencyData, size_t numDependencies, CUstreamCaptureMode mode )
在现有图形的流上开始图形捕获。
参数
hStream
- 在其中启动捕获的流。
hGraph
- 要捕获到的图形。
dependencies
- 流中捕获的第一个节点的依赖项。如果 numDependencies 为 0,则可以为 NULL。
dependencyData
- 与每个依赖项关联的可选数据数组。
numDependencies
- 依赖项的数量。
mode
- 控制此捕获序列与其他可能不安全的 API 调用的交互。有关更多详细信息,请参见 cuThreadExchangeStreamCaptureMode
描述

在以下对象上开始图形捕获:hStream,将新节点放入现有图形中。当流处于捕获模式时,所有推送到流中的操作将不会被执行,而是会被捕获到hGraph。在用户调用 cuStreamEndCapture 之前,图形将无法实例化。

如果满足以下条件,则可能无法启动捕获:是 CU_STREAM_LEGACY。捕获必须在启动捕获的同一流上结束,并且只有当流尚未处于捕获模式时才能启动捕获。捕获模式可以通过 cuStreamIsCapturing 查询。表示捕获序列的唯一 ID 可以通过 cuStreamGetCaptureInfo 查询。

如果mode不是 CU_STREAM_CAPTURE_MODE_RELAXED,cuStreamEndCapture 必须从同一线程在此流上调用。

注意

使用此 API 捕获的内核不得使用纹理和表面引用。通过任何纹理或表面引用进行读取或写入是未定义的行为。此限制不适用于纹理和表面对象。

注意

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

另请参阅

cuStreamBeginCapture, cuStreamCreate, cuStreamIsCapturing, cuStreamEndCapture, cuThreadExchangeStreamCaptureMode, cuGraphAddNode,

CUresult cuStreamCopyAttributes ( CUstream dst, CUstream src )
将属性从源流复制到目标流。
参数
dst
目标流
src
源流。有关属性列表,请参阅 CUstreamAttrID
描述

将属性从源流复制src到目标流dst。两个流必须具有相同的上下文。

注意

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

另请参阅

CUaccessPolicyWindow

CUresult cuStreamCreate ( CUstream* phStream, unsigned int  Flags )
创建流。
参数
phStream
- 返回新创建的流
Flags
- 流创建的参数
描述

创建一个流并在phStream中返回句柄。Flags参数决定流的行为。

的有效值Flags

  • CU_STREAM_DEFAULT:默认流创建标志。

  • CU_STREAM_NON_BLOCKING:指定在创建的流中运行的工作可以与流 0(NULL 流)中的工作并发运行,并且创建的流不应与流 0 执行隐式同步。

注意

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

另请参阅

cuStreamDestroy, cuStreamCreateWithPriority, cuGreenCtxStreamCreate, cuStreamGetPriority, cuStreamGetFlags, cuStreamGetDevicecuStreamWaitEvent, cuStreamQuery, cuStreamSynchronize, cuStreamAddCallback, cudaStreamCreate, cudaStreamCreateWithFlags

CUresult cuStreamCreateWithPriority ( CUstream* phStream, unsigned int  flags, int  priority )
使用给定的优先级创建流。
参数
phStream
- 返回新创建的流
flags
- 流创建的标志。有关有效标志的列表,请参阅 cuStreamCreate
priority
- 流优先级。数字越小表示优先级越高。有关可以传递的有意义的流优先级的更多信息,请参阅 cuCtxGetStreamPriorityRange
描述

使用指定的优先级创建流,并在phStream中返回句柄。这会影响流中工作的调度优先级。优先级提供了一个提示,以便在可能的情况下优先运行优先级较高的工作,但不会抢占已在运行的工作或提供有关执行顺序的任何其他功能保证。

priority遵循数字越小表示优先级越高的约定。“0”表示默认优先级。有意义的数值优先级范围可以使用 cuCtxGetStreamPriorityRange 查询。如果指定的优先级超出 cuCtxGetStreamPriorityRange 返回的数值范围,它将自动钳制到范围内的最低或最高数字。

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

  • 只有计算能力为 3.5 或更高的 GPU 才支持流优先级。

  • 在当前的实现中,只有在优先级流中启动的计算内核才会受到流优先级的影响。流优先级对主机到设备和设备到主机的内存操作没有影响。

另请参阅

cuStreamDestroy, cuStreamCreate, cuGreenCtxStreamCreate, cuStreamGetPriority, cuCtxGetStreamPriorityRange, cuStreamGetFlags, cuStreamGetDevicecuStreamWaitEvent, cuStreamQuery, cuStreamSynchronize, cuStreamAddCallback, cudaStreamCreateWithPriority

CUresult cuStreamDestroy ( CUstream hStream )
销毁流。
参数
hStream
- 要销毁的流
描述

销毁由hStream.

指定的流。如果设备仍在流中执行工作hStream当调用 cuStreamDestroy() 时,该函数将立即返回,并且与hStream关联的资源将在设备完成hStream.

注意

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

另请参阅

中的所有工作后自动释放。cuStreamCreate, cuStreamWaitEvent, cuStreamQuery, cuStreamSynchronize, cuStreamAddCallback, cudaStreamDestroy

CUresult cuStreamEndCapture ( CUstream hStream, CUgraph* phGraph )
结束流上的捕获,返回捕获的图形。
参数
hStream
- 要查询的流
phGraph
- 捕获的图形
描述

结束hStream上的捕获,通过phGraph返回捕获的图形。捕获必须已在hStream上通过调用 cuStreamBeginCapture 启动。如果由于违反流捕获规则而使捕获无效,则将返回 NULL 图形。

如果 cuStreamBeginCapturemode参数不是 CU_STREAM_CAPTURE_MODE_RELAXED,则此调用必须与 cuStreamBeginCapture 来自同一线程。

注意

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

另请参阅

cuStreamCreate, cuStreamBeginCapture, cuStreamIsCapturing, cuGraphDestroy

CUresult cuStreamGetAttribute ( CUstream hStream, CUstreamAttrID attr, CUstreamAttrValue* value_out )
查询流属性。
参数
hStream
attr
value_out
描述

attr查询属性hStream并将其存储在value_out.

注意

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

另请参阅

CUaccessPolicyWindow

CUresult cuStreamGetCaptureInfo ( CUstream hStream, CUstreamCaptureStatus* captureStatus_out, cuuint64_t* id_out, CUgraph* graph_out, const CUgraphNode** dependencies_out, size_t* numDependencies_out )
查询流的捕获状态。
参数
hStream
- 要查询的流
captureStatus_out
- 返回流的捕获状态的位置;必需
id_out
- 可选位置,用于返回捕获序列的 ID,该 ID 在进程的生命周期内是唯一的
graph_out
- 可选位置,用于返回正在捕获到的图形。在捕获序列进行期间,允许对图形执行除销毁和节点删除之外的所有操作。此 API 不转移图形的所有权,图形的所有权在 cuStreamEndCapture 时转移或销毁。请注意,对于某些错误,图形句柄可能会在捕获结束之前失效。由于直接对图形执行操作而导致在 cuStreamEndCapture 时从原始流中无法访问或变得无法访问的节点不会触发 CUDA_ERROR_STREAM_CAPTURE_UNJOINED
dependencies_out
- 可选位置,用于存储指向节点数组的指针。流中要捕获的下一个节点将依赖于这组节点,除非存在诸如事件等待之类的操作修改此集合。数组指针在对流进行操作的下一个 API 调用之前或捕获终止之前有效。节点句柄可以复制出来,并且在节点或图形被销毁之前有效。驱动程序拥有的数组也可以直接传递给操作图形(而不是流)的 API,而无需复制。
numDependencies_out
- 可选位置,用于存储 dependencies_out 中返回的数组的大小。
描述

查询与流捕获相关的流状态。

如果在 CU_STREAM_LEGACY(“空流”)上调用,而在捕获时流不是使用 CU_STREAM_NON_BLOCKING 创建的,则返回 CUDA_ERROR_STREAM_CAPTURE_IMPLICIT

只有当以下两个条件都为真时,才会返回有效数据(捕获状态除外):

注意
  • 图形对象不是线程安全的。更多信息请点击此处

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

另请参阅

cuStreamGetCaptureInfo_v3cuStreamBeginCapture, cuStreamIsCapturing, cuStreamUpdateCaptureDependencies

CUresult cuStreamGetCaptureInfo_v3 ( CUstream hStream, CUstreamCaptureStatus* captureStatus_out, cuuint64_t* id_out, CUgraph* graph_out, const CUgraphNode** dependencies_out, const CUgraphEdgeData** edgeData_out, size_t* numDependencies_out )
查询流的捕获状态 (12.3+)。
参数
hStream
- 要查询的流
captureStatus_out
- 返回流的捕获状态的位置;必需
id_out
- 可选位置,用于返回捕获序列的 ID,该 ID 在进程的生命周期内是唯一的
graph_out
- 可选位置,用于返回正在捕获到的图形。在捕获序列进行期间,允许对图形执行除销毁和节点删除之外的所有操作。此 API 不转移图形的所有权,图形的所有权在 cuStreamEndCapture 时转移或销毁。请注意,对于某些错误,图形句柄可能会在捕获结束之前失效。由于直接对图形执行操作而导致在 cuStreamEndCapture 时从原始流中无法访问或变得无法访问的节点不会触发 CUDA_ERROR_STREAM_CAPTURE_UNJOINED
dependencies_out
- 可选位置,用于存储指向节点数组的指针。流中要捕获的下一个节点将依赖于这组节点,除非存在诸如事件等待之类的操作修改此集合。数组指针在对流进行操作的下一个 API 调用之前或捕获终止之前有效。节点句柄可以复制出来,并且在节点或图形被销毁之前有效。驱动程序拥有的数组也可以直接传递给操作图形(而不是流)的 API,而无需复制。
edgeData_out
- 可选位置,用于存储指向图形边缘数据数组的指针。此数组与dependencies_out并行;要添加的下一个节点具有到dependencies_out[i] 的边缘,带有注释edgeData_out[i] 对于每个i。数组指针在对流进行操作的下一个 API 调用之前或捕获终止之前有效。
numDependencies_out
- 可选位置,用于存储 dependencies_out 中返回的数组的大小。
描述

查询与流捕获相关的流状态。

如果在 CU_STREAM_LEGACY(“空流”)上调用,而在捕获时流不是使用 CU_STREAM_NON_BLOCKING 创建的,则返回 CUDA_ERROR_STREAM_CAPTURE_IMPLICIT

只有当以下两个条件都为真时,才会返回有效数据(捕获状态除外):

如果edgeData_out如果 edgeData_out 为非 NULL,则dependencies_outdependencies_out 也必须为非 NULL。如果dependencies_outedgeData_out 为非 NULL,而edgeData_outdependencies_out 为 NULL,但一个或多个当前流依赖项存在非零边缘数据,则调用将返回 CUDA_ERROR_LOSSY_QUERY

注意
  • 图形对象不是线程安全的。更多信息请点击此处

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

另请参阅

cuStreamGetCaptureInfocuStreamBeginCapture, cuStreamIsCapturing, cuStreamUpdateCaptureDependencies

CUresult cuStreamGetCtx ( CUstream hStream, CUcontext* pctx )
查询与流关联的上下文。
参数
hStream
- 要查询的流句柄
pctx
- 返回与流关联的上下文
描述

返回流关联的 CUDA 上下文。

请注意,此 API 有一个更新的版本 cuStreamGetCtx_v2。它将在 CUDA 13.0 中取代此版本。建议在此之前使用 cuStreamGetCtx_v2,因为此版本对于通过 API cuGreenCtxStreamCreate 创建的流将返回 CUDA_ERROR_NOT_SUPPORTED

流句柄hStreamhStream 可以引用以下任何内容:

注意

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

另请参阅

cuStreamDestroy, cuStreamCreateWithPriority, cuStreamGetPriority, cuStreamGetFlags, cuStreamGetDevicecuStreamWaitEvent, cuStreamQuery, cuStreamSynchronize, cuStreamAddCallback, cudaStreamCreate, cuStreamGetCtx_v2, cudaStreamCreateWithFlags

CUresult cuStreamGetCtx_v2 ( CUstream hStream, CUcontext* pCtx, CUgreenCtx* pGreenCtx )
查询与流关联的上下文。
参数
hStream
- 要查询的流句柄
pCtx
- 返回与流关联的常规上下文
pGreenCtx
- 如果流与绿色上下文关联,则返回绿色上下文;否则返回 NULL
描述

返回流与之关联的上下文。

如果流与绿色上下文关联,则 API 会在pGreenCtx中返回绿色上下文,并在pCtx.

中返回关联设备的主上下文。pCtx如果流与常规上下文关联,则 API 会在pGreenCtx.

流句柄hStreamhStream 可以引用以下任何内容:

注意

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

另请参阅

中返回绿色上下文。 如果常规上下文是当前上下文,则 API 在

中返回常规上下文。 请注意,如果绿色上下文是调用线程的当前上下文,则指定 CU_STREAM_PER_THREADcudaStreamPerThread 将返回 CUDA_ERROR_INVALID_HANDLE。 如果没有上下文是调用线程的当前上下文,则返回 CUDA_ERROR_INVALID_CONTEXT
参数
hStream
- 要查询的流句柄
CUresult cuStreamGetDevice ( CUstream hStream, CUdevice* device )
返回流的设备句柄。
返回值

device

描述

- 返回流所属的设备CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_CONTEXT, CUDA_ERROR_INVALID_VALUE, CUDA_ERROR_INVALID_HANDLE, CUDA_ERROR_OUT_OF_MEMORY

注意

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

另请参阅

*device

中返回流的设备句柄
参数
hStream
- 要查询的流句柄
flags
CUresult cuStreamGetFlags ( CUstream hStream, unsigned int* flags ) flags查询给定流的标志。
返回值

device

描述

- 指向一个无符号整数的指针,流的标志将返回到该整数中。在flags.

注意

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

另请参阅

中返回的值是创建此流时使用的所有标志的逻辑“OR”。有关有效标志的列表,请参阅 cuStreamCreate

查询使用 cuStreamCreatecuStreamCreateWithPrioritycuGreenCtxStreamCreate 创建的流的标志,并在
中返回标志。
参数
hStream
- 要查询的流句柄
cuStreamDestroy, cuStreamCreate, cuGreenCtxStreamCreate, cuStreamGetPriority, cudaStreamGetFlagscuStreamGetDevice
CUresult cuStreamGetId ( CUstream hStream, unsigned long long* streamId )
描述

- 返回流所属的设备cuStreamDestroy, cuStreamCreate, cuGreenCtxStreamCreate, cuStreamGetPriority, cudaStreamGetFlagscuStreamGetDevice返回与提供的流句柄关联的唯一 ID。

流句柄hStreamhStream 可以引用以下任何内容:

  • streamId

  • - 用于存储流 ID 的指针

注意

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

另请参阅

与给定流句柄关联的唯一 ID。该 ID 在程序的生命周期内是唯一的。

通过任何 CUDA 驱动程序 API(例如 cuStreamCreatecuStreamCreateWithPriority)或其运行时 API 等效项(例如 cudaStreamCreatecudaStreamCreateWithFlagscudaStreamCreateWithPriority)创建的流。传递无效的句柄将导致未定义的行为。
任何特殊流,例如 NULL 流、CU_STREAM_LEGACYCU_STREAM_PER_THREAD。 也接受这些的运行时 API 等效项,分别为 NULL、cudaStreamLegacycudaStreamPerThread
参数
hStream
- 要查询的流句柄
priority
cuStreamDestroy, cuStreamCreate, cuStreamGetPriority, cudaStreamGetId
返回值

device

描述

CUresult cuStreamGetPriority ( CUstream hStream, int* priority ) priority查询给定流的优先级。

注意

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

另请参阅

- 指向一个有符号整数的指针,流的优先级将返回到该整数中

查询使用 cuStreamCreatecuStreamCreateWithPrioritycuGreenCtxStreamCreate 创建的流的优先级,并在
中返回优先级。 请注意,如果流的创建优先级超出了 cuCtxGetStreamPriorityRange 返回的数值范围,则此函数将返回钳制后的优先级。 有关优先级钳制的详细信息,请参见 cuStreamCreateWithPriority
返回值

返回流的捕获状态。

描述

captureStatushStream- 返回流的捕获状态cuStreamDestroy, cuStreamCreate, cuStreamCreateWithPriority, cuGreenCtxStreamCreate, cuCtxGetStreamPriorityRange, cuStreamGetFlags, cuStreamGetDevicecudaStreamGetPriorityCUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_VALUE, CUDA_ERROR_STREAM_CAPTURE_IMPLICIT通过返回

  • 的捕获状态。 成功调用后,

  • *captureStatus

  • 将包含以下内容之一hStream.

CU_STREAM_CAPTURE_STATUS_NONE:流未捕获。通过CU_STREAM_CAPTURE_STATUS_ACTIVE:流正在捕获。

CU_STREAM_CAPTURE_STATUS_INVALIDATED:流正在捕获,但错误使捕获序列无效。必须在启动捕获序列的流上使用 cuStreamEndCapture 终止捕获序列,以便继续使用

注意

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

另请参阅

请注意,如果在同一上下文中阻塞流正在捕获时,在 CU_STREAM_LEGACY (“空流”)上调用此函数,它将返回 CUDA_ERROR_STREAM_CAPTURE_IMPLICIT,并且

在调用后未指定。阻塞流捕获不会失效。
当阻塞流正在捕获时,传统流处于不可用状态,直到阻塞流捕获终止。传统流不支持流捕获,但尝试使用将对捕获流具有隐式依赖性。
返回值

CUresult cuStreamQuery ( CUstream hStream )

描述

确定计算流的状态。hStream- 要查询状态的流

CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_CONTEXT, CUDA_ERROR_INVALID_HANDLE, CUDA_ERROR_NOT_READY

注意
  • 此函数使用标准 默认流 语义。

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

另请参阅

如果由

指定的流中的所有操作均已完成,则返回 CUDA_SUCCESS,否则返回 CUDA_ERROR_NOT_READY
出于统一内存的目的,返回值 CUDA_SUCCESS 等效于已调用 cuStreamSynchronize()
描述

CUresult cuStreamSetAttribute ( CUstream hStream, CUstreamAttrID attr, const CUstreamAttrValue* value ) attr设置流属性。hStreamvaluecuStreamCreate, cuStreamWaitEvent, cuStreamDestroy, cuStreamSynchronize, cuStreamAddCallback, cudaStreamQuery

注意

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

另请参阅

CUaccessPolicyWindow

上设置属性
,属性来自
参数
hStream
的相应属性。 更新后的属性将应用于后续提交到流的工作。 它不会影响之前提交的工作。
描述

CUresult cuStreamSynchronize ( CUstream hStream ) hStream等待流的任务完成。

注意
  • 此函数使用标准 默认流 语义。

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

另请参阅

- 要等待的流

等待设备完成由
指定的流中的所有操作。 如果上下文是使用 CU_CTX_SCHED_BLOCKING_SYNC 标志创建的,则 CPU 线程将阻塞,直到流完成其所有任务。
参数
hStream
cuStreamCreate, cuStreamDestroy, cuStreamWaitEvent, cuStreamQuery, cuStreamAddCallback, cudaStreamSynchronize
dependencies
CUresult cuStreamUpdateCaptureDependencies ( CUstream hStream, CUgraphNode* dependencies, size_t numDependencies, unsigned int  flags )
numDependencies
更新捕获流中的依赖项集合 (11.3+)。
flags
- 要更新的流
返回值

- 要添加的依赖项集合

描述

- 依赖项数组的大小

- 见上文

CUDA_SUCCESS, CUDA_ERROR_INVALID_VALUE, CUDA_ERROR_ILLEGAL_STATE

修改捕获流的依赖项集合。 依赖项集合是流中下一个捕获节点将依赖的节点集合。

有效标志为 CU_STREAM_ADD_CAPTURE_DEPENDENCIESCU_STREAM_SET_CAPTURE_DEPENDENCIES。 这些标志控制传递给 API 的集合是添加到现有集合还是替换现有集合。 标志值为 0 时,默认为 CU_STREAM_ADD_CAPTURE_DEPENDENCIES

另请参阅

如果通过此 API 从依赖项集合中删除的节点在 cuStreamEndCapture 时无法从流中访问,则不会导致 CUDA_ERROR_STREAM_CAPTURE_UNJOINED

如果流未在捕获,则返回 CUDA_ERROR_ILLEGAL_STATE
此 API 在 CUDA 11.3 中是新增的。 需要跨 CUDA 11.0 的次要版本兼容性的开发人员不应使用此 API 或提供回退。
参数
hStream
cuStreamCreate, cuStreamDestroy, cuStreamWaitEvent, cuStreamQuery, cuStreamAddCallback, cudaStreamSynchronize
dependencies
CUresult cuStreamUpdateCaptureDependencies ( CUstream hStream, CUgraphNode* dependencies, size_t numDependencies, unsigned int  flags )
dependencyData
- 与每个依赖项关联的可选数据数组。
numDependencies
更新捕获流中的依赖项集合 (11.3+)。
flags
- 要更新的流
返回值

- 要添加的依赖项集合

描述

cuStreamBeginCapture, cuStreamGetCaptureInfo,

- 见上文

CUDA_SUCCESS, CUDA_ERROR_INVALID_VALUE, CUDA_ERROR_ILLEGAL_STATE

修改捕获流的依赖项集合。 依赖项集合是流中下一个捕获节点将依赖的节点集合。

另请参阅

如果通过此 API 从依赖项集合中删除的节点在 cuStreamEndCapture 时无法从流中访问,则不会导致 CUDA_ERROR_STREAM_CAPTURE_UNJOINED

CUresult cuStreamUpdateCaptureDependencies_v2 ( CUstream hStream, CUgraphNode* dependencies, const CUgraphEdgeData* dependencyData, size_t numDependencies, unsigned int  flags )
更新捕获流中的依赖项集合 (12.3+)。
参数
hStream
修改捕获流的依赖项集合。 依赖项集合是流中下一个捕获节点将依赖的节点集合,以及这些依赖项的边缘数据。
CUresult cuStreamWaitEvent ( CUstream hStream, CUevent hEvent, unsigned int  Flags )
使计算流等待事件。
Flags
- 要等待的流
返回值

hEvent

描述

- 要等待的事件(不能为 NULL)hStream- 请参见 CUevent_capture_flags CUresult cuStreamWaitEvent ( CUstream hStream, CUevent hEvent, unsigned int  Flags ) CUDA_SUCCESS, CUDA_ERROR_DEINITIALIZED, CUDA_ERROR_NOT_INITIALIZED, CUDA_ERROR_INVALID_CONTEXT, CUDA_ERROR_INVALID_HANDLE, CUresult cuStreamWaitEvent ( CUstream hStream, CUevent hEvent, unsigned int  Flags ) 使所有未来提交到hStream.

的工作等待在

  • 中捕获的所有工作。 有关事件捕获内容的详细信息,请参见 cuEventRecord()。 同步将在设备上高效执行(如果适用)。

  • 可能来自与

注意
  • 此函数使用标准 默认流 语义。

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

另请参阅

不同的上下文或设备。

标志包括
CU_EVENT_WAIT_DEFAULT:默认事件创建标志。
参数
mode
CU_EVENT_WAIT_EXTERNAL:在执行流捕获时,事件在图中作为外部事件节点捕获。 此标志在流捕获之外无效。
描述

cuStreamCreate, cuEventRecord, cuStreamQuery, cuStreamSynchronize, cuStreamAddCallback, cuStreamDestroy, cudaStreamWaitEvent CUresult cuThreadExchangeStreamCaptureMode ( CUstreamCaptureMode* mode ) 交换线程的流捕获交互模式。 CUresult cuThreadExchangeStreamCaptureMode ( CUstreamCaptureMode* mode ) - 指向要与当前模式交换的模式值的指针

CUstreamCaptureMode mode = desiredMode;
           cuThreadExchangeStreamCaptureMode(&mode);
           ...
           cuThreadExchangeStreamCaptureMode(&mode); // restore previous mode

将调用线程的流捕获交互模式设置为

*mode

中包含的值,并使用线程的先前模式覆盖

  • 。 为了便于跨函数或模块边界的确定性行为,鼓励调用方以压入弹出方式使用此 API在流捕获期间(参见 cuStreamBeginCapture),某些操作(例如调用 cudaMalloc)可能不安全。 在 cudaMalloc 的情况下,该操作不会异步排队到流中,并且流捕获不会观察到该操作。 因此,如果通过 cuStreamBeginCapture 捕获的操作序列依赖于每次启动图形时重放的分配,则捕获的图形将无效。因此,流捕获对可以在 cuStreamBeginCapture-cuStreamEndCapture 序列中或与其并发进行的 API 调用施加了限制。 此行为可以通过此 API 和 cuStreamBeginCapture 的标志进行控制。线程的模式为以下之一CU_STREAM_CAPTURE_MODE_GLOBAL这是默认模式。 如果本地线程具有未通过以下方式启动的正在进行的捕获序列。 为了便于跨函数或模块边界的确定性行为,鼓励调用方以压入弹出方式使用此 APICU_STREAM_CAPTURE_MODE_RELAXED

  • 如果本地线程有一个正在进行的捕获序列,但该序列并非由 <待补充说明的启动方式> 启动,因此,流捕获对可以在 cuStreamBeginCapture-cuStreamEndCapture 序列中或与其并发进行的 API 调用施加了限制。 此行为可以通过此 API 和 cuStreamBeginCapture 的标志进行控制。则禁止它进行潜在不安全的 API 调用。其他线程中的并发捕获序列将被忽略。

  • 因此,流捕获对可以在 cuStreamBeginCapture-cuStreamEndCapture 序列中或与其并发进行的 API 调用施加了限制。 此行为可以通过此 API 和 cuStreamBeginCapture 的标志进行控制。本地线程不会被禁止进行潜在不安全的 API 调用。请注意,该线程仍然禁止进行与流捕获必然冲突的 API 调用,例如,尝试对上次在捕获序列中记录的事件进行 cuEventQuery 查询操作。

注意

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

另请参阅

CU_STREAM_CAPTURE_MODE_GLOBAL