VPI - 视觉编程接口

3.2 版本

用于流同步和定时的事件表示。 更多...

类型定义

typedef struct VPIEventImpl * VPIEvent
 事件的句柄。
 

函数

VPIStatus vpiEventCreate (uint64_t flags, VPIEvent *event)
 创建事件实例。 更多...
 
void vpiEventDestroy (VPIEvent event)
 销毁事件实例以及它拥有的所有资源。 更多...
 
VPIStatus vpiEventRecord (VPIEvent event, VPIStream stream)
 在此调用时捕获事件中流命令队列的内容。 更多...
 
VPIStatus vpiEventSync (VPIEvent event)
 阻塞调用线程,直到事件被信号通知。 更多...
 
VPIStatus vpiEventQuery (VPIEvent event, VPIEventState *state)
 查询事件当前捕获的所有工作的状态。 更多...
 
VPIStatus vpiEventElapsedTimeMillis (VPIEvent start, VPIEvent end, float *msec)
 计算两个已完成事件之间经过的时间(以毫秒为单位)。 更多...
 
VPIStatus vpiEventGetFlags (VPIEvent event, uint64_t *flags)
 返回事件创建期间传递的事件标志。 更多...
 

事件特定的标志。

#define VPI_EVENT_DISABLE_TIMESTAMP   (1ULL << 63)
 禁用事件信号的时间戳。 更多...
 

详细描述

用于流同步和定时的事件表示。

API 中的每个计算函数都相对于调用线程异步执行,即立即返回而不等待完成。有两种与后端同步的方法。一种是等待 VPIStream 队列中的所有命令都使用 vpiStreamSync 调用完成。 这种方法虽然简单,但不允许细粒度的(“等待直到函数 X 完成”)或设备间的(“在设备 B 中运行函数 A 之前,等待设备 D 中的函数 C 完成”)同步。 这就是 VPIEvent 对象发挥作用的地方。 从概念上讲,它们对应于二进制信号量,旨在紧密模仿 CUDA API 中的事件

宏定义文档

◆ VPI_EVENT_DISABLE_TIMESTAMP

#define VPI_EVENT_DISABLE_TIMESTAMP   (1ULL << 63)

#include <vpi/Event.h>

禁用事件信号的时间戳。

它允许在涉及事件的操作中获得更好的性能。

定义于文件 Event.h 的第 105 行。

函数文档

◆ vpiEventCreate()

VPIStatus vpiEventCreate ( uint64_t  flags,
VPIEvent event 
)

#include <vpi/Event.h>

创建事件实例。

参数
[输入]flags位字段,指定事件的所需特性。
  • 该字段必须是零个或多个以下标志的组合
  • 如果给定标志 VPI_REQUIRE_BACKENDS,则用户必须至少传递一个有效的后端,并且它们都必须在当前上下文中启用。
[输出]event指向将接收创建的事件句柄的内存的指针。
  • 强制参数,不能为 NULL。
返回值
VPI_ERROR_INVALID_ARGUMENT输出 event 句柄为 NULL。
VPI_ERROR_INVALID_ARGUMENTflags 无效。
VPI_ERROR_INVALID_ARGUMENT未给定后端,并且设置了 VPI_REQUIRE_BACKENDS
VPI_ERROR_OUT_OF_MEMORY没有足够的资源来分配事件。
VPI_ERROR_INVALID_CONTEXT当前上下文无效。
VPI_ERROR_INVALID_OPERATION请求的后端在当前上下文中未启用。
VPI_SUCCESS操作成功执行。

◆ vpiEventDestroy()

void vpiEventDestroy ( VPIEvent  event)

#include <vpi/Event.h>

销毁事件实例以及它拥有的所有资源。

参数
[输入]event要销毁的事件句柄。它可以为 NULL。在这种情况下,该函数不执行任何操作。
  • 引用该事件的所有流都必须处于空闲状态,否则将导致未定义的行为。

◆ vpiEventRecord()

VPIStatus vpiEventRecord ( VPIEvent  event,
VPIStream  stream 
)

