多核DSP并行处理的核间通信与编程技巧

2017-05-12 09:41郑武兴王春平付强
单片机与嵌入式系统应用 2017年5期
关键词:间通信队列图像处理

郑武兴,王春平,付强

(军械工程学院 电子与光学工程系,石家庄 050003)

多核DSP并行处理的核间通信与编程技巧

郑武兴,王春平,付强

(军械工程学院 电子与光学工程系,石家庄 050003)

本文以图像为基础,在TMDSEVM6678L实现并行处理设计,并分析其性能。文中主要介绍了核间通信的几种常用方法,以及多核编程的基本技巧。通过网页实现用户交互,并对网页数据传递进行分析,提供数据解析思路。分析比较数据的读取速度,采用合适的数据采集方法提高仿真效率。最后,统计不同数据量的处理时间,实验结果表明,采用消息机制进行核间通信实现并行处理具有实用性以及适用性。

TMS320C6678;并行处理;核间通信;消息机制

引 言

DSP是对数字信号进行高速实时处理的专用处理器,因此,在数字化发展中,DSP凭借其高性能和软件可编程等特点,使之在电子工业领域的应用迅速增长。随着应用领域的扩大以及终端产品性能的日益丰富,人们对其性能、功耗和成本也提出了越来越高的要求,这使得DSP厂商开始在单一硅片上集成更多的处理器内核以适应用户需求,于是多核DSP应运而生。DSP在电子工业领域起着举足轻重的作用,成为航空电子与国防、通信系统、机器视觉、嵌入式和云分析、高性能计算、多媒体基础设施、医疗成像、测试和测量、监控和安全、软件定义无线电(SDR)、消费类电子产品等领域的基础器件[1]。

在多核处理器的使用过程中,最重要的就是要学会如何分配各核的工作,掌握各核之间的通信机制,以及各核之间的数据交流。本文以TI公司的TMDSEVM6678L八核处理器为平台,介绍典型核间通信机制以及多核编程方法。通过对单帧图像处理进行多核程序设计,为后续视频跟踪算法的多核程序设计提供思路。

1 核间通信机制

TI公司提供了允许在多处理器环境和通信处理器之间的通信外设包、IPC组件包,它是SYS/BIOS处理核间通信的组件。此通信包括消息传递、数据流和链表,这些工作透明地在两个单处理器和多处理器之间配置。

1.1 最小使用

这种方案使用通知驱动程序来执行核间的通知(Notification),通过Notify模块来实现。这种方式最适合处理核间的简单同步,而无法处理复杂的消息传递,当前核可以发送一个通知给另一远程核让其执行任务,而后远程核会反馈任务完成信号。这种通知携带的数据非常小,不超过32位,所以称为最小使用。其配置方式如图1所示[2]。

图1 最小使用配置图

多核处理器模块的静态配置在SYS/BIOS操作系统的配置文件(*.cfg)中进行。在这种情况下,用户通过API函数调用Notify模块,比如用户可以通过Notify_registerEvent()给特定事件动态注册回调函数,该函数将事件注册到指定核,同时注册到指定中断号。通过Notify_sendEvent()函数给某个特定核传递一个事件,当该函数被调用时,所注册的回调函数开始执行。由于一个通知所携带的信息是极少的,所以只能给处理器发送一个事件号,而这个事件号所代表的回调函数决定之后的动作。另外一些数据以函数参数方式也可以被送出。需要注意的是,同一个中断号可以注册多个事件,同一个事件可以有多个回调函数或者多个宿主,事件被触发后所有宿主都会被唤醒;事件是有优先级的,事件号越小优先级越高,事件0的优先级最高,当多个事件被触发,优先级最高的会最先响应。

1.2 强大但易用的消息机制

MessageQ模块,即消息队列(Message Queue),有些情况下利用MessageQ模块来传递消息。其配置方式如图2所示。

图2 强大但易用的消息机制配置图

