APP下载

国产BWDSP的并行通信接口设计

2021-05-10蔡恒雨宁成明郑启龙

小型微型计算机系统 2021年5期
关键词:数据包卷积矩阵

蔡恒雨,宁成明,侯 璇,郑启龙,2

1(中国科学技术大学 计算机科学与技术学院,合肥 230026)

2(中国科学技术大学 国家高性能计算中心,合肥 230026)

1 引 言

高性能计算设备进入了快速发展期,如DSP、ASIC和FPAG等硬件系统都在快速发展,并且逐渐走向成熟.随着时代的发展,人类产生的数据越来越多,采用单个计算设备往往无法处理这些数据,通常使用分布式计算设备对这些数据进行处理和分析.

美国德州仪器(TI)是一家知名的数字信号处理器设计和生产公司.它生产的TMS320[1]系列数字信号处理器系列具有功能丰富和成本低等特点,已经广泛应用于各行各业.亚德诺(ADI)公司设计了定点DSP芯片如ADSP2111/2115等,浮点DSP芯片如虎鲨TS101和TS201S[2]等,目前也获得了广泛使用.Motorola公司也设计了定点DSP处理器MC56001和浮点DSP芯片MC96002.BWDSP系列处理器[3]是由中国电子科技集团公司第38研究所研制的一款具有完全自主知识产权的芯片,可以实现高性能计算,在图像处理,视频处理,自然语言处理和雷达信号处理[4]等领域具有广泛应用.其中雷达信号处理,在我国军工业的发展中具有十分重要的意义.

分布式系统的发展中,高性能数据通信协议和并行编程发挥着重要作用.RapidIO协议[5]作为一种嵌入式系统的数据通信协议,具有成本低和传输速度快的特点,广泛应用于各种嵌入式系统的互联.该协议可以用于DSP和DSP之间,板卡和板卡之间的互联,支持的信号传输速率可以达到1.25GHz、2.5GHz和3.125GHz.同时出现了许多大规模的并行计算机系统,如SMP[6]、MPP和DSM等,而并行计算通信技术在并行计算机系统中具有重要意义,通常分为数据并行和任务并行机制.各种并行计算通信标准层出不穷,如基于消息传递的MPI[7]和基于共享内存的OpenMP[8].MPI是一种基于消息传递的数据通信接口,提供了丰富的数据通信能力,如点对点通信和群集通信接口.通过MPI编程接口,用户可以轻松的编写并行程序,充分使用分布式计算系统的并行计算能力.基于MPI标准诞生了MPICH和OpenMPI两个重要的实现.由于MPICH具有更好的可移植性的特点,现阶段比较流行的是MPICH2.MPICH2[9]支持多种数据通信协议,在消息传递基础上扩展了对共享内存的实现,提供了数据通信和同步控制功能,还可以用于发现内存一致性错误[10].

BWDSP芯片具有较强的计算能力,适合处理计算密集型任务.虽然BWDSP虚拟平台提供了数据通信接口和同步功能,用户使用并不方便.本文在BWDSP虚拟平台基础上,借鉴主流并行编程库MPICH,设计了优化的并行通信库MPIRIO,提高在BWDSP虚拟平台上进行编程的方便性和灵活性,同时提升并行任务处理效率.本文接下来的组织如下:第2部分介绍MPI协议和BWDSP虚拟平台;第3部分介绍并行计算通信MPIRIO的设计及其在深度学习的应用;第4部分介绍MPIRIO的相关实验和性能评估;第5部分是总结.

2 MPI协议与BWDSP虚拟平台

2.1 MPI协议

2.1.1 MPI协议结构

MPI作为一个主流的并行通信库,已经获得广泛应用,发展出MPICH和OpenMPI两个主要分支.本文主要以MPICH2为例进行分析,其体系结构可以分为4层架构,自下而上分别是通信协议层,CH3层,ADI层和API层,其中通信协议层具体有SSM通信协议,SCTP通信协议和TCP通信协议[11]等.MPICH2不仅支持消息传递机制,并且扩展了对共享内存通信的支持.

