2020-10-19

   OpenVX 使用说明
  1. OpenVX
    OpenVX是一个开放的Khronos(https://www.Khronos.org/OpenVX/)定义的计算机视觉应用跨平台加速标准。OpenVX支持性能和功耗优化的计算机视觉处理,重点是嵌入式和实时用例:
    高级驾驶员辅助系统(ADAS)
    面部、身体和手势跟踪
    智能视频监控
    物体与场景重建
    增强现实
    目视检查
    机器人等。
    虽然最初只用于vision嵌入式应用程序,但将来可能会扩展到适合数据流表示的非vision应用程序。
  2. TIOVX
    TIOVX是TI对OpenVX标准的实现。
    TIOVX允许用户使用OpenVX API创建vision和计算应用程序。这些OpenVX应用程序可以按照OpenVX 1.1标准在诸如AM57xx(包括A15和C66内核)这样的TI soc上执行。TIOVX还为C66x DSP提供了优化的OpenVX内核。扩展API允许用户集成自己本机开发的自定义内核,并使用openvxapi调用它们。
    在这里插入图片描述

TIOVX software

在这里插入图片描述

VXLIB内核有两个版本:没有BAM框架和有BAM框架。BAM是一个表示有向无环图的低层框架,其中EDMA传输被大量地用于将2D内存对象带到更高速的L2内存中,从而提高了几乎两倍的性能。
当前版本具有BAM框架的内核。该框架通过大量使用EDMA实现了更高的性能,EDMA将数据块从远程DDR存储器带到本地L2,而DSP负责处理。这些内核的列表可以在https://git.ti.com/processor-sdk/tiovx/trees/master/kernels/openvx-core/c66x/bam中查看。
3. TIOVX DSP Kernels (in VXLIB)
当前版本的VXLIB有44个内核(通常针对不同的数据类型有多个实现)。
下面是完整的DSP内核包装器列表(包装器是TIOVX的一部分):
• AbsDiff
• AccumulateSquare
• Accumulate
• AccumulateWeighted
• Add
• BitwiseAnd
• BitwiseNot
• BitwiseOr
• BitwiseXor
• Box3x3
• CannyEd
• ChannelCombine
• ChannelExtract
• ColorConvert
• ConvertDepth
• Convolve
• Dilate3x3
• EqHist
• Erode3x3
• Gaussian3x3
• HalfscaleGaussian
• HarrisCorners
• Histogram
• IntegralImage
• Lut
• Magnitude
• MeanStdDev
• Median3x3
• MinMaxLoc
• Multiply
• NonLinearFilter
• Phase
• Sobel3x3
• Subtract
• Threshold

  1. TIOVX in Processor Linux SDK on AM57xx EVM
    Following TIOVX components are present in EVM filesystem:
    在这里插入图片描述

TIOVX 1.0.0.0版只运行wrt OpenCL,因为两个固件都使用公共资源DSP内核和CMEM内存。也就是说:应用程序可以是基于TIOVX的,也可以是基于OpenCL的。将来的版本可能会消除这个限制,并使用资源中的静态分割(在OpenCL和OpenVX之间)。TIOVX需要具有两个块的CMEM内存:块0是用于交换大缓冲区(>100MB)的大DDR块,块1(~1MB)用作从所有核心可见的共享内存,以交换共享数据对象(通常在OCMC中)
5. Switch from OpenCL to OpenVX firmware:
Run the command below to switch from OpenCL to OpenVx firmware:

reload-dsp-fw.sh tiovx                   # load openvx firmware and restart dsps
  1. Run TIOVX test application
First, it is necessary to copy test vectors from https://git.ti.com/processor-sdk/tiovx/trees/master/conformance_tests/test_data to EVM filesystem (e.g. ~/tiovx/test_data).Then run following commands:
export VX_TEST_DATA_PATH=/home/root/tiovx/test_data  # Set environment variable to point to location of test vectors on EVM
tiovx-app_host 2>&1 | tee log.txt                    # Run test application, and log output to log.txt
At the end of test (taking roughly 24mins) you can expect report like this:
...
[ N7 ] Execution time for    307200 pixels (avg =    3.584000 ms, min =    3.584000 ms, max =    3.584000 ms)
[ N8 ] Execution time for    307200 pixels (avg =  171.797000 ms, min =  171.797000 ms, max =  171.797000 ms)
[ N9 ] Execution time for    307200 pixels (avg =  366.952000 ms, min =  366.952000 ms, max =  366.952000 ms)
[ G4 ] Execution time for    307200 pixels (avg =  500.146000 ms, min =  500.146000 ms, max =  500.146000 ms)
[ N1 ] Execution time for       256 pixels (avg =    0.278000 ms, min =    0.278000 ms, max =    0.278000 ms)
[ N2 ] Execution time for       256 pixels (avg =    0.230000 ms, min =    0.230000 ms, max =    0.230000 ms)
[ N3 ] Execution time for       256 pixels (avg =    0.281000 ms, min =    0.281000 ms, max =    0.281000 ms)
[ N4 ] Execution time for       256 pixels (avg =    0.303000 ms, min =    0.303000 ms, max =    0.303000 ms)
[ N5 ] Execution time for       256 pixels (avg =    0.285000 ms, min =    0.285000 ms, max =    0.285000 ms)
[ G5 ] Execution time for       256 pixels (avg =    2.169000 ms, min =    2.169000 ms, max =    2.169000 ms)
[ N1 ] Execution time for       256 pixels (avg =    0.243000 ms, min =    0.243000 ms, max =    0.243000 ms)
[ N2 ] Execution time for       256 pixels (avg =    0.301000 ms, min =    0.301000 ms, max =    0.301000 ms)
[ G6 ] Execution time for       256 pixels (avg =    0.871000 ms, min =    0.871000 ms, max =    0.871000 ms)
[ N1 ] Execution time for       256 pixels (avg =    0.352000 ms, min =    0.352000 ms, max =    0.352000 ms)
[ N2 ] Execution time for       256 pixels (avg =    0.246000 ms, min =    0.246000 ms, max =    0.246000 ms)
[ N2 ] Execution time for       256 pixels (avg =    0.324000 ms, min =    0.324000 ms, max =    0.324000 ms)
[ G7 ] Execution time for       256 pixels (avg =    1.502000 ms, min =    1.502000 ms, max =    1.502000 ms)
[ N1 ] Execution time for       256 pixels (avg =   75.37000  ms, min =   75.37000  ms, max =   75.37000  ms)
[ G8 ] Execution time for       256 pixels (avg =   60.474000 ms, min =   60.474000 ms, max =   60.474000 ms)
[     DONE ] tivxMaxNodes.MaxNodes/0/few_strong_corners/MIN_DISTANCE=3.0/SENSITIVITY=0.10/GRADIENT_SIZE=3/BLOCK_SIZE=5/k=3/VX_INTERPOLATION_NEAREST_NEIGHBOR
[ -------- ] 1 tests from test case tivxMaxNodes

[ ======== ]
[ ALL DONE ] 6217 test(s) from 110 test case(s) ran
[ PASSED   ] 6217 test(s)
[ FAILED   ] 0 test(s)
[ DISABLED ] 7397 test(s)

To be conformant 6217 required test(s) must pass. Disabled 7397 test(s) are optional.

#REPORT: 20170927134830 ALL 13614 7397 6217 6217 6217 0 (version 1.1-20170301)
<-- main:

请注意,测试日志的最后~3000行包含性能数据(执行时间和处理的像素数),可用于进一步评估。
从OpenVX切换回OpenCL固件:
运行完TIOVX测试应用程序后,将固件切换回OpenCL的默认值:
reload-dsp-fw.sh opencl # load opencl firmware and restart dsps
7. Recompile TIOVX (using Yocto build)
TIOVX框架实现可在https://git.ti.com/processor-sdk/TIOVX/trees/master上获得

TIOVX示例应用程序,包括基于标准消息q的IPC实现,以及运行一致性测试的应用程序,可以在https://git.ti.com/processor-sdk/TIOVX-app/trees/master上找到

其他文档可在https://git.ti.com/processor-sdk/tiovx/trees/master/docs上找到

TIOVX框架和TIOVX-APP可以像任何其他组件一样重新编译,如http://processors.wiki.ti.com/index.php/SDK Building Processor The SDK Building所述。也可以使用以下命令执行完全重建:
MACHINE=am57xx-evm bitbake arago-core-tisdk-bundle

要修改PLSDK中的各个组件,请参阅:http://processors.wiki.ti.com/index.php/Processor_SDK_Building_The_SDK#Recipes

如果需要修改TIOVX主机库(框架)文件(A15侧)的源代码,请在:tisdk/build/arago tmp external arm toolchain/work/am57xx_evm-linux-gnueabi/TIOVX lib host/01.00.00-r1/git/文件夹中执行。

例如,要修改执行的测试列表,请执行以下操作:update file./tiovx/conformance_tests/test_tiovx/test_main.h或./tiovx/conformance_tests/test_conformance/test_main.h

在源代码修改之后,强制编译库(Linux主机端),并使用以下命令重新生成包:
MACHINE=am57xx-evm bitbake tiovx-lib-host -f -c compile
MACHINE=am57xx-evm bitbake tiovx-lib-host

类似地,应用程序代码可以在中修改:./tisdk/build/arago tmp external arm toolchain/work/am57xx_evm-linux-gnueabi/tiovx app host/01.00.00-r1/git,然后使用以下命令强制重新编译和重建:
MACHINE=am57xx-evm bitbake tiovx-app-host -f -c compile
MACHINE=am57xx-evm bitbake tiovx-app-host
8. 实例
在OpenVX当中,有一个关键词叫做kernel,这里的kernel并不是指操作系统的kernel,而是指OpenVX中的一种功能,比如对一个图片进行高通滤波的功能就是openVX的一个功能,这在OpenVX里面叫做一个user kernel。既然kernel是一种提供给用户使用的功能,那么这个功能函数一般支持传参,通过参数的不同来改变kernel的运行结果(比如传入的图片就算一个参数),在OpenVX当中,把参数定义初始化好后的kenrel叫做node, 因此,node就是kernel的一个实例化即拥有指定参数的kernel。在CNN中,OpenVX的node就是一个layer层,而OpenVX的运行是基于node来运行的,所有的node会被链接到图(graph)中,最后由graph统一运行。运行例子如下(具体编程参考后面的链接):
在这里插入图片描述

既然存在user kernel(这个功能运行在当前CPU上),TI在openVX的基础上增加了remote kernel即这个Kernel函数是运行在其他CPU上面的,这样做可以让多个CPU并行运算,提升运行效率,比如将不同功能分发给擅长该功能的CPU运行,可以事半功倍(这里就简单提一下,不详细说具体实现)。
TI的多核并行运算TIOpenVX数据逻辑如下(远程CPU之间通信是通过共享内存和rpmsg实现,下图是一个DSP+ARM流程图):
在这里插入图片描述

TI修改后的TiOpenVX代码初始化逻辑框架如下:

在这里插入图片描述

参考链接:https://www.khronos.org/registry/OpenVX/specs/1.1/html/da/d83/group__group__user__kernels.html

OpenVX的编程文档链接:https://www.khronos.org/registry/OpenVX/specs/1.2.1/OpenVX_Specification_1_2_1.pdf

  • 19
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值