6.6. 事件管理
本节介绍 CUDA 运行时应用程序编程接口的事件管理功能。
函数
- __host__ cudaError_t cudaEventCreate ( cudaEvent_t* event )
- 创建事件对象。
- __host__ __device__ cudaError_t cudaEventCreateWithFlags ( cudaEvent_t* event, unsigned int flags )
- 使用指定的标志创建事件对象。
- __host__ __device__ cudaError_t cudaEventDestroy ( cudaEvent_t event )
- 销毁事件对象。
- __host__ cudaError_t cudaEventElapsedTime ( float* ms, cudaEvent_t start, cudaEvent_t end )
- 计算事件之间经过的时间。
- __host__ cudaError_t cudaEventElapsedTime_v2 ( float* ms, cudaEvent_t start, cudaEvent_t end )
- 计算事件之间经过的时间。
- __host__ cudaError_t cudaEventQuery ( cudaEvent_t event )
- 查询事件的状态。
- __host__ __device__ cudaError_t cudaEventRecord ( cudaEvent_t event, cudaStream_t stream = 0 )
- 记录事件。
- __host__ cudaError_t cudaEventRecordWithFlags ( cudaEvent_t event, cudaStream_t stream = 0, unsigned int flags = 0 )
- 记录事件。
- __host__ cudaError_t cudaEventSynchronize ( cudaEvent_t event )
- 等待事件完成。
函数
- __host__ cudaError_t cudaEventCreate ( cudaEvent_t* event )
-
创建事件对象。
参数
- event
- - 新创建的事件
描述
使用 cudaEventDefault 为当前设备创建事件对象。
注意-
请注意,此函数也可能返回先前异步启动的错误代码。
-
请注意,如果此调用尝试初始化内部 CUDA RT 状态,此函数也可能返回 cudaErrorInitializationError、cudaErrorInsufficientDriver 或 cudaErrorNoDevice。
-
请注意,根据 cudaStreamAddCallback 的规定,不得从回调中调用任何 CUDA 函数。 在这种情况下,cudaErrorNotPermitted 可能会(但不保证)作为诊断信息返回。
另请参阅
cudaEventCreate ( C++ API), cudaEventCreateWithFlags, cudaEventRecord, cudaEventQuery, cudaEventSynchronize, cudaEventDestroy, cudaEventElapsedTime, cudaStreamWaitEvent, cuEventCreate
- __host__ __device__ cudaError_t cudaEventCreateWithFlags ( cudaEvent_t* event, unsigned int flags )
-
使用指定的标志创建事件对象。
参数
- event
- - 新创建的事件
- flags
- - 新事件的标志
描述
使用指定的标志为当前设备创建事件对象。 有效标志包括
-
cudaEventDefault:默认事件创建标志。
-
cudaEventBlockingSync:指定事件应使用阻塞同步。 使用 cudaEventSynchronize() 等待使用此标志创建的事件的主机线程将阻塞,直到事件实际完成。
-
cudaEventDisableTiming:指定创建的事件不需要记录计时数据。 当与 cudaStreamWaitEvent() 和 cudaEventQuery() 一起使用时,指定了此标志且未指定 cudaEventBlockingSync 标志的事件将提供最佳性能。
-
cudaEventInterprocess:指定创建的事件可以被 cudaIpcGetEventHandle() 用作进程间事件。 cudaEventInterprocess 必须与 cudaEventDisableTiming 一起指定。
注意-
请注意,此函数也可能返回先前异步启动的错误代码。
-
请注意,如果此调用尝试初始化内部 CUDA RT 状态,此函数也可能返回 cudaErrorInitializationError、cudaErrorInsufficientDriver 或 cudaErrorNoDevice。
-
请注意,根据 cudaStreamAddCallback 的规定,不得从回调中调用任何 CUDA 函数。 在这种情况下,cudaErrorNotPermitted 可能会(但不保证)作为诊断信息返回。
另请参阅
cudaEventCreate ( C API), cudaEventSynchronize, cudaEventDestroy, cudaEventElapsedTime, cudaStreamWaitEvent, cuEventCreate
- __host__ __device__ cudaError_t cudaEventDestroy ( cudaEvent_t event )
-
销毁事件对象。
参数
- event
- - 要销毁的事件
描述
销毁由event.
指定的事件。事件可能在完成之前被销毁(即,当 cudaEventQuery() 将返回 cudaErrorNotReady 时)。 在这种情况下,调用不会阻塞事件的完成,并且任何关联的资源将在完成时自动异步释放。
注意-
请注意,此函数也可能返回先前异步启动的错误代码。
-
请注意,如果此调用尝试初始化内部 CUDA RT 状态,此函数也可能返回 cudaErrorInitializationError、cudaErrorInsufficientDriver 或 cudaErrorNoDevice。
-
请注意,根据 cudaStreamAddCallback 的规定,不得从回调中调用任何 CUDA 函数。 在这种情况下,cudaErrorNotPermitted 可能会(但不保证)作为诊断信息返回。
-
在此调用之后使用句柄是未定义的行为。
-
如果传入 NULL 作为输入事件,则返回 cudaErrorInvalidResourceHandle。
另请参阅
cudaEventCreate ( C API), cudaEventCreateWithFlags, cudaEventQuery, cudaEventSynchronize, cudaEventRecord, cudaEventElapsedTime, cuEventDestroy
- __host__ cudaError_t cudaEventElapsedTime ( float* ms, cudaEvent_t start, cudaEvent_t end )
-
计算事件之间经过的时间。
参数
- ms
- - 之间的时间start和end以毫秒为单位
- start
- - 开始事件
- end
- - 结束事件
返回值
cudaSuccess, cudaErrorNotReady, cudaErrorInvalidValue, cudaErrorInvalidResourceHandle, cudaErrorLaunchFailure, cudaErrorUnknown
描述
计算两个事件之间经过的时间(以毫秒为单位,分辨率约为 0.5 微秒)。
如果任一事件上次记录在非 NULL 流中,则结果时间可能大于预期(即使两者都使用相同的流句柄)。 发生这种情况是因为 cudaEventRecord() 操作是异步发生的,并且不能保证测量的延迟实际上只是在两个事件之间。 任何数量的其他不同流操作都可能在两个测量的事件之间执行,从而以显着的方式改变计时。
如果尚未对任一事件调用 cudaEventRecord(),则返回 cudaErrorInvalidResourceHandle。 如果已对两个事件都调用了 cudaEventRecord(),但其中一个或两个事件尚未完成(即,cudaEventQuery() 将在至少一个事件上返回 cudaErrorNotReady),则返回 cudaErrorNotReady。 如果任一事件是使用 cudaEventDisableTiming 标志创建的,则此函数将返回 cudaErrorInvalidResourceHandle。
注意-
请注意,此函数也可能返回先前异步启动的错误代码。
-
请注意,如果此调用尝试初始化内部 CUDA RT 状态,此函数也可能返回 cudaErrorInitializationError、cudaErrorInsufficientDriver 或 cudaErrorNoDevice。
-
请注意,根据 cudaStreamAddCallback 的规定,不得从回调中调用任何 CUDA 函数。 在这种情况下,cudaErrorNotPermitted 可能会(但不保证)作为诊断信息返回。
-
如果传入 NULL 作为输入事件,则返回 cudaErrorInvalidResourceHandle。
另请参阅
cudaEventCreate ( C API), cudaEventCreateWithFlags, cudaEventQuery, cudaEventSynchronize, cudaEventDestroy, cudaEventRecord, cuEventElapsedTime
- __host__ cudaError_t cudaEventElapsedTime_v2 ( float* ms, cudaEvent_t start, cudaEvent_t end )
-
计算事件之间经过的时间。
参数
- ms
- - 之间的时间start和end以毫秒为单位
- start
- - 开始事件
- end
- - 结束事件
返回值
cudaSuccess, cudaErrorNotReady, cudaErrorInvalidValue, cudaErrorInvalidResourceHandle, cudaErrorLaunchFailure, cudaErrorUnknown
描述
计算两个事件之间经过的时间(以毫秒为单位,分辨率约为 0.5 微秒)。 请注意,此 API 不保证返回待处理工作的最新错误。 因此,此 API 仅旨在用作经过时间计算,并且应使用 cudaEventQuery 完成对要比较的事件的轮询。
如果任一事件上次记录在非 NULL 流中,则结果时间可能大于预期(即使两者都使用相同的流句柄)。 发生这种情况是因为 cudaEventRecord() 操作是异步发生的,并且不能保证测量的延迟实际上只是在两个事件之间。 任何数量的其他不同流操作都可能在两个测量的事件之间执行,从而以显着的方式改变计时。
如果尚未对任一事件调用 cudaEventRecord(),则返回 cudaErrorInvalidResourceHandle。 如果已对两个事件都调用了 cudaEventRecord(),但其中一个或两个事件尚未完成(即,cudaEventQuery() 将在至少一个事件上返回 cudaErrorNotReady),则返回 cudaErrorNotReady。 如果任一事件是使用 cudaEventDisableTiming 标志创建的,则此函数将返回 cudaErrorInvalidResourceHandle。
注意-
请注意,此函数也可能返回先前异步启动的错误代码。
-
请注意,如果此调用尝试初始化内部 CUDA RT 状态,此函数也可能返回 cudaErrorInitializationError、cudaErrorInsufficientDriver 或 cudaErrorNoDevice。
-
请注意,根据 cudaStreamAddCallback 的规定,不得从回调中调用任何 CUDA 函数。 在这种情况下,cudaErrorNotPermitted 可能会(但不保证)作为诊断信息返回。
-
如果传入 NULL 作为输入事件,则返回 cudaErrorInvalidResourceHandle。
另请参阅
cudaEventCreate ( C API), cudaEventCreateWithFlags, cudaEventQuery, cudaEventSynchronize, cudaEventDestroy, cudaEventRecord, cuEventElapsedTime
- __host__ cudaError_t cudaEventQuery ( cudaEvent_t event )
-
查询事件的状态。
参数
- event
- - 要查询的事件
返回值
cudaSuccess, cudaErrorNotReady, cudaErrorInvalidValue, cudaErrorInvalidResourceHandle, cudaErrorLaunchFailure
描述
查询当前由event捕获的所有工作的状态。 有关事件捕获内容的详细信息,请参阅 cudaEventRecord()。
如果所有捕获的工作都已完成,则返回 cudaSuccess;如果任何捕获的工作未完成,则返回 cudaErrorNotReady。
为了统一内存的目的,返回值 cudaSuccess 等同于调用了 cudaEventSynchronize()。
注意-
请注意,此函数也可能返回先前异步启动的错误代码。
-
请注意,如果此调用尝试初始化内部 CUDA RT 状态,此函数也可能返回 cudaErrorInitializationError、cudaErrorInsufficientDriver 或 cudaErrorNoDevice。
-
请注意,根据 cudaStreamAddCallback 的规定,不得从回调中调用任何 CUDA 函数。 在这种情况下,cudaErrorNotPermitted 可能会(但不保证)作为诊断信息返回。
-
如果传入 NULL 作为输入事件,则返回 cudaErrorInvalidResourceHandle。
另请参阅
cudaEventCreate ( C API), cudaEventCreateWithFlags, cudaEventRecord, cudaEventSynchronize, cudaEventDestroy, cudaEventElapsedTime, cuEventQuery
- __host__ __device__ cudaError_t cudaEventRecord ( cudaEvent_t event, cudaStream_t stream = 0 )
-
记录事件。
参数
- event
- - 要记录的事件
- stream
- - 在其中记录事件的流
描述
捕获在event的内容stream在此调用时。event和stream必须在同一 CUDA 上下文中。 诸如 cudaEventQuery() 或 cudaStreamWaitEvent() 之类的调用将检查或等待捕获的工作完成。 此调用之后使用stream不会修改event。 有关默认情况下捕获的内容,请参阅关于默认流行为的注释。
可以在同一事件上多次调用 cudaEventRecord(),并且会覆盖先前捕获的状态。 诸如 cudaStreamWaitEvent() 之类的其他 API 使用 API 调用时最近捕获的状态,并且不受以后对 cudaEventRecord() 的调用的影响。 在首次调用 cudaEventRecord() 之前,事件表示一组空的工作,因此例如 cudaEventQuery() 将返回 cudaSuccess。
注意-
此函数使用标准 默认流 语义。
-
请注意,此函数也可能返回先前异步启动的错误代码。
-
请注意,如果此调用尝试初始化内部 CUDA RT 状态,此函数也可能返回 cudaErrorInitializationError、cudaErrorInsufficientDriver 或 cudaErrorNoDevice。
-
请注意,根据 cudaStreamAddCallback 的规定,不得从回调中调用任何 CUDA 函数。 在这种情况下,cudaErrorNotPermitted 可能会(但不保证)作为诊断信息返回。
-
如果传入 NULL 作为输入事件,则返回 cudaErrorInvalidResourceHandle。
另请参阅
cudaEventCreate ( C API), cudaEventCreateWithFlags, cudaEventQuery, cudaEventSynchronize, cudaEventDestroy, cudaEventElapsedTime, cudaStreamWaitEvent, cudaEventRecordWithFlags, cuEventRecord
- __host__ cudaError_t cudaEventRecordWithFlags ( cudaEvent_t event, cudaStream_t stream = 0, unsigned int flags = 0 )
-
记录事件。
参数
- event
- - 要记录的事件
- stream
- - 在其中记录事件的流
- flags
- - 操作参数(见上文)
描述
捕获在event的内容stream在此调用时。event和stream必须在同一 CUDA 上下文中。 诸如 cudaEventQuery() 或 cudaStreamWaitEvent() 之类的调用将检查或等待捕获的工作完成。 此调用之后使用stream不会修改event。 有关默认情况下捕获的内容,请参阅关于默认流行为的注释。
可以在同一事件上多次调用 cudaEventRecordWithFlags(),并且会覆盖先前捕获的状态。 诸如 cudaStreamWaitEvent() 之类的其他 API 使用 API 调用时最近捕获的状态,并且不受以后对 cudaEventRecordWithFlags() 的调用的影响。 在首次调用 cudaEventRecordWithFlags() 之前,事件表示一组空的工作,因此例如 cudaEventQuery() 将返回 cudaSuccess。
标志包括
-
cudaEventRecordDefault:默认事件创建标志。
-
cudaEventRecordExternal:在执行流捕获时,事件在图中作为外部事件节点捕获。
注意-
此函数使用标准 默认流 语义。
-
请注意,此函数也可能返回先前异步启动的错误代码。
-
请注意,如果此调用尝试初始化内部 CUDA RT 状态,此函数也可能返回 cudaErrorInitializationError、cudaErrorInsufficientDriver 或 cudaErrorNoDevice。
-
请注意,根据 cudaStreamAddCallback 的规定,不得从回调中调用任何 CUDA 函数。 在这种情况下,cudaErrorNotPermitted 可能会(但不保证)作为诊断信息返回。
-
如果传入 NULL 作为输入事件,则返回 cudaErrorInvalidResourceHandle。
另请参阅
cudaEventCreate ( C API), cudaEventCreateWithFlags, cudaEventQuery, cudaEventSynchronize, cudaEventDestroy, cudaEventElapsedTime, cudaStreamWaitEvent, cudaEventRecord, cuEventRecord,
- __host__ cudaError_t cudaEventSynchronize ( cudaEvent_t event )
-
等待事件完成。
参数
- event
- - 要等待的事件
描述
等待直到当前捕获的所有工作完成event捕获的所有工作的状态。 有关事件捕获内容的详细信息,请参阅 cudaEventRecord()。
等待使用 cudaEventBlockingSync 标志创建的事件将导致调用 CPU 线程阻塞,直到事件被设备完成。 如果未设置 cudaEventBlockingSync 标志,则 CPU 线程将忙等待,直到事件被设备完成。
注意-
请注意,此函数也可能返回先前异步启动的错误代码。
-
请注意,如果此调用尝试初始化内部 CUDA RT 状态,此函数也可能返回 cudaErrorInitializationError、cudaErrorInsufficientDriver 或 cudaErrorNoDevice。
-
请注意,根据 cudaStreamAddCallback 的规定,不得从回调中调用任何 CUDA 函数。 在这种情况下,cudaErrorNotPermitted 可能会(但不保证)作为诊断信息返回。
-
如果传入 NULL 作为输入事件,则返回 cudaErrorInvalidResourceHandle。
另请参阅
cudaEventCreate ( C API), cudaEventCreateWithFlags, cudaEventRecord, cudaEventQuery, cudaEventDestroy, cudaEventElapsedTime, cuEventSynchronize