MPICH2的上层(MPI/API层)与环境无关,它主要是提供用户接口,并处理与环境无关的MPICH数据结构.MPICH2新定义了MPID层,即抽象设备接口层ADI3,为上层应用提供一种与具体设备无关的通信接口.并在ADI3下面又抽象出一层通道接口CH3层,提供了CH3接口供开发者实现自己的通信接口.在本文中,主要是基于BWDSP虚拟平台使用的RapidIO协议设计相关并行通信接口.

2.1.2 MPI通信接口

MPI提供了两种类型的数据通信接口,即阻塞型通信接口和非阻塞型通信接口.同时提供了4种数据的发送模式,4种发送模式的相应函数具有相同的调用参数,但是对于消息的发送和接收的状态要求不同.结合两种类型和4种模式,可以形成8种点对点通信函数,其函数名与对应通信类型如下:

1)MPI_Send():阻塞标准通信类型;

2)MPI_Bsend():阻塞缓存通信类型;

3)MPI_Ssend():阻塞同步通信类型;

4)MPI_Rsend():阻塞就绪通信类型;

5)MPI_Isend():非阻塞标准通信类型;

6)MPI_Ibsend():非阻塞缓存通信类型;

7)MPI_Issend():非阻塞同步通信类型;

8)MPI_Irsend():非阻塞就绪通信类型.

MPI标准提供的群集通信函数主要包括MPI_bcast()、MPI_scatter()、MPI_reduce()和MPI_gather()等.MPI_bcast()函数提供消息的广播功能,即发送节点将消息发送到所有其他节点.MPI_scatter()函数提供消息的分发功能,即将发送方的数据分成多个部分,每个部分发往不同的接收方节点.MPI_bcast()函数提供消息的聚集功能,即所有节点都向一个接收节点发送消息.MPI_reduce()函数提供消息的规约功能,即所有节点都发送消息,将这些消息按照某种操作运算后发送到接收节点.

2.2 BWDSP虚拟平台

2.2.1 BWDSP体系结构

BWDSP系列处理器是由中国电子科技集团公司第38研究所研制32位DSP处理器,其体系结构采用分簇式架构.每个处理器上有4个簇,每个簇上有4个支持MAC操作的乘法器,其最高可达30GOPS的运算能力.BWDSP的指令系统支持SIMD和VLIW类型的操作,可以用一条指令同时实现多个数据运算操作.

BWDSP芯片的最大工作主频为 500MHz,指令周期为2ns.芯片内部数据读取位宽可以达到512比特,数据写位宽可以达到256比特.由于其体系结构特点和计算能力较高,适用于深度学习应用和高性能计算领域.基于BWDSP芯片设计分布式计算平台,提供并行编程库具有重要意义.

2.2.2 RapidIO协议

RapidIO协议作为嵌入式系统互联的数据通信协议,具有传输速率快和成本低的特点,适合未来高性能嵌入式设备之间的相互连接.该协议的3层体系结构自下而上为物理层,传输层和逻辑层,主要包括两种设备,分别是终端设备和交换设备.其中逻辑层位于最上面,定义了数据包的格式和语义信息;传输层位于中间,主要定义数据包的调度和路由机制;物理层位于最下面,主要包括物理链路的传输特性、流量和错误管理等.

一个事务的完整过程是,RapidIO发送设备会发出请求数据包,交换设备收到该请求包后,会判断是否由自己操作,如果是则直接处理该数据包.否则,会根据数据包中目标地址结合路由表信息,通过合适出口进行转发.当接收设备收到事务包后,会对数据包进行判断和处理,并发送响应数据包.响应数据包的传输过程类似请求数据包,可以将其视为一种反向的“请求数据包”.

2.2.3 BWDSP虚拟平台框架

基于BWDSP芯片设计了BWDSP虚拟平台,该虚拟平台采用RapidIO协议作为数据交换协议,实现BWDSP芯片之间的通信功能,为深度学习[12]应用和其他高性能计算应用提供基本通信原语和同步控制.

BWDSP单板卡系统的整体设计是采取4个BWDSP模型与1个RpaidIO交换模型组成,其整体结构图如图1所示.BWDSP模型分别连接到交换模型的4个端口上,将交换模型的剩余端口用于互联其他单板卡,或者存储模型,或者交换模型.外部存储器模型可以是Flash或者DDR等,实现BWDSP对存储器中信息的快速读写.BWDSP虚拟平台向外提供了数据传输接口MRIO_send()和MRIO_recv()函数,实现BWDSP芯片之间的数据传输.

