VPI - 视觉编程接口

3.2 版本

上下文

上下文是对象在其激活时创建及其属性的隐式所有者。 更多...

数据结构

struct  VPIParallelForConfig
 存储 ParallelFor 配置。 更多...
 

#define VPI_INVALID_CONTEXT   ((VPIContext)-1)
 表示上下文已被销毁或由于其他原因而无效。
 

类型定义

typedef void(* VPIParallelTask) (int taskId, int threadId, void *vpiData)
 并行任务函数指针类型。
 
typedef void(* VPIParallelForCallback) (VPIParallelTask task, int taskCount, void *vpiData, void *userData)
 Parallel for 回调函数指针类型。 更多...
 
typedef void * VPINativeThreadHandle
 操作系统特定线程句柄的句柄。
 
typedef struct VPIContextImpl * VPIContext
 上下文的句柄。
 

函数

VPIStatus vpiContextCreate (uint64_t flags, VPIContext *ctx)
 创建上下文实例。 更多...
 
VPIStatus vpiContextCreateWrapperCUDA (uint64_t flags, CUcontext cudaCtx, VPIContext *ctx)
 创建包装 CUDA 上下文的上下文实例。 更多...
 
void vpiContextDestroy (VPIContext ctx)
 销毁上下文实例及其拥有的所有资源。 更多...
 
VPIStatus vpiContextSetParallelFor (VPIContext ctx, const VPIParallelForConfig *config)
 控制上下文拥有的 CPU 设备的低级任务并行性。 更多...
 
VPIStatus vpiContextGetParallelFor (VPIContext ctx, VPIParallelForConfig *config)
 返回由 vpiContextSetParallelFor 设置的参数。 更多...
 
VPIStatus vpiContextGetCurrent (VPIContext *ctx)
 获取调用线程的上下文。 更多...
 
VPIStatus vpiContextSetCurrent (VPIContext ctx)
 设置调用线程的上下文。 更多...
 
VPIStatus vpiContextPush (VPIContext ctx)
 将上下文推送到每个线程的上下文堆栈,并将此上下文设置为调用线程的当前上下文。 更多...
 
VPIStatus vpiContextPop (VPIContext *ctx)
 从每个线程的上下文堆栈中弹出一个上下文,并将其保存到 ctx 变量中。 更多...
 
VPIStatus vpiContextGetFlags (VPIContext ctx, uint64_t *flags)
 获取当前上下文标志。 更多...
 

特殊上下文

#define VPI_GLOBAL_CONTEXT   ((VPIContext)0x610BA1C1D)
 全局上下文标识符。
 

详细描述

上下文是对象在其激活时创建及其属性的隐式所有者。

这是一个顶层类,用于管理所有其他 API 对象的生命周期和属性。 具体来说,它具有以下属性


数据结构文档

◆ VPIParallelForConfig

struct VPIParallelForConfig

存储 ParallelFor 配置。

定义于文件 Types.h198 行。

+ VPIParallelForConfig 的协作图
数据字段
int maxThreads parallel_for 实现代码使用的最大线程数。

必须大于 0。 将数字设置为 N 意味着并行 for 实现将使用任务 ID 在 0 到 N-1 之间的任务 functor。 使用此范围之外的线程 ID 调用任务 functor 是不合法的,并且会导致未定义的行为。

VPIParallelForCallback callback 指向 parallel_for 实现的指针。

如果传递 null,上下文将回退到默认的内部 parallel_for 实现。 parallel_for 实现必须是线程安全的。 内部 API 实现可能会同时从不同的线程调用此函数。

void * userData 传递给回调函数的用户定义的 opaque 指针,保持不变。

类型定义文档

◆ VPIParallelForCallback

typedef void(* VPIParallelForCallback) (VPIParallelTask task, int taskCount, void *vpiData, void *userData)

#include <vpi/Types.h>

Parallel for 回调函数指针类型。

此函数的串行(参考)实现可能如下所示

void parallel_for(VPIParallelTask task, int taskCount, void *vpiData, void *userData)
{
for (int i = 0; i < taskCount; ++i)
{
task(i, 0, vpiData);
}
}
void(* VPIParallelTask)(int taskId, int threadId, void *vpiData)
并行任务函数指针类型。
定义: Types.h:167