MessageQ同Notify模块一样,也是用于多核之间的通信,不过不同的是Notify模块更加侧重于通知,其只能传递一个参数,而MessageQ却可以传递可变长度(一般超过32位)的消息结构体,对于多个参数,数据打包更加适用,更侧重于传递消息。另外不同线程间的消息是独立的,例如对于每个MessageQ来说,存在一个读者却可能有多个写者。在这种通信方案下,只需要配置MultiProc和SharedRegion模块就可以了,而Ipc_start()函数将自动实现上面其他模块的配置。Ipc_start()的调用必须在任何模块的调用之前,即主函数最前面。它需要在SYS/BIOS 操作系统的配置文件(*.cfg )进行静态配置,还要在主程序中对MessageQ 模块进行动态配置。

MessageQ模块的主要特点:

① 变长消息传递,一般超过32位;

② 消息可以被任何类型的线程发送和接收;

③ 其消息的传递都是通过操作消息队列来实现的;

④ 接收消息允许超时(等待),当等待时间timeout为0时,确定消息已经接收;

⑤ 每个消息队列可以有多个写者,但只能有一个读者,而每个任务可以对多个消息队列进行读写;

⑥ 一个宿主在准备接收消息时,必须先创建消息队列,而在发送消息前,需要打开预定的接收消息队列;

消息被发送到消息队列中,而读者从消息队列中读取消息。每个写者是发送消息到消息队列的一个线程,每个读者是从消息队列接收消息的一个线程。DSP核发送消息前,使用函数MessageQ_alloc()在共享区域分配消息堆空间,然后使用函数MessageQ_put()将消息发送到接收核的消息队列。当DSP核接收消息时,使用函数MessageQ_get()获取本地消息队列中的消息,然后调用函数MessageQ_free()或MessageQ_delete(),删除该消息。通信完成后,调用MessageQ_close()关闭消息队列。在程序执行过程中,对MessageQ模块中函数的调用流程如图3所示[3]。

图3 MessageQ模块调用流程

1.3 核间的连接方法

通过配置*.cfg文件中的Ipc.ProcSync属性,可以设置同步的核数,它总共有三种模式。如果配置Ipc.ProcSync为Ipc.ProcSync_ALL,那么执行Ipc_start()将会自动连接和同步所有核,不需要再调用Ipc_attach()。如果配置Ipc.ProcSync为Ipc.ProcSync_PAIR,那么就必须调用Ipc_attach()手动连接所需要同步的远程核。在Ipc_start()之后直接输入Ipc_attach(coreID),coreID表示需要连接的核ID号,如Ipc_attach(0)表示连接核0。手动连接核时,核的连接一定要按照核ID号从小到大的顺序进行,比如当前核必须先连接核0,才能连接核1。另外,两核之间的相互连接必须先满足ID号小的先连接ID号大的,比如只有当核0连接核1后,核1才能连接到核0。由于核的连接并不是一次就能成功,所以一般需要加一个循环等待的过程,一般使用方法如下:

while(Ipc_attach(coreID)<0)

{ Task_sleep(1); }

最后一种模式是配置为Ipc.ProcSync_NONE,当用户选择这种模式时,在被其他模块设置为所需的对象之前,执行Ipc_start()将不会同步任何处理器。用户要谨慎使用这种模式,它一般用于应用程序执行自己的同步或者避免与IPC同步的一个潜在的死锁情况。这种情况下,Ipc_start()的工作与Ipc.ProcSync_PAIR模式的情况完全一样。解除核之间连接可以通过Ipc_detach()实现,Ipc_detach()的使用方法与Ipc_attach()类似,这个步骤不是必须的。

2 多核编程

以往主要通过提高硬件性能来提高处理速度,很少通过软件来提高处理速度。随着多核处理器的出现,对程序员的编程能力要求更高,需要程序员对应用程序合理分配,以充分发挥多核处理器的优势。