图1 BWDSP虚拟平台框架

BWDSP虚拟平台中传输的RapidIO数据包长度为r_lenByte,BWDSP模型的时钟频率为b_freHz,数据总线的位宽为b_widthBit.RapidIO交换模型的时钟频率为r_freHz,数据传输速率为r_speedGbs.虚拟平台中的交换芯片在每个工作周期中,可以完成对数据包的转发或者处理.当BWDSP虚拟平台的BWDSP模型和RapidIO交换模型协同工作时,r_fre和b_fre的关系满足公式(1),r_speed和r_fre的关系满足公式(2).当传输的RapidIO数据包长度为276字节时,BWDSP虚拟平台数据传输速率可以达到4.416Gbs.

(1)

r_speed=r_fre×r_len×8

(2)

3 MPIRIO的设计与实现

3.1 MPIRIO的设计

MPI作为一个主流的并行通信库,已经获得广泛应用.同时MPI提供的群集通信函数适合深度学习模型的并行训练,充分利用训练数据,并提高训练速度.因此设计了基于BWDSP和RapidIO的并行计算通信库MPIRIO,使深度学习模型更好的部署在BWDSP虚拟平台上.MPIRIO借鉴MPI的分层结构,通过在CH3通道接口层之下增加RapidIO通信协议实现,将该协议实现命名MRIO.

深度学习模型中存在多级并行性,如一个batch通常包含多条数据,一条数据通常用矩阵表示等.MPIRIO需要设计优化的群集通信算法[13],提升并行通信能力,使用BWDSP平台提供的并行计算能力.

3.1.1 MPIRIO工作机制

MPIRIO类似MPI标准,通过将一个大型计算任务分成多个小任务进行解决.通常并行任务的处理过程分为划分、映射、通信和聚集4个步骤.

主机(CPU)将任务分发到BWDSP板卡上的各个BWDSP芯片上,各芯片完成自己的任务后,通过RapidIO交换模型进行通信,直接将数据进行交换完成相应计算任务,无需再将数据发送回主机端.当获得最终计算结果后,选择其中某个BWDSP芯片将数据传回主机.其工作机制如图2所示,可以减少数据传输时间,同时降低对主机计算资源的占用率,此时主机可以调度其他计算任务.该工作机制实现了双重计算和通信的重叠,首先是各BWDSP计算和BWDSP之间通信的重叠,其次是主机计算和BWDSP之间通信的重叠.

图2 MPIRIO工作机制图

深度学习模型中数据并行模式通常是各计算设备对数据进行处理,然后将结果返回给参数服务器,由参数服务器将更新后的参数再重新分发给各计算设备.采用MPIRIO之后可以实现计算设备之间相互通信,从而直接进行模型参数的交互,在计算设备上对参数进行更新,降低通信开销.模型并行中考虑流水线实现方式,即各个BWDSP计算完本设备上的模型层后将结果数据保存并传给下一个BWDSP,同时开始计算下一次的输入数据.

3.1.2 MPIRIO通信流程

根据MPI通信标准,设计如下6个MPIRIO函数(此处忽略函数相关参数介绍):

1)MPIRIO_Init():MPIRIO通信系统初始化;

2)MPIRIO_Finalize():MPIRIO通信系统销;

3)MPIRIO_Comm_rank():获得当前进程在通信域中标号;

4)MPIRIO_Comm_size():获得通信域中进程数;

5)MPIRIO_Send():进行消息的发送;

6)MPIRIO_Recv():进行消息的接收.

MPIRIO需要提供一些通信管理函数,如判断发送和接收结束等.MPIRIO的数据通信流程如图3所示.发送方调用MPIRIO_Send()函数发送数据后,通过一系列的函数调用会到达BWDSP芯片提供的MRIO_send()函数,该函数根据数据包中的目标ID将数据包相关信息送到接收方的expected/unexpected队列中.接收方调用MPIRIO_Recv()函数后,经过一些列函数调用到达BWDSP芯片提供的MRIO_recv()函数,该函数会从芯片的expected/unexpected队列中查找,相应的数据发送请求是否到达.如果需要的数据已经到达,则将数据交付给上层应用进行相应的处理.

图3 MPIRIO通信流程图

3.1.3 MPIRIO群集通信函数