并行实现应具有等效的行为;也就是说,运行 0 到 taskCount-1 之间的所有任务,并阻止调用线程,直到所有任务完成。 threadId 参数应介于 0 和 maxThreads-1 之间 (

另请参阅
vpiContextSetParallelFor)。 将 maxThreads 设置为零的实现可以将任意 threadId 值传递给任务函数。

定义于文件 Types.h191 行。

函数文档

◆ vpiContextCreate()

VPIStatus vpiContextCreate ( uint64_t  flags,
VPIContext ctx 
)

#include <vpi/Context.h>

创建上下文实例。

上下文拥有以下在其激活时创建的对象

上下文中启用的后端限制了在上下文处于活动状态时创建对象时可以启用的允许后端。

上下文已创建,并且内部资源已分配。 但它尚未分配给调用线程。 为此,请使用 vpiContextSetCurrentvpiContextPush

参数
[in]flags位字段,用于指定上下文的所需特性。
  • 该字段必须是以下标志中零个或多个的组合
  • 如果给出了后端,则其对应的硬件必须可用。
[out]ctx指向将接收新上下文句柄的内存的指针。
返回值
VPI_ERROR_INVALID_ARGUMENT输出 ctx 为 NULL。
VPI_ERROR_INVALID_ARGUMENTflags 无效。
VPI_ERROR_INVALID_ARGUMENT未给出任何后端,并且设置了 VPI_REQUIRE_BACKENDS
VPI_ERROR_INVALID_OPERATION请求的后端在当前系统中不可用。
VPI_SUCCESS操作执行成功。

◆ vpiContextCreateWrapperCUDA()

VPIStatus vpiContextCreateWrapperCUDA ( uint64_t  flags,
CUcontext  cudaCtx,
VPIContext ctx 
)

#include <vpi/Context.h>

创建包装 CUDA 上下文的上下文实例。

每当创建的上下文处于活动状态时,CUDA 操作都将在包装的上下文下进行。

注意
目前 VPI 不对 CUDA 上下文执行任何操作,因此当前调用执行方式与 vpiContextCreate 完全相同。

关于在此上下文处于活动状态时创建的对象的行为与 vpiContextCreate 相同。

参数
[in]flags位字段,用于指定上下文的所需特性。
  • 该字段必须是以下标志中零个或多个的组合
  • 如果给出了后端,则其对应的硬件必须可用。
[in]cudaCtxCUDA 上下文句柄,要包装。
  • 强制性,不能为 NULL。
  • 它必须是有效的 CUDA 上下文。
[out]ctx指向将接收创建的上下文句柄的内存的指针。
返回值
VPI_ERROR_INVALID_ARGUMENT输出 ctx 为 NULL。
VPI_ERROR_INVALID_ARGUMENTflags 无效。
VPI_ERROR_INVALID_ARGUMENTcudaCtx 为 NULL 或不代表有效的 CUDA 上下文。
VPI_ERROR_OUT_OF_MEMORY没有足够的资源来创建上下文。
VPI_ERROR_INVALID_OPERATION请求的后端在当前系统中不可用。
VPI_SUCCESS操作执行成功。

◆ vpiContextDestroy()

void vpiContextDestroy ( VPIContext  ctx)

#include <vpi/Context.h>

销毁上下文实例及其拥有的所有资源。

无论上下文在多少线程中处于活动状态,都将被销毁。 调用函数有责任确保在 vpiContextDestroy 执行时,没有使用 ctx 发出 API 调用。

上下文销毁后,将同步与之关联的所有流,然后销毁与之关联的所有对象。

如果上下文是调用线程的当前上下文,那么它也将从当前线程的上下文堆栈中弹出,就像调用了 vpiContextPop 一样。 如果上下文是其他线程的当前上下文,那么它将保持为这些线程的当前上下文,并且尝试从这些线程访问它将导致错误 VPI_ERROR_INVALID_CONTEXT

参数
[in]ctx上下文句柄。 允许传递 NULL,函数对此不执行任何操作。 传递 VPI_GLOBAL_CONTEXT 也使其不执行任何操作,因为无法销毁全局上下文。

◆ vpiContextSetParallelFor()

VPIStatus vpiContextSetParallelFor ( VPIContext  ctx,
const VPIParallelForConfig config 
)

#include <vpi/Context.h>

控制上下文拥有的 CPU 设备的低级任务并行性。

此函数允许用户重载 CPU 后端使用的 parallel_for 实现。 在正在执行 CPU 处理的上下文中更改此 parallel_for 实现是未定义的,并且可能导致应用程序崩溃。

