OpenVX实现平台与1.3版本的重要更新
1. OpenVX现有实现与平台
1.1 专用硬件实现
专用硬件能够实现特定功能的高度优化版本。在为特定功能分配硅块与该硅块带来的性能和功耗优势之间存在权衡。如果某个功能频繁使用且在标准处理器上消耗大量周期,那么它就适合进行定制硬件加速。而使用频率较低或在标准硬件上能快速运行的功能,通常最好留在标准处理器上执行,以最有效地利用硅片面积。
因此,结合专用硬件块的OpenVX实现通常也会有传统处理器来执行部分甚至大部分OpenVX功能。专用块仅用于少数能获得最大收益的功能。例如,卷积是一种常见的计算机视觉功能,在标准处理器架构上会消耗大量周期,所以它是专用硬件实现的热门功能。图像处理操作(如图像调整大小和颜色转换)也可在专用图像信号处理器(ISP)上运行。从应用程序员的角度来看,他们的OpenVX代码无需更改,但如果其图形中包含具有专用硬件块的功能,那么该功能的运行速度会更快,功耗也更低。
1.2 FPGA实现
虽然目前没有专门针对FPGA平台的OpenVX兼容实现,但其他类型平台的实现可以在FPGA上实例化。至少有一个DSP实现已为此进行了演示。FPGA可用于实现运行OpenVX的DSP,当然,也可以使用自定义FPGA块更直接地实现OpenVX功能。商业FPGA实现可能类似于专用硬件实现,可能会有一个传统处理器执行大部分API,同时有专用FPGA块用于少数受益于定制硬件的功能。鉴于FPGA平台和OpenVX API的灵活性,存在多种可能性。
1.3 混合片上系统(SoC)
现代SoC作为当今手机和自动驾驶车辆的核心,通常包含多种处理器,如多个CPU、GPU、DSP、ISP和一些专用硬件块。为SoC设计的OpenVX实现可以利用所有这些处理器。根据每个处理器的相对性能和功耗,特定功能或图形的部分可以发送到不同的处理器,并使用共享内存或直接内存访问(DMA)进行块之间的通信。单个图形可以在多个处理器上运行,从而通过并行性实现更高的性能。随着OpenVX在更复杂的SoC上部署,我们可以期待看到利用各种计算资源的实现。OpenVX应用程序员甚至无需知道他们的应用在哪个处理器上运行,他们只会看到低功耗下的高性能。
1.4 总结表格
| 实现类型 | 特点 | 适用场景 |
|---|---|---|
| 专用硬件实现 | 特定功能高度优化,结合传统处理器 | 频繁使用且耗时长的功能 |
| FPGA实现 | 可实例化其他平台实现,灵活性高 | 有定制需求的场景 |
| 混合SoC实现 | 利用多种处理器,并行运行 | 复杂系统,追求高性能低功耗 |
1.5 流程图
graph LR
A[OpenVX应用] --> B{选择实现方式}
B --> C[专用硬件实现]
B --> D[FPGA实现]
B --> E[混合SoC实现]
C --> F[传统处理器执行部分功能]
C --> G[专用硬件块执行特定功能]
D --> H[传统处理器执行大部分API]
D --> I[专用FPGA块执行特定功能]
E --> J[多处理器并行运行]
E --> K[共享内存或DMA通信]
2. OpenVX 1.3版本的变化
2.1 功能集
在OpenVX 1.3版本之前,所有实现者都必须支持主规范文档中描述的所有API和功能。为了将实现推向市场并符合OpenVX规范,使用相关的Khronos商标,必须通过一致性测试,以确保支持规范中描述的每个功能。随着时间的推移,规范中添加了越来越多的功能,但并非所有功能都适用于每个应用。如果实现者想专注于OpenVX的特定应用领域的客户,他们仍然需要实现所有功能,即使这些功能对他们没有用处。
为了解决这个问题,OpenVX工作组引入了功能集。功能集在要求每个人实现所有功能和让每个实现者独立决定支持哪些功能之间取得了平衡。功能集是为特定应用空间量身定制的规范的明确定义的连贯子集。应用开发者可以依赖几个功能集中每个功能集中的所有功能,因此他们只需检查他们使用的实现是否支持他们需要的功能集,然后就可以使用该功能集中的所有功能。
功能集在与主规范分开的文档中定义。初始功能集文档可在 此处 找到。该文档描述了几种不同类别的功能集,其中最重要的两种类型是一致性功能集和可选功能集。
2.2 一致性功能集和可选功能集
- 一致性功能集 :对于实现者来说非常重要,因为要将实现宣传为OpenVX兼容,甚至仅仅宣传为“OpenVX”,至少必须完全支持一个一致性功能集。规范中定义了三个一致性功能集:
- Vision :包含一组基本的经典视觉功能,大致对应于OpenVX规范1.1版本中可用的功能集。
- Neural Network :包含一组常见的神经网络“层”功能,对应于为OpenVX规范1.2版本定义的神经网络扩展。
- NNEF :参考Khronos神经网络交换格式规范,使应用程序能够导入和执行使用NNEF规范中描述的领域特定语言定义的神经网络。它基本上是神经网络的另一种实现方式,比Neural Network功能集中定义的层功能更灵活、功能更丰富。
- 可选功能集 :实现可以选择支持或不支持,除了至少支持一个一致性功能集之外。规范中定义了两个特定的可选功能集:
- Binary Image :引入了每个像素由单个位表示的图像,数据格式为VX_DF_IMAGE_U1。
- Enhanced Vision :大致对应于OpenVX规范1.2版本中引入的功能集。
2.3 基础功能集
基础功能集包含构建和执行OpenVX图形所需的基本框架元素。它既不是一致性功能集也不是可选功能集,而是组织性的。它不是一致性功能集,因为仅实现此功能集的实现无法获得OpenVX一致性认证,因为实际上在没有定义一些实际要在框架中使用的功能的情况下,无法使用基础功能集做任何事情。它也不是可选的,所有OpenVX实现都必须支持基础功能集中的所有功能。基础功能集主要用于在一致性功能集描述中引用这组核心功能,而无需重复所有功能,因此称为“组织性”。
2.4 功能集总结表格
| 功能集类型 | 具体功能集 | 描述 |
|---|---|---|
| 组织性 | Base | 构建和执行OpenVX图形的基本框架元素 |
| 一致性 | Vision | 基本经典视觉功能,对应1.1版本功能集 |
| 一致性 | Neural Network | 常见神经网络“层”功能,对应1.2版本扩展 |
| 一致性 | NNEF | 支持导入和执行NNEF定义的神经网络 |
| 可选 | Binary Image | 引入VX_DF_IMAGE_U1格式的二进制图像 |
| 可选 | Enhanced Vision | 对应1.2版本引入的功能集 |
2.5 二进制图像功能集
二进制图像功能集引入了每个像素由单个位表示的图像,数据格式为 VX_DF_IMAGE_U1 。在此数据格式引入之前,二进制图像必须用完整的8位字节表示,其中零表示为 0x00 (所有位为零),一表示为 0xFF (所有位设置为一),即十进制的255。如果实现支持二进制图像功能集,那么此类图像可以仅用每像素一位有效表示,节省数据空间,并可能显著加快关键二进制操作的执行速度。
该功能集支持的操作如下:
- 逻辑操作 :支持与(And)、或(Or)、非(Not)、异或(Xor)等逻辑操作。
- 非线性滤波 :包括通用的 vxNonLinearFilter 函数,以及特定的3×3形态学操作(膨胀Dilate、腐蚀Erode和中值Median)。
- 数据转换 :使用现有的 vxConvertDepth 函数支持U1图像与整数类型U8和S16之间的转换。
- 图像缩放和变形 :可以使用 vxScaleImage 和 vxWarpAffine 函数对U1图像进行缩放和仿射变换,但输入和输出图像必须都是U1格式,不允许混合格式。
- 特定函数输出 :如果实现支持二进制图像功能集,可以将 vxCannyEdgeDetector 和 vxThreshold 的输出参数设置为使用 VX_DF_IMAGE_U1 数据格式创建的图像,从而使输出真正表示为二进制。
- 特定函数输入 : vxHoughLinesP 、 vxMeanStdDev 和 vxNonMaxSuppression (仅掩码输入)可以接受二进制图像作为输入。
支持U1参数的函数总结如下表:
| 函数类型 | 具体函数 |
| — | — |
| 逻辑 | And, Not, Or, Xor |
| 非线性 | Dilate3x3, Erode3x3, Median3x3, NonLinearFilter |
| 重塑 | ConvertDepth, ScaleImage, WarpAffine |
| 二进制输出 | CannyEdgeDetector, Threshold |
| 二进制输入 | HoughLinesP, MeanStdDev, NonMaxSuppression (mask only) |
2.6 二进制图像功能集操作流程图
graph LR
A[输入图像] --> B{是否支持Binary Image功能集}
B -->|是| C[创建VX_DF_IMAGE_U1格式图像]
B -->|否| D[使用传统8位表示]
C --> E[选择操作类型]
E --> F[逻辑操作]
E --> G[非线性滤波]
E --> H[数据转换]
E --> I[图像缩放和变形]
E --> J[特定函数输出设置]
E --> K[特定函数输入使用]
3. 安全关键应用支持
3.1 功能合并与部署子集
OpenVX 1.3规范的一个重大改进是纳入了支持安全关键应用(如自动驾驶汽车)的功能。安全关键应用最初是通过基于OpenVX 1.1主规范的单独OpenVX - SC规范文档来处理的,它与OpenVX 1.2并行开发,因此不包含OpenVX 1.2的功能。在OpenVX 1.3中,安全关键功能被合并回主规范,不再需要单独的安全关键规范。
OpenVX 1.3在功能集规范中确定了整个规范的“部署”子集,即安全关键部署功能集。该功能集包含数据对象(如图像和张量)、高级上下文、图形和引用结构,以及一个“导入”对象,用于加载和执行图形。它不包含图形的内部细节(如内核、节点或参数),因为这些用于构建和验证图形的细节仅在离线时使用,运行时图形直接加载并执行。
3.2 需求标签
OpenVX 1.3规范还将需求标签纳入主规范。需求标签的形式为 [REQ - XXXX] ,其中“XXXX”是该需求的唯一数字标识符。这些标签最初在单独的OpenVX - SC文档中引入,在OpenVX 1.3中包含在主规范中。这些标签唯一标识每个必须实现和验证的需求,使OpenVX实现者和应用开发者能够应用安全关键开发方法(如ISO - 26262)所需的严格跟踪技术。在这些方法中,每个需求都必须明确指定、实现和验证,并对每个步骤进行清晰的文档记录,标签使每个需求能够在整个过程中被跟踪。
3.3 未定义行为的修改
规范文档中还对支持安全关键应用进行了一些小的更改。其中一个重要的更改是将“未定义”行为改为“实现定义”行为。在规范的多个地方描述了正确使用标准编写程序的规则,在以前的规范版本中,如果违反这些规则,程序的行为被描述为“未定义”。对于安全关键应用,不允许有任何未定义的行为,因此将表述改为“实现定义”。在安全关键的OpenVX实现中,实现者必须定义当规则被破坏时会发生什么,即使OpenVX规范本身没有定义。
例如,在各种对象的映射和取消映射函数中,当映射一个对象时,会得到一个带有基指针和大小的内存块。如果尝试访问此内存块之外的内存(基指针之前或内存区域末尾之后),结果是实现定义的。如果尝试写入只读内存或读取只写内存,结果也是实现定义的。安全关键的OpenVX实现需要指定当进行这些操作时会发生什么,例如,当尝试读取超出内存区域末尾的数据时,会生成错误,读取结果为全零。而非安全关键的实现可以做任何最简单的事情,可能包括读取随机结果甚至崩溃。
3.4 安全关键应用支持总结表格
| 改进方面 | 具体内容 |
|---|---|
| 功能合并 | 将安全关键功能合并回主规范,确定安全关键部署功能集 |
| 需求标签 | 引入 [REQ - XXXX] 形式的需求标签,便于跟踪需求 |
| 未定义行为修改 | 将“未定义”改为“实现定义”,确保安全关键应用行为可定义 |
4. 双向参数的移除
4.1 移除原因
OpenVX 1.3规范的另一个变化是移除了双向参数。运行带有双向参数的图形时,会同时读取和写入双向参数数据,这在技术上会在图形中形成循环。这可能会给一些优化技术带来问题,并且需要大量规则来确定数据何时被读取和写入,以确保行为定义明确。移除双向参数后,这些规则不再需要。
4.2 功能替代
在OpenVX 1.2及更早版本中,标准中唯一使用双向参数的内核是累加节点: Accumulate 、 Accumulate Squared 和 Accumulate Weighted 。其中, Accumulate 节点的功能可以使用 Add 节点轻松重建, Accumulate Squared 节点的功能也可以通过使用 Multiply 节点实现。而 Accumulate Weighted 功能用OpenVX 1.2节点构建有点困难,因此OpenVX 1.3添加了一个“加权平均”节点来简化实现:
vx_node vxWeightedAverageNode(
vx_graph graph,
vx_image img1,
vx_scalar alpha,
vx_image img2,
vx_image output);
该节点接受两个输入图像和一个介于0和1之间的“alpha”参数,输出图像的每个像素设置为第一个输入图像乘以alpha加上第二个输入图像乘以(1 - alpha):
output(x,y) = alpha * img1(x,y) + (1 - alpha) * img2(x,y)
这种简单的计算也称为alpha混合,因为它通过alpha参数产生两个输入图像的“混合”,类似于被移除的 Accumulate Weighted 中的alpha参数的作用。
4.3 双向参数移除总结表格
| 移除对象 | 替代方式 |
|---|---|
| Accumulate | 使用Add节点重建 |
| Accumulate Squared | 使用Multiply节点实现 |
| Accumulate Weighted | 使用vxWeightedAverageNode节点 |
4.4 双向参数移除流程图
graph LR
A[OpenVX 1.2及以前版本] --> B[使用双向参数的累加节点]
B --> C{是否升级到1.3版本}
C -->|是| D[移除双向参数]
C -->|否| B
D --> E[Accumulate用Add替代]
D --> F[Accumulate Squared用Multiply替代]
D --> G[Accumulate Weighted用vxWeightedAverageNode替代]
综上所述,OpenVX 1.3版本在功能集、安全关键应用支持和参数设置等方面进行了重要更新,这些更新提高了OpenVX的灵活性、安全性和易用性,为开发者提供了更多的选择和便利。
超级会员免费看
38

被折叠的 条评论
为什么被折叠?