深度学习模型中存在大量计算并行性,需要MPIRIO提供优化的broadcast,reduce和gather等群集通信功能.

MPI提供的broadcast算法采用类似二叉树的传播方式,不考虑进程在节点中的位置,只根据进程rank进行传播,设共有N个进程,时间复杂度近似为O(log2N),如图4上半部分所示.本设计中,BWDSP芯片上只能启动一个进程进行计算,故将一个BWDSP单板卡看成一个节点,将多个BWDSP单板卡互联构成多板卡系统.MPIRIO的广播算法是由发送方将数据传到相连的switch中,由该switch采用复制分发向各个输出端口进行转发,时间复杂度近似为O(log4N),算法示意图如图4下半部分所示.

图4 MPI和MPIRIO广播通信示意图

MPIRIO考虑到深度学习模型的参数更新机制,通过reduce操作可以将各计算设备得到的参数梯度值进行聚合规约.MPIRIO利用RapidIO交换模型在gather聚合过程中,将多个设备的参数梯度值封装在一个数据包中进行传输,从而降低数据传输量,如图4所示.MPI标准提供的gather操作数据包传输量大约N×log4N,而MPIRIO的数据包传输量大约(N-1)×4/3,时间复杂度可以参考MPIRIO的广播算法.MPIRIO的reduce操作也可以采用类似的机制实现.

设计全局通信域MPIRIO_COMM_WOLD和局部通信域MPIRIO_COMM_LOCAL,分别用于全局和局部的群集通信中.BWDSP虚拟平台初始化后,形成的整个拓扑结构作为全局通信域.在初始化过程中,为每个RapidIO交换模型分配一个标识符,每个RapidIO交换模型相连的BWDSP模型组成一个局部通信域,即每个BWDSP单板卡作为一个局部通信域.

算法1描述了MPIRIO的广播操作MPIRIO_Bcast()函数的具体实现过程.

算法1.MPIRIO_Bcast()函数算法

输入:数据缓冲区,数据个数,发送方ID,通信域等

输出:数据传输是否成功状态

1.系统首先会感知整个系统的状态,这部分功能由MPIRIO_Init()函数实现,获得整个系统的拓扑结构.

2.if(发送方ID==通信域中rank标识位)

执行3中MRIO_send()函数,并且在调用MRIO_send()函数时提供的数据包为广播类型数据包

else

执行MRIO_recv()函数,准备接收发送方发送的数据包

3.MRIO_send()对接收到的数据包进行解析,并调用相应的处理逻辑

if(数据包类型==单播数据包)

根据目标方ID查找路由表,并进行数据转发

elseif(数据包类型==广播数据包)

if(该数据包标识符之前未出现过)

for(循环RapidIO交换模型的每个端口)//排除输入该信息的端口

复制该数据包并从循环到的端口转发出去

else

不对该数据包进行处理,直接丢弃

算法2描述了MPIRIO的聚集操作MPIRIO_Gather()函数的具体实现过程.

算法2.MPIRIO_Gather()函数算法

输入:发送数据缓冲区,数据个数,接收数据缓冲区,接收方ID,通信域等

输出:数据传输是否成功状态

1.系统首先会感知整个系统的状态,这部分功能由MPIRIO_Init()函数实现,获得整个系统的拓扑结构.

2.if(发送方ID==通信域中rank标识位)

执行MRIO_recv()函数,准备接收发送方发送的数据包

else

执行3中MRIO_send()函数,并且在调用MRIO_send()函数时提供的数包为聚集类型数据包

3.MRIO_send()对接收到的数据包进行解析,并调用相应的处理逻辑

if(数据包类型==单播数据包)

根据目标方ID查找路由表,并进行数据转发

else if(数据包类型==聚集数据包类型)

对应数据包标志位计数器gather_count++

if(gather_count==(连接设备端口数-1))

将RapidIO交换模型中缓存的数据封装,从剩余的端口号port转发

else

则将该数据包的数据部分放入RapidIO交换模型中缓存

3.1.4 MPIRIO同步控制

