6.19. 事件管理

本节介绍底层 CUDA 驱动程序应用程序编程接口的事件管理功能。

函数

CUresult cuEventCreate ( CUevent* phEvent, unsigned int  Flags )
创建事件。
CUresult cuEventDestroy ( CUevent hEvent )
销毁事件。
CUresult cuEventElapsedTime ( float* pMilliseconds, CUevent hStart, CUevent hEnd )
计算两个事件之间经过的时间。
CUresult cuEventElapsedTime_v2 ( float* pMilliseconds, CUevent hStart, CUevent hEnd )
计算两个事件之间经过的时间。
CUresult cuEventQuery ( CUevent hEvent )
查询事件的状态。
CUresult cuEventRecord ( CUevent hEvent, CUstream hStream )
记录事件。
CUresult cuEventRecordWithFlags ( CUevent hEvent, CUstream hStream, unsigned int  flags )
记录事件。
CUresult cuEventSynchronize ( CUevent hEvent )
等待事件完成。

函数

CUresult cuEventCreate ( CUevent* phEvent, unsigned int  Flags )
创建事件。
参数
phEvent
- 返回新创建的事件
Flags
- 事件创建标志
描述

为当前上下文创建事件 *phEvent,并使用以下标志指定Flags。 有效标志包括

注意

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

另请参阅

cuEventRecord, cuEventQuery, cuEventSynchronize, cuEventDestroy, cuEventElapsedTime, cudaEventCreate, cudaEventCreateWithFlags

CUresult cuEventDestroy ( CUevent hEvent )
销毁事件。
参数
hEvent
- 要销毁的事件
描述

销毁由以下指定的事件hEvent.

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

注意

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

另请参阅

cuEventCreate, cuEventRecord, cuEventQuery, cuEventSynchronize, cuEventElapsedTime, cudaEventDestroy

CUresult cuEventElapsedTime ( float* pMilliseconds, CUevent hStart, CUevent hEnd )
计算两个事件之间经过的时间。
参数
pMilliseconds
- 时间间隔在hStarthEnd单位:毫秒
hStart
- 起始事件
hEnd
- 结束事件
描述

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

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

如果尚未在任一事件上调用 cuEventRecord(),则返回 CUDA_ERROR_INVALID_HANDLE。如果已在两个事件上调用 cuEventRecord(),但其中一个或两个事件尚未完成(即,cuEventQuery() 将在至少一个事件上返回 CUDA_ERROR_NOT_READY),则返回 CUDA_ERROR_NOT_READY。如果任一事件是使用 CU_EVENT_DISABLE_TIMING 标志创建的,则此函数将返回 CUDA_ERROR_INVALID_HANDLE

请注意,此 API 有一个较新版本 cuEventElapsedTime_v2。它将在 CUDA 13.0 中取代此版本,此版本保留用于次要版本兼容性。

注意

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

另请参阅

cuEventCreate, cuEventRecord, cuEventQuery, cuEventSynchronize, cuEventDestroy, cuEventElapsedTime, cudaEventElapsedTime

CUresult cuEventElapsedTime_v2 ( float* pMilliseconds, CUevent hStart, CUevent hEnd )
计算两个事件之间经过的时间。
参数
pMilliseconds
- 时间间隔在hStarthEnd单位:毫秒
hStart
- 起始事件
hEnd
- 结束事件
描述

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

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

如果尚未在任一事件上调用 cuEventRecord(),则返回 CUDA_ERROR_INVALID_HANDLE。如果已在两个事件上调用 cuEventRecord(),但其中一个或两个事件尚未完成(即,cuEventQuery() 将在至少一个事件上返回 CUDA_ERROR_NOT_READY),则返回 CUDA_ERROR_NOT_READY。如果任一事件是使用 CU_EVENT_DISABLE_TIMING 标志创建的,则此函数将返回 CUDA_ERROR_INVALID_HANDLE

注意

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

另请参阅

cuEventCreate, cuEventRecord, cuEventQuery, cuEventSynchronize, cuEventDestroy, cuEventElapsedTime, cudaEventElapsedTime

CUresult cuEventQuery ( CUevent hEvent )
查询事件的状态。
参数
hEvent
hEvent
返回值

- 要查询的事件

描述

查询当前由以下捕获的所有工作的状态hEventcuEventRecord() 详细介绍了事件捕获的内容。

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

对于统一内存的目的,返回 CUDA_SUCCESS 值等同于调用 cuEventSynchronize()

注意

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

另请参阅

cuEventCreate, cuEventRecord, cuEventSynchronize, cuEventDestroy, cuEventElapsedTime, cudaEventQuery

CUresult cuEventRecord ( CUevent hEvent, CUstream hStream )
记录事件。
参数
hEvent
hEvent
- 要记录的事件
hStream
返回值

- 要记录事件的流

描述

捕获在hEventhStream- 要记录的事件的内容,在调用时。hEvent- 要记录的事件hStream 必须来自同一上下文,否则返回 CUDA_ERROR_INVALID_HANDLE。然后,诸如 cuEventQuery()cuStreamWaitEvent() 之类的调用将检查或等待捕获的工作完成。使用 hEvent 在此调用之后不会修改 hEvent。有关默认情况下捕获的内容,请参阅关于默认流行为的注释。- 要记录的事件hEventhEvent

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

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

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

另请参阅

cuEventCreate, cuEventQuery, cuEventSynchronize, cuStreamWaitEvent, cuEventDestroy, cuEventElapsedTime, cudaEventRecord, cuEventRecordWithFlags

CUresult cuEventRecordWithFlags ( CUevent hEvent, CUstream hStream, unsigned int  flags )
记录事件。
参数
hEvent
hEvent
- 要记录的事件
hStream
flags
- 请参阅 CUevent_capture_flags
返回值

- 要记录事件的流

描述

捕获在hEventhStream- 要记录的事件的内容,在调用时。hEvent- 要记录的事件hStream 必须来自同一上下文,否则返回 CUDA_ERROR_INVALID_HANDLE。然后,诸如 cuEventQuery()cuStreamWaitEvent() 之类的调用将检查或等待捕获的工作完成。使用 hEvent 在此调用之后不会修改 hEvent。有关默认情况下捕获的内容,请参阅关于默认流行为的注释。- 要记录的事件hEventhEvent

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

标志包括

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

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

另请参阅

cuEventCreate, cuEventQuery, cuEventSynchronize, cuStreamWaitEvent, cuEventDestroy, cuEventElapsedTime, cuEventRecord, cudaEventRecord

CUresult cuEventSynchronize ( CUevent hEvent )
等待事件完成。
参数
hEvent
- 等待的事件
描述

等待直到当前捕获在事件中的所有工作完成。hEventcuEventRecord() 详细介绍了事件捕获的内容。

等待使用 CU_EVENT_BLOCKING_SYNC 标志创建的事件将导致调用 CPU 线程阻塞,直到设备完成该事件。如果未设置 CU_EVENT_BLOCKING_SYNC 标志,则 CPU 线程将忙等待,直到设备完成该事件。

注意

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

另请参阅

cuEventCreate, cuEventRecord, cuEventQuery, cuEventDestroy, cuEventElapsedTime, cudaEventSynchronize