创建上下文时,使用的 parallel_for 实现是默认实现。 它允许每个 CPU 任务平等地使用所有可用的核心。

参数
[in]ctx上下文句柄。
  • 强制性,不能为 NULL 或无效。
[in]config指向 parallel_for 配置的指针。 传递 NULL 将使上下文回退到其默认的内部实现。
返回值
VPI_ERROR_INVALID_ARGUMENTctx 为 NULL 或无效。
VPI_SUCCESS操作执行成功。

◆ vpiContextGetParallelFor()

VPIStatus vpiContextGetParallelFor ( VPIContext  ctx,
VPIParallelForConfig config 
)

#include <vpi/Context.h>

返回由 vpiContextSetParallelFor 设置的参数。

参数
[in]ctx上下文句柄。
  • 强制性,不能为 NULL 或无效。
[out]config指向 parallel_for 配置的指针。
  • 强制性,不能为 NULL。
返回值
VPI_ERROR_INVALID_ARGUMENT输出 config 指针为 NULL。
VPI_ERROR_INVALID_ARGUMENTctx 为 NULL 或无效。
VPI_SUCCESS操作执行成功。

◆ vpiContextGetCurrent()

VPIStatus vpiContextGetCurrent ( VPIContext ctx)

#include <vpi/Context.h>

获取调用线程的上下文。

参数
[out]ctx指向上下文句柄的指针。
  • 强制性,不能为 NULL 或无效。
返回值
VPI_ERROR_INVALID_ARGUMENT输出 ctx 为 NULL。
VPI_ERROR_INVALID_CONTEXT当前上下文已销毁。
VPI_SUCCESS操作执行成功

◆ vpiContextSetCurrent()

VPIStatus vpiContextSetCurrent ( VPIContext  ctx)

#include <vpi/Context.h>

设置调用线程的上下文。

如果上下文堆栈不为空,此函数将替换线程堆栈的顶部(当前上下文)。

参数
[in]ctx上下文句柄。
  • 强制性,不能为 NULL 或无效;
返回值
VPI_ERROR_INVALID_ARGUMENTctx 为 NULL 或无效值。
VPI_SUCCESS操作执行成功。

◆ vpiContextPush()

VPIStatus vpiContextPush ( VPIContext  ctx)

#include <vpi/Context.h>

将上下文推送到每个线程的上下文堆栈,并将此上下文设置为调用线程的当前上下文。

  • 最多可以将 8 个上下文推送到堆栈。
参数
[in]ctx上下文句柄。
  • 强制性,不能为 NULL。
  • 它必须是有效的上下文。
返回值
VPI_ERROR_INVALID_CONTEXTctx 无效。
VPI_ERROR_INVALID_ARGUMENTctx 为 NULL。
VPI_ERROR_INVALID_OPERATION堆栈大小超出有效范围。
VPI_ERROR_INVALID_CONTEXT当前上下文已销毁。
VPI_SUCCESS操作执行成功

◆ vpiContextPop()

VPIStatus vpiContextPop ( VPIContext ctx)

#include <vpi/Context.h>

从每个线程的上下文堆栈中弹出一个上下文,并将其保存到 ctx 变量中。

弹出操作后,上下文堆栈顶部的上下文将成为调用线程的当前(活动)上下文。

  • 上下文堆栈不能为空。
参数
[out]ctx指向接收弹出上下文的上下文句柄的指针。 如果为 NULL,它仍会弹出上下文,但不会返回它。
返回值
VPI_ERROR_INVALID_OPERATION无法从空堆栈中弹出。
VPI_SUCCESS操作执行成功。

◆ vpiContextGetFlags()

VPIStatus vpiContextGetFlags ( VPIContext  ctx,
uint64_t *  flags 
)

#include <vpi/Context.h>

获取当前上下文标志。

此函数可用于验证当前上下文的底层后端支持。

参数
[in]ctx上下文句柄。
  • 强制性,不能为 NULL 或无效;
[out]flags指向将设置为当前上下文标志的变量的指针。
  • 强制性,不能为 NULL。
返回值
VPI_ERROR_INVALID_ARGUMENT输出 flags 为 NULL。
VPI_ERROR_INVALID_ARGUMENTctx 为 NULL。
VPI_ERROR_INVALID_CONTEXTctx 无效。
VPI_ERROR_INVALID_CONTEXT当前上下文已销毁。
VPI_SUCCESS操作执行成功。