MPIRIO中需要考虑多种不同优先级和数据长度的包进行传输,设计不同优先级的数据流.规定优先级高的数据流可以先进行数据传输,在优先级相同情况下,较短的数据包先进行发送.通过优先级传输方式,可以降低系统阻塞的概率,提高数据传输速率.由于RapidIO交换协议支持的数据包长度最大为276字节,其中有效数据部分为250字节,故上层应用发送的数据包长度过长时,BWDSP虚拟平台的通信接口会将数据包进行拆分,分成多个具有相同标识符的RapidIO数据包进行发送.

BWDSP通信代码库提供通信同步的底层原语,上层利用该原语实现通信过程的同步控制.深度学习中的参数调整,需要先得到旧的参数值和参数更新值后,才能将旧的参数调整为新的参数,并且每一批次的训练数据在各个计算设备上的处理顺序要保持一致.MPIRIO的通信同步过程需要考虑底层RapidIO交换模型提供的发送响应机制,RapidIO采用类似握手协议机制实现同步控制,MPIRIO在RapidIO的基础上设计了MPIRIO_Barrier()函数.MPIRIO_Barrier()函数作为MPIRIO的同步路障函数,其实现如图5所示.

图5 MPIRIO_Barrier实现示意图

算法3描述了MPIRIO的同步路障操作MPIRIO_Barrier()函数的具体实现过程.

算法3.MPIRIO_Barrier()函数算法

输入:全局通信域

输出:函数执行成功标志

1.系统首先会感知整个系统的状态,这部分功能由MPIRIO_Init()函数实现,获得整个系统的拓扑结构.

2.MPIRIO_Barrier()函数的内部实现

各个BWDSP芯片执行到该函数后,会将共享内存区域的barrier_count++

if(barrier_count==全局通信域中size标识位)

该BWDSP芯片继续执行

通知其他因为barrier而等待的BWDSP芯片继续执行

else

该BWDSP芯片等待,收到其他BWDSP芯片的通知后继续执行

3.1.5 MPIRIO性能分析和优化

MPIRIO需要提供基本性能分析功能,可以对系统中的数据传输量和传输时间等进行统计,估计系统流量的程度,并将统计结果返回给用户.设计了MPIRIO_time()函数,该函数通过记录各个进程开始执行时的时钟周期数cl_start,系统统计时的时钟周期数cl_end,结合系统时钟频率cl_frequence可以得出进程运行时间t_thread,其公式如公式(3)所示.同时设计了MPIRIO_traffic()函数,该函数可以记录系统中传输的所有数据包的数量pkt_number.结合MPIRIO_time()函数,可以得到系统过去时间的平均流量程度sys_flow,如公式(4)所示,其中N代表BWDSP模型的数量,ti_thread是考虑到不同BWDSP模型的执行时间.

(3)

(4)

考虑底层的BWDSP虚拟平台经过扩展互联后,可能形成图型拓扑结构,需要设计动态路由方案,针对数据通信进行优化.对点对点通信进行最佳路由选择,同时对群集通信实现负载均衡[14].

BWDSP虚拟平台以RapidIO作为交换模型,采用分布式路由算法.故本文采用最小生成树算法[15]实现负载均衡,该算法是在MPIRIO_Init()函数中实现的.MPIRIO_Init()函数首先感知整个BWDSP虚拟平台系统的拓扑结构,然后根据拓扑结构信息采用Prim算法获得最小生成树结构,并相应的修改虚拟平台中RapidIO交换模型路由表信息.图6上半部分是BWDSP平台原来的拓扑结构,图6下半部分是最小生成树算法生成的拓扑结构.

图6 BWDSP平台优化前后拓扑结构

3.2 MPIRIO卷积运算分析

MPIRIO并行计算通信库除了用于常规的并行计算任务,如矩阵乘法,蝶形求和等基本算法,还应该为深度学习应用服务,使深度学习应用在BWDSP虚拟平台上的部署成为可能.BWDSP平台本身提供了深度学习算子库bwdnn,包括卷积算子、池化算子和softmax算子等.

由于深度学习模型通常较大,难以部署在单个BWDSP芯片上,通常需要部署在多个BWDSP芯片构成的BWDSP平台上.MPIRIO使各个BWDSP上的深度学习模型层与层之间更好的通信,包括前向传播时中间结果的传递和反向传播时梯度和损失信息的传递.

