通用一维数组的抽象表示。 更多...
数据结构 | |
结构体 | VPIArrayBufferAOS |
存储关于数组特性和内容的信息。 更多... | |
结构体 | VPIArrayBuffer |
表示访问数组内容的可用方法。 更多... | |
结构体 | VPIArrayData |
存储关于数组特性和内容的信息。 更多... | |
类型定义 | |
typedef struct VPIArrayImpl * | VPIArray |
数组的句柄。 | |
枚举 | |
枚举 | VPIArrayBufferType |
表示数组数据的存储方式。 更多... | |
枚举 | VPIArrayType |
数组元素格式。 更多... | |
通用一维数组的抽象表示。
使用 API 创建一维数组容器有两种方法。最基本的方法是使用 vpiArrayCreate 来分配和初始化一个空的(零初始化的)VPIArray 对象。数组数据的内存由后端实现分配和管理。容量和类型等参数是不可变的,并在构造时指定。内部内存布局也是后端特定的。更重要的是,不同硬件块之间高效的数组数据交换可能迫使实现程序在多个内存池(例如,dGPU 和系统 DRAM)中分配内存。在某些情况下(为了优化性能和内存使用),限制内部分配策略以仅支持一组特定的后端可能是有益的。
为了实现与现有主机端或 GPU 端代码的互操作,用户还可以创建一个数组对象,该对象封装用户分配(和管理)的数组数据。与 vpiArrayCreate 类似,传递给 vpiArrayCreateWrapper 的数组参数是固定的。
只要新的封装内存具有与原始封装内存相同的缓冲区类型、容量和类型,就可以通过调用 vpiArraySetWrapper 来重新定义封装的内存。 一次创建 VPIArray 封装器并在以后重用它,比一直创建和销毁它更有效。
vpiArrayLockData / vpiArrayUnlock 集合允许从主机读取/写入数组数据。 这些函数是非阻塞的,并且忽略流命令队列,因此用户有责任确保所有使用此数组作为输入或输出的挂起操作都已完成。 此外,根据内存分配在哪个设备上,锁定/解锁操作可能非常耗时,例如,对于 dGPU,可能涉及通过 PCIe 总线复制数据。
struct VPIArrayBufferAOS |
数据字段 | ||
---|---|---|
VPIArrayType | type | 每个数组元素的类型。 |
int32_t * | sizePointer | 指向数组中元素数量的指针。
|
int32_t | capacity | 数组可以容纳的最大元素数量。
|
int32_t | strideBytes | 每个数组元素的大小(以字节为单位)。
|
void * | data | 指向数组的第一个元素。 |
struct VPIArrayBuffer |
struct VPIArrayData |
数据字段 | ||
---|---|---|
VPIArrayBufferType | bufferType | 数组缓冲区类型。 它定义了必须使用 VPIArrayBuffer 标记联合的哪个成员来访问数组内容。 |
VPIArrayBuffer | buffer | 存储数组内容。 |
enum VPIArrayBufferType |
#include <vpi/Array.h>
表示数组数据的存储方式。
枚举器 | |
---|---|
VPI_ARRAY_BUFFER_INVALID | 无效的缓冲区类型。 通常用于表示未选择缓冲区类型。 |
VPI_ARRAY_BUFFER_HOST_AOS | 主机可访问的结构体数组。 |
VPI_ARRAY_BUFFER_CUDA_AOS | CUDA 可访问的结构体数组。 |
enum VPIArrayType |
#include <vpi/ArrayType.h>
数组元素格式。
枚举器 | |
---|---|
VPI_ARRAY_TYPE_INVALID | 信号类型转换错误。 |
VPI_ARRAY_TYPE_S8 | 有符号 8 位。 |
VPI_ARRAY_TYPE_U8 | 无符号 8 位。 |
VPI_ARRAY_TYPE_S16 | 有符号 16 位。 |
VPI_ARRAY_TYPE_U16 | 无符号 16 位。 |
VPI_ARRAY_TYPE_U32 | 无符号 32 位。 |
VPI_ARRAY_TYPE_KEYPOINT_F32 | VPIKeypointF32 元素。 |
VPI_ARRAY_TYPE_HOMOGRAPHY_TRANSFORM_2D | |
VPI_ARRAY_TYPE_KLT_TRACKED_BOUNDING_BOX | |
VPI_ARRAY_TYPE_F32 | 32 位浮点数。 |
VPI_ARRAY_TYPE_KEYPOINT_U32 | VPIKeypointU32 元素,U32 格式。 |
VPI_ARRAY_TYPE_KEYPOINT_UQ1616 | VPIKeypointU32 元素,UQ1616 定点格式。 |
VPI_ARRAY_TYPE_STATISTICS | VPIStats 元素。 |
VPI_ARRAY_TYPE_BRIEF_DESCRIPTOR | |
VPI_ARRAY_TYPE_MATCHES | VPIMatches 元素。 |
VPI_ARRAY_TYPE_DCF_TRACKED_BOUNDING_BOX | |
VPI_ARRAY_TYPE_PYRAMIDAL_KEYPOINT_F32 | |
VPI_ARRAY_TYPE_APRILTAG_DETECTION | |
VPI_ARRAY_TYPE_POSE | VPIPose 元素。 |
定义于文件 ArrayType.h 的第 69 行。
VPIStatus vpiArrayCreate | ( | int32_t | capacity, |
VPIArrayType | type, | ||
uint64_t | flags, | ||
VPIArray * | array | ||
) |
#include <vpi/Array.h>
创建一个空的数组实例。
数组数据被初始化为零。数组的最大容量是固定的,并在构造时定义。数组大小设置为零。 VPIArray 对象拥有分配的内存。
[in] | capacity | capacity
|
[in] | type | 每个数组元素的类型。
|
[in] | flags | type
|
VPIBackend 标志。此数组可用于在这些后端中运行的算法。 如果没有传递后端标志,并且 VPI_REQUIRE_BACKENDS 标志不存在,则它将考虑活动上下文支持的所有后端。 | 通用对象标志 | 如果给定标志 VPI_REQUIRE_BACKENDS,则用户必须至少传递一个有效的后端,并且它们都必须在当前上下文中启用。 |
array | 指向将接收创建的数组句柄的内存的指针。 |
返回值 | VPI_ERROR_INVALID_ARRAY_TYPE |
返回值 | 无效的 type 。 |
返回值 | VPI_ERROR_INVALID_ARGUMENT |
返回值 | 无效的 flags 。 |
capacity 超出有效范围。 | array 为 NULL 或不表示 VPIArray 实例。 |
未给出后端且设置了 VPI_REQUIRE_BACKENDS。 | VPI_ERROR_OUT_OF_MEMORY |
没有足够的资源来分配数组。 | VPI_ERROR_INVALID_CONTEXT |
当前上下文已销毁。 | VPI_ERROR_INVALID_OPERATION |
VPI_SUCCESS | ( | 操作成功执行。 | data, |
uint64_t | flags, | ||
VPIArray * | array | ||
) |
#include <vpi/Array.h>
◆ vpiArrayCreateWrapper()
VPIStatus vpiArrayCreateWrapper
const VPIArrayData *
[in] | data | data
| ||||||
[in] | flags | flags
|
VPIBackend 标志。此数组可用于在这些后端中运行的算法。 如果没有传递后端标志,并且 VPI_REQUIRE_BACKENDS 标志不存在,则它将考虑活动上下文支持的所有后端。 | 通用对象标志 | 如果给定标志 VPI_REQUIRE_BACKENDS,则用户必须至少传递一个有效的后端,并且它们都必须在当前上下文中启用。 |
返回值 | [in] |
返回值 | data |
返回值 | 指向要封装的内存缓冲区的结构的指针。 |
返回值 | 无效的 flags 。 |
capacity 超出有效范围。 | 强制性,不能为 NULL。 |
未给出后端且设置了 VPI_REQUIRE_BACKENDS。 | VPI_ERROR_OUT_OF_MEMORY |
没有足够的资源来分配数组。 | VPI_ERROR_INVALID_CONTEXT |
没有足够的资源来分配数组。 | flags |
当前上下文已销毁。 | VPI_ERROR_INVALID_OPERATION |
缓冲区类型 | ( | 添加的标志 | 通用对象标志, |
操作成功执行。 | VPI_ARRAY_BUFFER_HOST_AOS | ||
) |
#include <vpi/Array.h>
VPI_BACKEND_CPU
VPI_ARRAY_BUFFER_CUDA_AOS
VPI_BACKEND_CUDA
[in] | 通用对象标志 | 如果给定了后端并且设置了 VPI_REQUIRE_BACKENDS,则它们都必须在当前上下文中启用。
|
[in] | data | array
|
返回值 | array 为 NULL。 |
返回值 | data 为 NULL 或包含无效/不支持的值。 |
返回值 | flags 无效。 |
没有足够的资源来分配数组。 | capacity 无效。 |
没有足够的资源来分配数组。 | type 无效。 |
没有足够的资源来分配数组。 | strideBytes 无效。 |
当前上下文已销毁。 | VPI_ERROR_INVALID_OPERATION |
sizePointer
无效。data 中的缓冲区类型不受支持。 |
( | 添加的标志 | 通用对象标志 | ) |
#include <vpi/Array.h>
VPI_ERROR_OUT_OF_MEMORY
没有足够的资源来创建数组。
[in] | 通用对象标志 | VPI_ERROR_INVALID_CONTEXT
|
自动添加的后端标志在当前上下文中未启用。 | ( | 添加的标志 | 通用对象标志, |
VPI_SUCCESS | 操作成功执行。 | ||
) |
#include <vpi/Array.h>
◆ vpiArraySetWrapper()
[in] | 通用对象标志 | VPIStatus vpiArraySetWrapper
|
VPIBackend 标志。此数组可用于在这些后端中运行的算法。 如果没有传递后端标志,并且 VPI_REQUIRE_BACKENDS 标志不存在,则它将考虑活动上下文支持的所有后端。 | VPIArray | array
|
返回值 | VPI_ERROR_INVALID_ARGUMENT |
返回值 | const VPIArrayData * |
当前上下文已销毁。 | VPI_ERROR_INVALID_OPERATION |
在现有的 VPIArray 封装器中重新定义封装的内存缓冲区。 | ( | 添加的标志 | 通用对象标志, |
int32_t | 操作成功执行。 | ||
) |
数组句柄。 | ( | 添加的标志 | 通用对象标志, |
VPI_SUCCESS | 它必须由 vpiArrayCreateWrapper 创建。 | ||
) |
#include <vpi/Array.h>
数组不得被锁定。
[in] | 通用对象标志 | VPIStatus vpiArraySetWrapper
|
VPIBackend 标志。此数组可用于在这些后端中运行的算法。 如果没有传递后端标志,并且 VPI_REQUIRE_BACKENDS 标志不存在,则它将考虑活动上下文支持的所有后端。 | capacity | data
|
封装的内存必须指向与给定缓冲区类型对应的缓冲区。 | ( | 添加的标志 | 通用对象标志, |
VPI_SUCCESS | 返回值 | ||
) |
#include <vpi/Array.h>
VPI_ERROR_INVALID_ARGUMENT
[in] | 通用对象标志 | VPIStatus vpiArraySetWrapper
|
VPIBackend 标志。此数组可用于在这些后端中运行的算法。 如果没有传递后端标志,并且 VPI_REQUIRE_BACKENDS 标志不存在,则它将考虑活动上下文支持的所有后端。 | strideBytes | data 为 NULL。
|
array 不是使用 vpiArrayCreateWrapper 创建的。 |
( | 添加的标志 | 通用对象标志, |
data 容量和/或格式与 array 不匹配。 |
VPI_ERROR_BUFFER_LOCKED | ||
) |
#include <vpi/Array.h>
array
被锁定。
[in] | 通用对象标志 | VPIStatus vpiArraySetWrapper
|
VPIBackend 标志。此数组可用于在这些后端中运行的算法。 如果没有传递后端标志,并且 VPI_REQUIRE_BACKENDS 标志不存在,则它将考虑活动上下文支持的所有后端。 | flags | VPI_SUCCESS
|
void vpiArrayDestroy | ( | 添加的标志 | 通用对象标志, |
VPIArray | array | ||
) |
#include <vpi/Array.h>
销毁数组实例。
[in] | 通用对象标志 | VPIStatus vpiArraySetWrapper
|
VPIBackend 标志。此数组可用于在这些后端中运行的算法。 如果没有传递后端标志,并且 VPI_REQUIRE_BACKENDS 标志不存在,则它将考虑活动上下文支持的所有后端。 | type | 此函数释放数组创建函数分配的所有资源。销毁 VPIArray 封装器时,封装的内存本身不会被释放。
|
array | ( | 添加的标志 | 通用对象标志, |
要销毁的数组句柄。允许传递 NULL,函数对此不执行任何操作。 | 先决条件 | ||
) |
指向变量的指针,该变量将被设置为数组的大小。 | ( | 添加的标志 | 通用对象标志, |
要销毁的数组句柄。允许传递 NULL,函数对此不执行任何操作。 | int32_t * , | ||
返回值 | VPI_ERROR_INVALID_ARGUMENT, | ||
输出 size 指针为 NULL。 |
VPI_ARRAY_BUFFER_HOST_AOS | ||
) |
#include <vpi/Array.h>
VPI_SUCCESS
操作成功执行。
VPIStatus vpiArrayGetSize
[in] | 通用对象标志 | VPIArray
| ||||||
[in] | VPI_ERROR_INVALID_ARGUMENT | VPIArray | ||||||
[in] | int32_t * | size | ||||||
VPIBackend 标志。此数组可用于在这些后端中运行的算法。 如果没有传递后端标志,并且 VPI_REQUIRE_BACKENDS 标志不存在,则它将考虑活动上下文支持的所有后端。 | data | array
|
[in] | ( | 添加的标志 | 通用对象标志 | ) |
#include <vpi/Array.h>
array
有效的数组句柄。
size
[in] | 通用对象标志 | VPIStatus vpiArraySetWrapper
|
返回值 | VPI_ERROR_INVALID_ARGUMENT |
没有足够的资源来分配数组。 | 数组的新大小。 |
当前上下文已销毁。 | 现有的封装数组和新数组必须具有相同的容量和元素类型。 |