#include <vpi/Event.h>

在此调用时捕获事件中流命令队列的内容。

当记录的所有任务都完成后,事件将被信号通知,并且等待它的调用将被解除阻塞。

可以在同一事件上多次调用此函数,但是现有的 vpiEventSync / vpiStreamWaitEvent 调用不受后续 vpiEventRecord 调用的影响。 这意味着它们将等待先前 vpiEventSync / vpiStreamWaitEvent 调用时事件描述的命令队列任务的事件完成。

该操作将隐式刷新流。

参数
[输入]event一个事件句柄。
  • 强制参数,不能为 NULL。
[输入]stream一个流句柄,其包含待执行任务的命令队列将被记录在事件中。
  • 强制参数,不能为 NULL。
返回值
VPI_ERROR_INVALID_ARGUMENTevent 为 NULL 或不代表 VPIEvent 实例。
VPI_ERROR_INVALID_ARGUMENTstream 为 NULL 或无效,或者不代表 VPIStream 实例。
VPI_ERROR_INVALID_ARGUMENT事件没有启用流所需的后端。
VPI_ERROR_INTERNAL事件没有任何启用的后端用于记录。
VPI_ERROR_INVALID_CONTEXT当前上下文无效。
VPI_SUCCESS操作成功执行。

◆ vpiEventSync()

VPIStatus vpiEventSync ( VPIEvent  event)

#include <vpi/Event.h>

阻塞调用线程,直到事件被信号通知。

vpiEventRecord 捕获的所有任务都完成或未捕获任何任务时,该事件被视为已信号通知。

参数
[输入]event一个事件句柄。
  • 强制参数,不能为 NULL。
返回值
VPI_ERROR_INVALID_ARGUMENTevent 为 NULL 或不代表 VPIEvent 实例。
VPI_SUCCESS操作成功执行。

◆ vpiEventQuery()

VPIStatus vpiEventQuery ( VPIEvent  event,
VPIEventState state 
)

#include <vpi/Event.h>

查询事件当前捕获的所有工作的状态。

参数
[输入]event一个事件句柄。
  • 强制参数,不能为 NULL。
[输出]state指向将接收事件状态的内存的指针。 仅当返回的状态为 VPI_SUCCESS 时,返回的状态才有效。
返回值
VPI_ERROR_INVALID_ARGUMENT输出 state 指针为 NULL。
VPI_SUCCESS操作成功执行。

◆ vpiEventElapsedTimeMillis()

VPIStatus vpiEventElapsedTimeMillis ( VPIEvent  start,
VPIEvent  end,
float *  msec 
)

#include <vpi/Event.h>

计算两个已完成事件之间经过的时间(以毫秒为单位)。

参数
[输入]start标记时间间隔开始的事件句柄。
[输入]end标记时间间隔结束的事件句柄
[输出]msec指向变量的指针,该变量将被设置为事件信号之间的时差。
  • 强制参数,不能为 NULL。
返回值
VPI_ERROR_INVALID_ARGUMENTstartend 为 NULL 或不代表 VPIEvent 实例。
VPI_ERROR_INVALID_ARGUMENT输出 msec 指针为 NULL。
VPI_ERROR_INVALID_OPERATION至少一个事件创建时禁用了时间戳。
VPI_ERROR_NOT_READY至少一个事件未完成/信号通知。
VPI_SUCCESS操作成功执行。

◆ vpiEventGetFlags()

VPIStatus vpiEventGetFlags ( VPIEvent  event,
uint64_t *  flags 
)

#include <vpi/Event.h>

返回事件创建期间传递的事件标志。

参数
[输入]event一个事件句柄。
  • 强制参数,不能为 NULL。
[输出]flags指向将保存事件标志的内存的指针。
  • 它不能为 NULL。
返回值
VPI_ERROR_INVALID_ARGUMENTevent 为 NULL 或不代表 VPIEvent 实例。
VPI_ERROR_INVALID_ARGUMENTflags 为 NULL。
VPI_SUCCESS操作成功执行。