神经网络中卷积运算[16]的本质是乘加运算,包括一维卷积运算、二维卷积运算和三维卷积运算.以二维卷积为例进行分析,由于输入数据与卷积核通道数一样,所以二维卷积运算输出数据是二维矩阵.卷积运算填充方式为“VALID”,则输出数据维度OH和OW满足公式(5),卷积运算相关参数介绍如下:

1)IH:输入数据高度;

2)IW:输入数据宽度;

3)CI:输入数据/卷积核通道数;

4)OH:输出数据高度;

5)OW:输出数据宽度;

6)KH:卷积核高度;

7)KW:卷积核宽度;

8)SH:卷积步长高度;

9)SW:卷积步长宽度.

(5)

BWDSP进行卷积运算优化时,采用im2col[17]方式实现.即将卷积运算的输入数据和卷积核分别转化为二维矩阵和一维矩阵,再进行矩阵相乘.BWDSP芯片内部有16个乘加器,可以同时进行16个乘加运算.进行数据划分时,将输入矩阵以16个滑动窗口数据为一组分配给BWDSP模型,充分利用BWDSP和MPIRIO提供的并行化能力.

4 实验及评估

实验过程是通过在不同BWDSP虚拟平台拓扑结构下,对MPIRIO的点对点通信函数和群集通信函数功能进行测试.使用MPIRIO对常规并行计算任务,如矩阵乘法和蝶形求和算法进行测试,同时对深度学习中常见的卷积运算进行测试.最后将MPIRIO与MPICH实现的通信功能进行对比,主要是从数据传输和时间进行分析,并与已有工作进行对比分析.

4.1 MPIRIO基本性能实验

在不同BWDSP虚拟平台拓扑结构下,测试了MPIRIO设计的点对点通信函数MPIRIO_Send()和MPIRIO_Recv()函数,群集通信函数MPIRIO_Bcast()、MPIRIO_Reduce()、MPIRIO_Gather()和MPIRIO_Scatter()函数的数据传输性能和实现原理.如表1所示是在8个和16个BWDSP模型下数据传输测试结果,其中数据量单位是字节,时间单位是微秒.由于每个BWDSP上只能执行一个进程,故MPIRIO的测试中进程意义等于BWDSP模型.

表1 MPIRIO在8和16进程数据传输测试

从表1中可以看出,数据传输时间受系统拓扑结构影响,系统拓扑结构越大越复杂,则数据传输时间越长.以基本的点对点通信分析,在8个进程控制的情况下,数据传输量10K左右的情况需要时间202微秒.在16个进程控制的情况下,传递相同数据量需要时间313微秒,这是因为系统拓扑结构变得复杂,数据在通信时需要经过更多的RapidIO交换模型.在相同数据传输量的情况下,规约操作需要的时间最长,这是因为MPIRIO可以在RapidIO交换模型中对数据进行规约操作,此部分时间被考虑在数据传输时间中.其次是聚集操作,在RapidIO交换模型中会对数据包进行封装消耗部分时间,从而减少数据包的传输量.广播操作则是在RapidIO交换模型处对数据包进行复制转发,在一定程度上会降低数据通信时间.

对MPIRIO的路障函数和性能统计等函数进行了测试,都可以正确实现功能,实现各BWDSP模型的协同工作.

4.2 MPIRIO常规计算任务实验

常规并行计算任务有矩阵乘法和蝶形求和算法等,对MPIRIO实现常规并行计算任务进行实验和分析.对于矩阵乘法,我们采用不同方法进行测试,包括基本分片乘法和类Fox乘法实验(基本分片乘法用1表示,类Fox乘法用2表示).测试结果均正确,表明MPIRIO可以正常实现矩阵乘法,MPIRIO矩阵乘法实验结果如表2所示,是在8个进程下进行测试,时间单位是微秒.

表2 MPIRIO在8进程矩阵乘法时间

矩阵A和矩阵B进行矩阵基本分片乘法,各个BWDSP模型上拥有矩阵B的所有数据.BWDSP0号模型拥有矩阵A的数据,将矩阵A按照BWDSP模型数分成8份,通过MPIRIO_Scatter()函数进行散射.各个BWDSP模型接收到A的分块数据后,跟矩阵B进行相乘,分别得到部分矩阵相乘结果.然后由BWDSP0模型执行规约算法,获得各个BWDSP模型上的部分矩阵相乘结果,最后BWDSP0模型上拥有整个矩阵相乘结果.设矩阵A数据为m×n,矩阵B的数据为n×m,数据传播速率为s,BWDSP模型计算能力为c,读写数据带宽b,则基本分片乘法时间t_s如公式(6)所示.