2.1 并行设计

并行设计首先要对任务的并行性进行分析,然后根据其特点选择合适的处理模型。通常主要有以下两种模型。

(1) 主从模型

图4 主从处理模型

主从模型属于任务分发式,主核负责整个任务调度、数据分配与整合,其模型如图4所示。这种情况一般代码共享性比较高,主要通过拆分数据来分配任务,有些情况需要考虑数据拆分后再分析是否对结果造成影响,在最后的数据整合可能不是简单拼接,还需要进一步处理。

(2) 数据流模型

数据流模型由数据触发调度,初始数据一般由传感器或者FPGA输入接口提供。它的代码共享性比较低,每个核使用各自的算法处理数据,通过数据的处理流程形成流水线。这种模型向各个核均衡分配任务,需要根据各个算法的处理时间来考虑各核所需要承担的处理任务,如果分配不当就容易形成“木桶效应”。当前核的处理速度容易受前后核的影响,所以数据在核与核之间传递所形成的延迟时间是一个很大的挑战。数据流处理模型如图5所示。

图5 数据流处理模型

2.2 缓存一致性

在TMS320C6678中,只有同一个核内的L1D和L2SRAM的缓存内容的一致性可以由硬件保证,这个过程不需要软件参与[4]。L2中的内容被更新时,硬件保证相应L1D中缓存的内容也能及时更新。由于对功耗和延迟开销的考虑,C66xx并不支持自动的缓存一致,程序员需要手动控制,通过软件编程保持高速缓存一致性。在进行每次写入运算时都需要立刻采取措施保证数据的一致性,否则不同核可能会看到不同的数据,这样会造成数据处理混乱,最终得到的数据结果不准确。为此,TI提供了一套API函数以支持cache的一致性操作,包括缓存行无效(cache lineinvalidation)、缓存行写回(cache line writeback)到存储memory,以及回写无效等操作。

2.3 代码镜像

应用程序支持单独镜像和多镜像。单独镜像的应用程序在所有核之间共享一部分代码和数据存储,这种情况允许所有核加载并运行完全相同的应用程序。如果运行完全共享的代码,只需要建立一个工程,同时只需要一个SYS/BIOS配置文件[5]。在多镜像方案中,每个核运行相互独立且不相同的应用程序,需要建立多个工程。这就要求给放在一个共享内存区的所有代码或数据分配唯一的地址区域,防止其他内核访问相同的内存区域。对于这种应用,每个应用程序的SYS/BIOS配置文件会调整内存部分的位置,以确保多核不会访问到内存重叠范围。

3 并行处理程序设计

本设计的硬件平台为TI公司的TMDSEVM6678L开发板,程序开发环境为CCS5.2.1,采用瑞泰ICETEK-XDS200U通用开发系统进行在线调试。

3.1 方案选择

通知机制方案的实现代码相对简单,除发送事件ID号外,还可选择传输最大32位的整型数据负载,它的负载能力是十分有限的,其数据通信性能受到很大限制。在图像处理过程中,各核之间所需要交流传递的数据量比较大,通知机制很难满足此要求,实现难度大。而消息机制能通过消息结构体封装数据信息,负载能力比较强,并且它具有较好的灵活性和适应性,所以在此选用MessageQ方式进行图像多核并行处理设计。

3.2 基于MessageQ的程序设计

3.2.1 消息队列相关操作

消息队列模块主要的操作有:配置消息模块、创建消息队列对象、打开消息队列、分配消息堆空间、发送消息、接收消息、删除消息对象等。消息机制进行核间通信,详细步骤以及注意事项如下:

(1) 配置消息模块

用户需要在*.cfg文件中配置消息模块,通过以下配置使能消息模块:

var MessageQ=xdc.useModule('ti.sdo.ipc.MessageQ');

它的属性设置具体如下,以下是它的默认值,如果不进行设置就采用以下值:

