TIOVX验证阶段分析
OpenVX数据对象的分配和映射发生在验证阶段。每个数据对象的内存都是通过在框架内部使用tivxMemBufferAlloc API从DDR共享内存的分割区域分配的。此分配在主机CPU上完成。通过在vxVerifyGraph调用中执行此分配,框架可以在应用程序内的单个点返回错误,以通知应用程序该图是有效的,并且可以进行调度。
除了为OpenVX数据对象分配内存外,每个内核实例所需的本地内存也在调用vxVerifyGraph期间分配。在这种情况下,本地内存是指运行目标内核的给定内核可访问的内存区域。当vxVerifyGraph调用循环通过图中的所有节点并调用给定节点的创建回调时,就会发生这种本地内存分配。该框架的设计意图是,所有内存分配都发生在每个内核的创建回调期间,从而避免在运行时在进程回调内进行内存分配。有关每个内核的回调的更多信息,参阅vxAddUserKernel和tivxAddTargetKernel。有关在vxVerifyGraph期间调用这些回调的顺序的更多信息,参阅用户目标内核。
每个内核实例都有自己的上下文,该上下文允许内核实例使用API的tivxSetTargetKernelInstanceContext和tivxGetTargetKernel实例上下文在数据结构中存储上下文变量。因此,可以在内核结构内分配和存储本地内存。提供了简单的API来分配内核内存,它们是tivxMembeAlloc和tivxMembeFree。这些API允许从这里给出的各种内存区域分配内存tivx_mem_heap_region_e_e。例如,如果多个算法在内核中连续运行,则可以在内核上下文中分配中间数据。此外,在tivx_mem_heap_region_e中,有一些属性用于在DDR中创建持久内存或在DDR内创建非持久的临时内存。
TIOVX执行阶段
在OpenVX图的调度和执行过程中,OpenVX数据缓冲区位于外部共享存储器中,并且指向这些数据缓冲区中的每个数据缓冲区的指针被传递到图中的后续节点。在每个节点进程回调中,节点可以通过从上一个节点传递的指针访问外部共享内存。tivxMemBufferMap和tivxMemBufferUnmap封装了将共享内存映射到目标核心所需的映射和缓存维护操作。节点完成后,框架根据当前节点输出的数据处理节点的触发。
TIOVX销毁阶段
如前所述,删除阶段为应用程序中的每个OpenVX数据对象调用适当的删除API。此时,使用tivxMemBufferFree API将OpenVX数据对象的数据缓冲区从共享内存中释放出来。这种内存释放发生在单个对象的API版本中,例如图像对象的vxReleaseImage。
TIOVX内存优化
如上所述,OpenVX数据缓冲区传输的默认行为是在后续节点读取中间缓冲区之前将这些缓冲区写入DDR。以下是关于如何优化内存传输的一些建议和建议:
正如在创建部分中提到的,可以查询和修改非缓存内存中静态分配的结构的数量。为此,参阅以下内容:
静态分配结构的最大值在文件<TIOVX_PATH>/include/TI/tivx_config.h和<TIOVX_PATH>/include/TI/tivx_config_<SOC>.h中定义
这些值的大小是根据vision_apps repo中使用OpenVX的应用程序确定的。然而,这些值可以根据给定应用的需要而增加或减少。
开发了以下实用程序函数来帮助优化这些值:
tivxPrintAllResourceStats打印当前使用的值、最大使用值和最小要求值
tivxQueryResourceStats提供有关特定资源的参数值的信息,该资源的名称作为参数传递给函数
tivxExportAllResourceMaxUsedValueToFile在VX_TEST_DATA_PATH生成一个名为tivx_config_generated.h的新配置文件。此配置文件将每个参数初始化为上一个运行时确定的最大使用值。
所有参数最大值都记录在TIOVX配置参数中
所有这些API都在c:Application接口API中做了进一步的说明
如果多个算法必须在单个内核上连续运行,通常建议将其封装到单个OpenVX内核中。其原因是可以将中间数据写入本地存储器,从而提高存储器访问时间。这避免了将操作拆分为两个独立内核并将中间数据写入DDR的替代方案。注意:这限制了这些算法单独部署的灵活性,因此在决定将这两种算法合并到一个内核中时也必须进行权衡。
可以利用的另一种优化技术是使用DMA将内存获取与给定目标内核的计算并行化。通过使用DMA来获取给定输入的拼接部分,内核可以对输入进行操作,并以基于块的方式生成输出。这可以极大地提高给定内核的吞吐量。
Mscgen
https://www.mcternan.me.uk/mscgen/
这是怎么一回事?
Mscgen是一个小程序,它解析消息序列图描述,并生成PNG、SVG、EPS或服务器端图像映射(ismaps)作为输出。消息序列图(MSC)是表示一段时间内实体和交互的一种方式,通常与SDL结合使用。MSC在电信中很流行,用于指定协议的操作方式,尽管创建或使用MSC并不需要复杂。Mscgen旨在提供一种创建、编辑和理解清晰的简单文本语言,也可以转换为常见的图像格式进行显示或打印。
该程序及其解析的语言受到Graphviz Dot的启发,它提供了一种非常好的方法来记录状态转换图、数据结构和有向图。与Graphviz不同,该程序不进行巧妙的布局操作或样条曲线路由,因为MSC不需要这样做,因此实现起来要简单得多。Doxygen(1.5.2版以后的版本)还允许直接嵌入MSC,其方式与将点图添加到文档中的方式相同,从而可以通过使用消息序列图轻松改进Doxygen生成的文档。
示例
以下是生成的原始输入代码和输出的示例,在本例中为PNG。
# MSC用于一些虚构的过程
msc {
hscale = 2;
a,b,c;
a->b [ label = ab() ] ;
b->c [ label = bc(TRUE)];
c=>c [ label = process(1) ];
c=>c [ label = process(2) ];
...;
c=>c [ label = process(n) ];
c=>c [ label = process(END) ];
a<<=c [ label = callback()];
--- [ label = If more to run, ID="*" ];
a->a [ label = next()];
a->c [ label = ac1()\nac2()];
b<-c [ label = cb(TRUE)];
b->b [ label = stalled(...)];
a<-b [ label = ab() = FALSE];
}
# 虚拟客户端-服务器协议
msc {
arcgradient = 8;
a [label=Client],b [label=Server];
a=>b [label=data1];
a-xb [label=data2];
a=>b [label=data3];
a<=b [label=ack1, nack2];
a=>b [label=data2, arcskip=1];
|||;
a<=b [label=ack3];
|||;
}
Mscgen语言的描述
消息序列图的一般格式,带注释的示例,如下所示。应该注意的是,空格和换行符是被输入解析器忽略。
输入片段
|
意义
|
#一些虚构过程的MSC
|
评论。以#或//开头的行被忽略,作为 C 样式注释封装在/*和*/中
|
msc {
|
启动 MSC
|
width = 800;
|
在这种情况下,输出控制选项将输出图像宽度设置为800像素。注意,如果愿意,hscale选项可用于指定宽度的比例因子,而不是绝对值。
|
a, b, c;
|
列出将在消息序列图中使用的实体,按照它们在页面上从左向右水平显示的顺序排列。注意,每个实体名称都可以引用或不引用,除非名称中包含空格,在这种情况下需要双引号。
|
a->b
|
表示某些消息从a传递到b。在本例中,a和b这两个命名实体必须在消息序列图的开头声明。同样,如果实体名称包含空格,则应使用双引号。
|
a<-c [label=return];
|
表示某些消息从c传递到a。在这种情况下,一些属性也在方括号中提供。label属性提供写在消息弧上方的文本。
|
}
|
这显示了消息序列图的结束
|
语法非常简单。需要注意的重要部分是,第一个行给出消息序列图选项和实体,每个以下行描述消息弧。下表显示了每个可能的消息弧类型,包括所谓的特殊弧不显示实体之间的关系,而是描述某些内容水平在图表上。
框类型允许添加状态和条件框。在源代码中 这些仍然表示为实体之间的关系,但在本例中,盒子被制作成从源到目的地的整体。
# MSC使用盒子的示例
msc {
# 实体
A, B, C, D;
# 盒子前的小间隙
|||;
# 接下来的四个在同一行,因为','
A box A [label=box],
B rbox B [label=rbox],
C abox C [label=abox],
D note D [label=note];
# 填充背景的方框示例
A abox B [label=abox, textbgcolour=#ff7f7f];
B rbox C [label=rbox, textbgcolour=#7fff7f];
C note D [label=note, textbgcolour=#7f7fff];
}
除了弧类型之外,还可以为每个消息弧或实体提供少量属性。这些属性放在方括号中,作为隐形符号,紧跟在要附加属性的实体名称或消息弧后面:
a->b [label="A to B", textcolour=red, linecolour=#ffb011];
下表描述了所有可能的属性及其含义,并且可以为特殊的“...”指定每个属性和 “---”弧类型,以及任何其他弧或实体。
Source 属性
|
意义
|
标签label
|
要放置在消息弧上的标签,或用于实体的标签。这在消息弧上方字面上再现或代替实体名称。当用作消息弧标签时,它还可能包含参数或必需的文本。如果遇到\n ,则将被解释为换行符,将文本也放在弧线下方,如上所述,在正常位置,或将实体图块扩展到更多线。
|
网址URL
|
生成图像时,将标签着色为蓝色。如果生成 image map,为指定 URL 的标签创建一个条目。如果消息序列图将嵌入到 Doxygen 文档中,URL可能指定为\ref xxx ,其中xxx表示 一些记录在案的元素的名称;在本例中,指向元素的链接将自动制作。
|
ID
|
向标签添加上标标识符。通常,这可能是一个编号,以便在周围的描述性文本中,可以识别和引用特定元素。
|
IDURL
|
类似于 URL 属性,但链接来自 ID 文本,而不是消息标签。这与 URL 属性具有相同的语义,但仅当圆弧也具有 ID 时才使用。
|
arcskip
|
这抵消了圆弧到达目的实体的垂直位置。
|
直线颜色,linecolour
|
对于圆弧或图元,将线设置为指定的颜色。
|
文本颜色,textcolor
|
对于圆弧或图元,将标注文本设置为指定颜色。
|
文本背景颜色,textbgcolor
|
对于圆弧或实体,请为文本背景块设置颜色。设置box、abox、rbox和note形状的填充颜色。
|
弧形颜色,弧形颜色
|
仅对实体有意义,这将为所有实体的弧线设置默认线条颜色。这可以通过以下方式覆盖,根据需要在特定弧线上设置linecolor 属性。
|
弧形文本颜色,ArcTextColor
|
仅对实体有意义,这将为所有实体弧线设置默认文本颜色。这可以通过以下方式覆盖,根据需要在特定弧线上设置textcolor 属性。
|
ArcTextbgColour,ArcTextBgColor
|
仅对实体有意义,这将对所有弧形实体背景设置文本的默认颜色。这可以根据需要由特定圆弧上的textbgcolor属性覆盖。
|
颜色可以使用#前缀指定为RGB颜色代码,如下 HTML 标记,或者可以使用一些预定义的颜色名称之一,如以下示例。
|
名字
|
法典
|
块
|
白
|
#ffffff
|
|
银
|
#c0c0c0
|
|
灰色
|
#808080
|
|
黑
|
#000000
|
|
栗色
|
#800000
|
|
红
|
#ff0000
|
|
橙
|
#ffb000
|
|
黄色
|
#ffff00
|
|
橄榄
|
#808000
|
|
绿色/石灰
|
#00ff00
|
|
水
|
#00ffff
|
|
水鸭
|
#008080
|
|
蓝
|
#0000ff
|
|
海军
|
#000080
|
|
靛
|
#440088
|
|
紫色
|
#800080
|
|
紫
|
#d02090
|
|
紫红色
|
#ff00ff
|
|
|
最后,可以将选项添加到输入文件,以控制生成的图像的各个方面。目前只支持几个选项,并且必须在输入文件的顶部给出,如以下示例所示。表中描述了允许的选项。
msc {
# 选项部分
hscale=1.5, arcgradient=5;
# 实体
A, B;
# 弧形
A -> B;
}
选择
|
意义
|
hscale(英语:hscale)
|
按此系数缩放图像宽度,该系数必须为非零值。通常,PNG 的输出宽度为 600 像素,但可以缩放为通过指定小数乘数的任何值。例如,指定值为 1.5 会将宽度设置为 600×1.5 = 900 像素。
|
宽度
|
设置图像宽度值,该值必须为非零,并且给定以像素为单位。在以下情况下,可以使用它代替 hscale 选项,显式图像宽度优先于比例因子。
|
弧度
|
这会导致消息弧在页面上向下倾斜,而不是运行水平。给出的值是低于 消息弧的起点,弧线的末端应与目标实体相连接。
|
自动换行
|
如果设置为true、on或1,这将导致长行文本打开,箭头弧线自动换行。默认换行仅对 'box'、'abox'、'rbox' 和 'note' 样式弧线启用。
|
参考文献链接
https://www.mcternan.me.uk/mscgen/