(6)

矩阵A和矩阵B进行矩阵类Fox乘法,BWDSP0模型拥有矩阵A和矩阵B的数据,通过MPIRIO_Scatter算法将矩阵A按行和矩阵B按列分片发往各个BWDSP模型.各个BWDSP模型完成部分矩阵运算后,将自身的矩阵B分片向下一进程发送,得到新的矩阵B分片与自身的矩阵A分片进行运算.当每个BWDSP模型完成A分片和所有B分片的运算后,BWDSP0模型执行规约算法获得整个矩阵相乘结果,其时间t_c如公式(7)所示.

(7)

从表2可以看出,当矩阵乘法数据在8×8矩阵到8×50矩阵规模时,时间处于增加状态.由于进程启动等开销,以及数据传输过程中对缓存资源的占用开销等,使得矩阵乘法时间并不是按倍数进行增加.同时可以看出矩阵乘法2相比较矩阵乘法1,时间消耗明显增加了,这是由于采用了时间换空间的思想,增加了不同BWDSP模型之间数据传输开销.

蝶形求和算法是一种求解全局和的算法,在MPI并行编程中,是一个基本测试用例.MPIRIO中可由用户编写算法实现蝶形求和,还可以使用MPIRIO_Reduce()函数中MPIRIO_SUM实现类似全局求和功能.分别测试两种算法的时间开销(自编写算法用1表示,MPIRIO_Reduce实现用2表示),测试结果如表3所示,数据量单位是字节,时间单位是微秒.设BWDSP模型数为N,则MPIRIO_Reduce()算法的时间复杂度约为O(log2N).实验结果表明,采用Reduce规约算法实现蝶形求和算法优于自编写算法,因为自编写算法需要通过多次点对点通信实现,并且需要更复杂的同步控制.规约算法在RapidIO交换模型中对数据进行规约处理,减少了数据包的传输.

表3 MPIRIO蝶形求和

4.3 MPIRIO卷积运算实验

MPIRIO的设计目标之一,是为深度学习模型在BWDSP平台上的部署服务.神经网络中主要的卷积算法,可以使用MPIRIO在BWDSP平台上运行.针对卷积算法,使用im2col方法进行优化,将输入数据和卷积核都转化为矩阵形式,然后结合矩阵相乘算法进行实现.

卷积运算测试结果如表4所示,其中卷积运算输入数据填充方式统一为“VALID”,步长为1,时间单位为微秒.测试是在8个BWDSP模型下进行,并将卷积运算数据平均分配给各BWDSP模型.

表4 MPIRIO卷积运算测试

以表4中第4条数据分析,其输入数据维度为36×36×3,卷积核维度为5×5×3,数据填充方式.根据公式(5)知输出数据应该为32×32×1维,与表格中输出数据维度一致,表明通过MPIRIO可以编程实现卷积运算.MPIRIO将表4中第4条卷积运算数据,转化为16×75与75×1的矩阵相乘,并使用基本分片乘法测试得到时间,故用MPIRIO设计卷积运算类似于设计矩阵乘法.

4.4 MPIRIO与MPICH对比实验

MPICH2作为主流的并行编程库,与其进行对比具有重要意义.硬件环境为Intel Core i5-2400 CPU @ 3.10GHz,操作系统为ubuntu 16.04 LTS,内存8GB,配置并行编程库MPICH2,设为环境1;Intel Core i7-6700HQ CPU @ 2.60GHz,操作系统windows10,内存8GB,软件环境为Visual Studio 2017,配置并行编程库MPICH2,设为环境2.测试MPICH2的点对点通信函数和群集通信函数性能,并与MPIRIO的通信函数进行对比,测试结果如表5所示,其中数据量单位为字节,时间单位为微秒.

表5 MPICH2通信函数测试

为了正确对比,表1和表5中时间都是在系统频率为1MHz下的测试结果.环境1中MPICH2通信时间普遍比MPIRIO的时间短,这是因为MPICH2是在单机上进行测试,而MPIRIO是分布式的BWDSP虚拟平台上进行测试,数据通过RapidIO交换模型时需要时间,从而会使得数据通信时间略长.可以发现MPICH2中点对点通信在8进程和16进程时间差距较大,因为点对点通信采取阻塞通信方式,故循环向其他进程发送消息需要较长时间,随着进程数的增加通信时间相应增加.