MessageQ.maxNameLen=32; //消息序列名称最大长度

MessageQ.maxRuntimeEntries=10;// 可以被动态创建的最大消息序列数

MessageQ.numHeaps=0;

MessageQ.tableSection=null;

(2) 创建消息队列对象

接收核通过函数MessageQ_create(String name,MessageQ_Params *params)动态创建消息队列,它不支持静态创建。一个消息队列对象只存在于当前核,不被其他核所共享。

(3) 打开消息队列

发送核通过函数MessageQ_open(String name, MessageQ_QueueId *queueId)打开已被创建的消息队列,如果成功将获得queueId,并返回状态值。

(4) 分配消息堆空间

消息被分配以后,它可以被发送到任何消息队列。它需要通过函数MessageQ_alloc(UInt16 heapId,UInt32 size)来分配消息,一般为打包后的消息结构体的大小。

(5) 发送消息

发送核首先打开被创建的消息队列,然后将消息通过函数MessageQ_put(MessageQ_QueueId ueueId,MessageQ_Msg msg)发送到队列中。

(6) 接收消息

接收核通过函数MessageQ_get(MessageQ_Handle handle,MessageQ_Msg *msg,UInt timeout)接收消息,timeout常设置为MessageQ_FOREVER,表示一直等待消息。

3.2.2 多核并行处理设计

本文以图像边缘检测处理进行介绍,任务相对比较简单,所以在此采用主从模型进行设计。在任务相对独立,涉及到的环节比较多,可以采用数据流模型进行设计。其软件框图如图6所示[6]。

图6 软件框架

在多核图像处理中,主核Core0负责任务调度、网页服务、数据采集、数据分发和整合,并参与图像处理任务。从核运行一个无限循环的任务,当接收到图像处理的消息时,进行图像处理,待完成后返回图像处理完成的消息。其图像处理流程如图7所示。

图7 图像处理流程

数据的采集利用fopen()、fread()函数[7],在CCS集成开发环境下,直接读取上位机中指定路径下的文件,但是这必须是在Debug模式下,通过仿真器进行连接才能实现。具体操作如下:

FILE * fpr = 0;

char image_name[250] = "…/images/MMMM.bmp";

fpr=fopen(image_name, "rb");

fseek(fpr, 0, SEEK_END);

input_image.length =ftell(fpr);

fseek(fpr, 0, SEEK_SET);

input_image.data=malloc(input_image.length);

fread(input_image.data,input_image.length,1, fpr);

fclose(fpr);

本文所处理的图像为BMP格式文件,它主要由位图文件头、位图信息头、调色板和图像数据构成,在处理图像的时候需要单独把图像数据提取出来。

3.2.3 网页设计及数据处理

用户通过网页选择参与处理的核数,并通过动态创建网页输出处理结果,实现用户交互,这样调试更加方便。其网页界面如图8所示,当点击Process按钮时,系统执行对应的回调函数[8]。

图8 核数选择界面

网页源码需要转换为十六进制数组形式,通过efs_createfile("index.html",INDEXHTML_SIZE, INDEXHTML)再创建网页[9],嵌入仿真平台。其中index.html为网页名,INDEXHTML_SIZE为网页大小,INDEXHTML为包含在头文件中的网页数据变量。转换工具在“…packages i dk oolsinsrc”路径下,在DOS环境下通过binsrc 这种格式运行。也可以下载“Bin2Src”软件实现转换,下载地址为http://download.csdn.net/download/kaileng999/353861。

网页通过POST方式提交表单数据,因此需要对提交的数据按照一定的规则进行解析。图9、图10是通过两种不同形式显示表单接收到的数据结果,图9为字符类型显示,图10为8位无符号整型显示。

图9 字符类型显示

结合图9和图10,可以发现表单数据比较有规律,它有行开始标识、单元格开始及结束标识、表单结束标识以及一些关键字段标识,如“name”。因此,通过这些固定的格式,很容易解析得到对应参数值。

