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 为当前设备创建事件对象。

注意

另请参阅

cudaEventCreate ( C++ API), cudaEventCreateWithFlags, cudaEventRecord, cudaEventQuery, cudaEventSynchronize, cudaEventDestroy, cudaEventElapsedTime, cudaStreamWaitEvent, cuEventCreate

__host____device__cudaError_t cudaEventCreateWithFlags ( cudaEvent_t* event, unsigned int  flags )
使用指定的标志创建事件对象。
参数
event
- 新创建的事件
flags
- 新事件的标志
描述

使用指定的标志为当前设备创建事件对象。 有效标志包括

注意

另请参阅

cudaEventCreate ( C API), cudaEventSynchronize, cudaEventDestroy, cudaEventElapsedTime, cudaStreamWaitEvent, cuEventCreate

__host____device__cudaError_t cudaEventDestroy ( cudaEvent_t event )
销毁事件对象。
参数
event
- 要销毁的事件
描述

销毁由event.

指定的事件。事件可能在完成之前被销毁(即,当 cudaEventQuery() 将返回 cudaErrorNotReady 时)。 在这种情况下,调用不会阻塞事件的完成,并且任何关联的资源将在完成时自动异步释放。

注意

另请参阅

cudaEventCreate ( C API), cudaEventCreateWithFlags, cudaEventQuery, cudaEventSynchronize, cudaEventRecord, cudaEventElapsedTime, cuEventDestroy

__host__cudaError_t cudaEventElapsedTime ( float* ms, cudaEvent_t start, cudaEvent_t end )
计算事件之间经过的时间。
参数
ms
- 之间的时间startend以毫秒为单位
start
- 开始事件
end
- 结束事件
描述

计算两个事件之间经过的时间(以毫秒为单位,分辨率约为 0.5 微秒)。

如果任一事件上次记录在非 NULL 流中,则结果时间可能大于预期(即使两者都使用相同的流句柄)。 发生这种情况是因为 cudaEventRecord() 操作是异步发生的,并且不能保证测量的延迟实际上只是在两个事件之间。 任何数量的其他不同流操作都可能在两个测量的事件之间执行,从而以显着的方式改变计时。

如果尚未对任一事件调用 cudaEventRecord(),则返回 cudaErrorInvalidResourceHandle。 如果已对两个事件都调用了 cudaEventRecord(),但其中一个或两个事件尚未完成(即,cudaEventQuery() 将在至少一个事件上返回 cudaErrorNotReady),则返回 cudaErrorNotReady。 如果任一事件是使用 cudaEventDisableTiming 标志创建的,则此函数将返回 cudaErrorInvalidResourceHandle

注意

另请参阅

cudaEventCreate ( C API), cudaEventCreateWithFlags, cudaEventQuery, cudaEventSynchronize, cudaEventDestroy, cudaEventRecord, cuEventElapsedTime

__host__cudaError_t cudaEventElapsedTime_v2 ( float* ms, cudaEvent_t start, cudaEvent_t end )
计算事件之间经过的时间。
参数
ms
- 之间的时间startend以毫秒为单位
start
- 开始事件
end
- 结束事件
描述

计算两个事件之间经过的时间(以毫秒为单位,分辨率约为 0.5 微秒)。 请注意,此 API 不保证返回待处理工作的最新错误。 因此,此 API 仅旨在用作经过时间计算,并且应使用 cudaEventQuery 完成对要比较的事件的轮询。

如果任一事件上次记录在非 NULL 流中,则结果时间可能大于预期(即使两者都使用相同的流句柄)。 发生这种情况是因为 cudaEventRecord() 操作是异步发生的,并且不能保证测量的延迟实际上只是在两个事件之间。 任何数量的其他不同流操作都可能在两个测量的事件之间执行,从而以显着的方式改变计时。

如果尚未对任一事件调用 cudaEventRecord(),则返回 cudaErrorInvalidResourceHandle。 如果已对两个事件都调用了 cudaEventRecord(),但其中一个或两个事件尚未完成(即,cudaEventQuery() 将在至少一个事件上返回 cudaErrorNotReady),则返回 cudaErrorNotReady。 如果任一事件是使用 cudaEventDisableTiming 标志创建的,则此函数将返回 cudaErrorInvalidResourceHandle

注意

另请参阅

cudaEventCreate ( C API), cudaEventCreateWithFlags, cudaEventQuery, cudaEventSynchronize, cudaEventDestroy, cudaEventRecord, cuEventElapsedTime

__host__cudaError_t cudaEventQuery ( cudaEvent_t event )
查询事件的状态。
参数
event
- 要查询的事件
描述

查询当前由event捕获的所有工作的状态。 有关事件捕获内容的详细信息,请参阅 cudaEventRecord()

如果所有捕获的工作都已完成,则返回 cudaSuccess;如果任何捕获的工作未完成,则返回 cudaErrorNotReady

为了统一内存的目的,返回值 cudaSuccess 等同于调用了 cudaEventSynchronize()

注意

另请参阅

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在此调用时。eventstream必须在同一 CUDA 上下文中。 诸如 cudaEventQuery()cudaStreamWaitEvent() 之类的调用将检查或等待捕获的工作完成。 此调用之后使用stream不会修改event。 有关默认情况下捕获的内容,请参阅关于默认流行为的注释。

可以在同一事件上多次调用 cudaEventRecord(),并且会覆盖先前捕获的状态。 诸如 cudaStreamWaitEvent() 之类的其他 API 使用 API 调用时最近捕获的状态,并且不受以后对 cudaEventRecord() 的调用的影响。 在首次调用 cudaEventRecord() 之前,事件表示一组空的工作,因此例如 cudaEventQuery() 将返回 cudaSuccess

注意

另请参阅

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在此调用时。eventstream必须在同一 CUDA 上下文中。 诸如 cudaEventQuery()cudaStreamWaitEvent() 之类的调用将检查或等待捕获的工作完成。 此调用之后使用stream不会修改event。 有关默认情况下捕获的内容,请参阅关于默认流行为的注释。

可以在同一事件上多次调用 cudaEventRecordWithFlags(),并且会覆盖先前捕获的状态。 诸如 cudaStreamWaitEvent() 之类的其他 API 使用 API 调用时最近捕获的状态,并且不受以后对 cudaEventRecordWithFlags() 的调用的影响。 在首次调用 cudaEventRecordWithFlags() 之前,事件表示一组空的工作,因此例如 cudaEventQuery() 将返回 cudaSuccess

标志包括

注意

另请参阅

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 线程将忙等待,直到事件被设备完成。

注意

另请参阅

cudaEventCreate ( C API), cudaEventCreateWithFlags, cudaEventRecord, cudaEventQuery, cudaEventDestroy, cudaEventElapsedTime, cuEventSynchronize