环境2中各函数通信时间相比MPIRIO和环境1是最多的,主要是因为本实验选型i5CPU是4核心,而i7CPU核心数是2核心,在一定程度上i5并发性高于i7.另一方面是因为ubunt系统下直接采用MPICXX进行编译,优于windows下visual studio编译MPI程序.由于上述等因素,MPIRIO的通信时间也比环境2的通信时间低.

修改MPICH2源码,在其通信函数中对发送和接收数据包数量进行统计.通过MPICH2群集通信数据包数量统计,对比MPIRIO的群集通信函数数据包数量,表明MPIRIO群集通信函数进行了优化.MPICH2和MPIRIO的群集通信数据包数量统计情况,如表6所示,数据量单位是字节.

表6中的数据包数量是各个进程发送和接收的数据包数量之和,在相同的8进程数情况下,MPIRIO的群集通信数据包数量比MPICH2少,这是因为MPIRIO的群集通信操作进行了优化.由于采用不同CPU进行测试,发送的数据包的数量是一样的,故该测试不区分环境1和环境2.MPIRIO群集通信接口的实现在MPI的基础上进行了修改,并扩展了RapidIO交换模型的功能,使其可以适应MPIRIO设计的广播、聚集和规约等算法的需求.

表6 MPICH2和MPIRIO群集通信数据包数量

4.5 实验总结

综合上述实验结果和分析,基于 BWDSP虚拟平台的并行计算通信库MPIRIO,符合MPI标准规范,可以实现BWDSP芯片之间的点对点通信和群集通信,并对群集通信函数进行了优化.MPIRIO可以用于常规并行计算任务,结合BWDSP体系结构特点对卷积运算进行了优化.最后通过与MPICH的对比实验,表明本文设计的MPIRIO群集通信优化算法可以正常工作.

本文研究与文献[3]的研究存在相应联系,但也具有差异性.两者都是基于单核BWDSP芯片构成的多核平台展开研究,同时考虑了深度学习在平台上的部署运行问题.但是本文工作是以未来实际生产的单板卡和多板卡为原型,设计相应的并行通信接口,方便用户对常规并行任务的处理,再此基础上分析深度学习中卷积运算并行性特点,并对其进行支持.而文献[3]则是以多个DSP直接相连作为平台原型,并且在此基础上研究流水线,三缓冲区等技术,加速深度学习运行.

5 总 结

本文在BWDSP虚拟平台的基础上,借鉴了已有的MPI标准,设计了并行计算通信库MPIRIO.MPIRIO是以RapidIO交换模型作为通信协议,并在RapidIO握手协议机制的基础上实现了通信的同步控制.在MPICH提供的通信函数接口基础上,本文设计了优化的群集通信函数,主要目标是减少通信中数据包的传输量.同时在复杂系统拓扑结构下,采用最小生成树算法获得最优拓扑结构,使系统平均传输性能较好.本文提供的MPIRIO通信接口,通过将BWDSP,RapidIO和MPI三者相结合,相比BWDSP虚拟平台提供的基本通信原语,提升了用户编程并部署任务在虚拟平台上的方便性和灵活性,同时提高了整个系统的运行效率.

本文通过实验和对比实验,证明了MPIRIO的可用性,并分析了MPIRIO相比MPI标准所做出的部分优化.在未来的工作中,进一步完善并行通信库MPIRIO,提供更多的MPI规范标准接口,如向量化的通信接口.设计更加优化的路由选择和数据调度算法,并提升MPIRIO的可移植性,使其可以适应新的硬件平台.

猜你喜欢

数据包卷积矩阵
基于全卷积神经网络的猪背膘厚快速准确测定
基于图像处理与卷积神经网络的零件识别
二维隐蔽时间信道构建的研究*
一种基于卷积神经网络的地磁基准图构建方法
基于3D-Winograd的快速卷积算法设计及FPGA实现
C#串口高效可靠的接收方案设计
多项式理论在矩阵求逆中的应用
网络数据包的抓取与识别
矩阵
矩阵