图10 8位无符号整型显示

3.3 性能分析

在仿真模式下,计算两个断点之间的运行时间,发现fread()函数读取上位机中的一张图片需要耗费很长时间,一般高达几分钟。这可能是仿真设备的原因,仿真时电脑通过串行接口与评估板数据交流,另一方面还受评估板处理速度、内存空间的限制,导致输入读入实验板外部存储器速度慢。因此,出于算法调试速度和需要,按照网页的转换方式把图片转化为十六进制数组,包含到程序中的头文件,编译时直接写入内存。这种方法大大提高了仿真效率,但需要考虑内存不足问题。最后对不同大小的图片进行处理,其处理速度对比,具体见表1。

表1 不同大小图片处理时间(单位:ms)

通过表1可以发现处理时间与参加处理核数并不成正比,随着核数目的增加,处理时间变短。但是,随着图像变小,即处理数据量减少,它的处理速度并不总是提高,甚至耗时会越多。从中可以看出,随着处理数据量的减少,数据处理的时间越来越接近消息传递所消耗的时间,效率反而更低。因此,当任务量比较少的时候,过多的资源利用会导致浪费,所做的无用功增多。显然,在进行图像局部处理时,所选取的图片太小,数据分发式并行处理反而影响处理效率。

结 语

[1] 牛金海.TMS320C66x KeyStone 架构多核DSP入门与实例精解[M].上海:上海交通大学出版社,2014.

[2] Texas Instruments.SYS/BIOS Inter-Processor Communication (IPC) 1.25 User’s Guide,2012.

[3] 肖亮,张学健.基于多核DSP的超声成像处理算法的并行实现[J].电子技术应用,2013,39(6):27-30.

[4] Texas Instruments.TMS320C66x DSP Cache User Guide,2010.

[5] Texas Instruments.Multicore Programming Guide,2012.

[6] Texas Instruments.MCSDK Image Processing Demonstration Guide,2015.

[7] 谭浩强.C程序设计[M].北京:清华大学出版社,2005.

[8] Texas Instruments.TI Network Developer’s Kit (NDK) v2.21 User’s Guide,2012.

[9] Texas Instruments.TI Network Developer’s Kit (NDK) v2.21 API Reference Guide,2012.

郑武兴(硕士研究生),主要研究方向为信息处理理论与方法;王春平(教授),主要研究方向为图像处理、火力控制理论与应用;付强(讲师),主要研究方向为计算机视觉、网络化火控与指控技术。

Inter Core Communication and Programming Skills of Multicore DSP Parallel Processing

Zheng Wuxing,Wang Chunping,Fu Qiang

(Department of Electrics and Optics Engineering,Ordnance Engineering College,Shijiazhuang 050003,China)

In the paper,the parallel processing design based on the image is implemented in TMDSEVM6678L,and its performance is analyzed.The usual methods of the Inter-Processor Communication (IPC), as well as the basic techniques of multicore programming are introduced.It implements user interaction via the web,and provides data parse ideas through the analysis of web page data transmission.Through analysis and comparison of the data acquisition speed,the suitable data acquisition method is adopted to improve the simulation efficiency.Finally,it indicates that the message mechanism for IPC is used to implement parallel processing practicability and applicability from the processing time of different data quantity and the experimental results.

TMS320C6678;parallel processing;IPC;message mechanism

TP302.7

A

士然

2017-01-06)

猜你喜欢
间通信队列图像处理
队列里的小秘密
基于多队列切换的SDN拥塞控制*
综合航电分区间通信元模型设计研究
基于图像处理的机器人精确抓取的设计与实现
在队列里
机器学习在图像处理中的应用
丰田加速驶入自动驾驶队列
基于图像处理的定位器坡度计算
Photo Shop通道在图像处理中的应用
基于核间寄存器的多核虚拟机系统中虚拟机间通信研究