王泽中, 王春华, 王正茂, 张多利
(1.合肥工业大学 电子科学与应用物理学院,安徽 合肥 230601; 2.教育部IC设计网上合作研究中心,安徽 合肥 230601)
为了适应计算复杂度更高、更多元化的应用,片上系统(system-on-a-chip,SoC)中集成了多个处理器核,显著提升了系统的数据处理能力,同时也对外部存储器的带宽提出了更高的要求。为满足多核SoC系统对外部存储器高带宽、大容量等需求,人们设计了DDR、GDDR、HBM等多种外部存储器,用于提高系统性能[1-2]。当前外部存储器带宽能够达到数百GB/s,如HBM2存储标准JESD235C的单堆栈理论最大带宽为410 GB/s,4堆栈HBM2理论带宽为1.64 TB/s。
多核处理器一般采用多级存储结构[3-4],利用程序的空间局域性和时间局域性提高访存效率,但是对于局域性较差的任务,多级存储结构的优势并不明显。为了提高多核SoC系统对高带宽外部存储器的带宽利用率,需要设计并行访存接口,充分利用外部存储器的带宽,使用单个外部存储器实现多核并行访存[5-6]。
本文针对多核SoC系统工作过程中存在多运算单元并行访存,且访存模式多样的特点,设计了一种支持多运算单元并行访问外部存储器的访存控制器。该并行访存控制器针对目标系统任务类型的多样性,设计了一种两级仲裁与并行访存相结合的机制,对不同类型任务进行分组,组内根据任务的访存特点设计并行访存机制,实现多运算单元并行访存;组间通过两级仲裁机制选择访问外部存储器的组,实现高优先级任务快速响应以及读写任务轮流工作。
本文设计的并行访存控制器能够适应多种访存模式,并根据系统需求合理对带宽进行分配,高效利用外部存储器的带宽,有效提高系统的访存效率,从而提高系统性能。
多核系统中集成了多个不同的运算单元、存储模块、输入输出接口、主控制器等结构,其数据传输模型示意图如图1所示,各运算单元间通过片上网络(Network-on-Chip,NoC)互相连接,数据通过数据网络传输,运算单元通过对应节点的NoC接口与网络进行数据交互。
图1 多核系统数据传输模型
目标系统为面向矩阵运算的异构多核系统,系统中连续的数据存储在片外存储器中,将任务对应的大批量数据分为多组,通过多运算单元并行计算来提高处理效率。根据任务类型可使用并行工作模式与独立工作模式。
若任务数据被分为i(i≥1)个数据组,并行工作模式下,使用多个运算单元协同对数据组进行处理,运算单元访存同步进行,按照顺序依次处理数据组1,数据组2,…,数据组i。
独立工作模式下,使用数量不定的运算单元,将所有数据组均分给运算单元,运算单元依次处理所分配的数据组,每个运算单元独立处理一个数据组。若使用x(i≥x≥1)个运算单元,每个运算单元需要处理的数据组数量为:
z=i/x,
其中,第y个运算单元依次取第y个,第y+x个,第y+2x个,…,第y+(z-1)x个数据组作运算。
目标系统中的访存任务类型主要有指令读取任务、并行任务、独立任务3种。指令读取任务从存储器中读取指令,并行任务与独立任务分别用于并行工作模式与独立工作模式下的运算单元访存。工作过程中,多个运算单元会通过不同的网络节点发出不同类型的访存请求,访存控制器根据请求对外部存储器进行访存操作,通过请求对应节点的接口与数据网络进行交互,多类型任务访问模型如图2所示。
图2 多类型任务访问模型
根据排队论模型,请求访存的运算单元、访存控制器、外部存储器可以看作模型中的顾客、队列以及服务台。在描述目标系统的任务访存状态时,主要考虑队列中顾客的数量、顾客需求的服务模式、队列容量限制3个参数,对应需要访问外部存储器的运算单元数量、运算单元请求的服务模式、外部存储器支持同时访问的最大运算单元数目。建立参数模型[N,M,Q](M≤N≤Q)描述同类型任务的访存请求状态及任务间的相关性,表示某类型任务有N个运算单元需要访问外部存储器,有M个运算单元的请求要求同时服务,理论上最大支持Q个运算单元同时访问,指令读取任务、并行任务、独立任务的任务模型分别为[1,1,Q]、[N,N,Q]、[N,1,Q]。
目标系统中单个运算单元带宽为Bu,外部存储器带宽为Be,理论上支持的最大运算单元同时访问数量Q为:
Q=Be/Bu。
若运算单元直接对外部存储器进行访问,则造成的带宽浪费ΔB为:
ΔB=Be-Bu。
为充分利用外部存储器的带宽,针对目标系统多运算单元并行访存,且访存模式多样的特点,本文使用一种两级仲裁与并行访存设计相结合的机制实现多运算单元并行访问外部存储器。
并行访存控制器利用外部存储器与运算单元间的带宽差异,根据访存特点将运算单元带宽合并或是控制运算单元分时独享外部存储器带宽以实现并行访存,其结构如图3所示。并行访存控制器对访存请求进行识别,根据任务类型以及读写需求发送给对应通道或任务组,针对任务访存特点,任务组采用不同的并行访存设计,在不同的任务组间使用两级仲裁进行选择,输出最终仲裁结果,最后通过外部存储器读写控制模块,实现数据及地址与外部存储器间的交互。
图3 并行访存控制器结构
2.1.1 高优先级通道设计
为指令读取任务设计的高优先级通道,其任务模型为[1,1,Q]。通道所需带宽仅为Bu,由于任务数据量少,使用FIFO进行缓冲。
FIFO具有数据缓冲和位宽转换功能。FIFO在外部存储器侧以带宽Be接受数据,并以带宽Bu发送至系统数据端口,外部存储器工作时间仅为任务总时间的1/Q。期间外部存储器能够始终以最大带宽连续工作,并提前将数据放入FIFO中,其后外部存储器为其他任务服务,高优先级通道则使用FIFO中数据继续工作。
2.1.2 并行任务组设计
并行任务组执行并行任务,其任务模型为[N,N,Q]。此类任务中N个运算单元的访存操作同步,使用带宽合并的方法实现并行访存。
并行任务组工作所需总带宽Bp为:
Bp=NBu。
系统中每一个运算单元单周期传输的数据位宽W及工作频率f相同。带宽合并将每周期传输的N个位宽为W的数据视为一个完整的数据与外部存储器进行交互,也即将每个运算单元的带宽合并以提高任务组访存时的带宽,即
(1)
并行任务组内部使用FIFO组结构,并行任务所使用的运算单元数量N固定,因此FIFO组中共有N个FIFO,每个FIFO对应一个运算单元。FIFO组执行数据缓冲功能,使并行任务组在未获得外部存储器访问权时仍能依靠FIFO继续工作。
执行写任务与读任务的并行任务组各自工作流程如图4所示。并行任务执行时使用N个运算单元,因此并行任务组工作时,FIFO组中所有FIFO均需要工作,每个FIFO都将与一个运算单元进行数据传输,同时并行任务的访存具有同步性要求,所有运算单元的访存操作需要保持同步。因此可以通过检测FIFO组中各FIFO状态,控制访存的同步性。
图4 并行任务工作流程
2.1.3 独立任务组设计
独立任务组处理独立任务, 其任务模型为[N,1,Q]。N个运算单元的访存操作独立,使用独立任务通道进行,独立任务使用分时轮询的方法实现并行访存。
轮询机制能够保证不同任务通道获得完全公平的访问外部存储器的机会。在轮询过程中,独立任务通道使用类似于高优先级通道的FIFO结构以平衡带宽差异。若FIFO容量为C,运算单元与外部存储器带宽差异为ΔB,由于独立任务数据量一般大于FIFO容量,外部存储器以带宽Be工作的最长时间Tmax为:
Tmax=C/ΔB。
因此需要限制独立任务通道每次访问外部存储器的时长,参考时分复用的原理,对外部存储器进行分时轮询访存[7-8]。
分时轮询访存设置通道访问时间t(t≤Tmax),以避免通道长时间占用外部存储器。基于带宽差异,独立数据通道访问外部存储器时间t,可以支持其FIFO与运算单元进行时间为Qt的数据传输,除去数据通道自身访存时间t,外部存储器有(Q-1)t的时间为其他的独立数据通道服务,即
Qt=Bet/Bu
(2)
实际工作过程中,独立通道无法以理论状态进行工作,为保证通道能够获得理想的访问时间,使用基于阈值判断的方法,灵活分配通道的访问时间。该方法根据独立任务通道总数据容量,为通道分配多级阈值。独立通道在获得外部存储器访问权时,将查询通道内部FIFO实际缓冲的数据量,与各级阈值对比,分配合理的访问时间,其伪码如下:
If data-amount>threshold-1 then
//进行阈值判断
t=t1
//分配对应工作时间
else if data-amount>threshold-2 then
t=t2
⋮
else
t=0
其中的data-amount在写任务中为FIFO内数据量,在读任务中为FIFO内剩余空间。同时,对于没有访存请求的独立任务通道,不为其分配时间。
经典的仲裁方法有固定优先级仲裁、轮询仲裁、彩票仲裁等,这些方法有着各种的适用范围以及局限性。为实现更精确、更有效的仲裁,可以使用多种仲裁方法进行多级仲裁[9-11]。
目标系统中任务优先级由高到低分别为指令读取任务、并行任务、独立任务,同时读任务与写任务的访问需求是动态调整的。根据这一特点,设计了一种两级仲裁机制,其仲裁方式如下:不同通道与任务组根据读、写任务分类,第1级仲裁使用固定优先级仲裁,根据优先级对读任务与写任务分别进行仲裁,得到读任务和写任务的仲裁结果后,在第2级仲裁中根据动态权重进行加权轮询仲裁。仲裁流程如图5所示。
图5 两级仲裁流程
在第1级仲裁中,为确保高优先级任务能及时得到响应,仲裁器在检测到高优先级任务到来后,低优先级任务将暂停,任务信息与数据由对应通道或任务组保存,直到高优先级任务结束后继续执行。参考加权轮询算法中根据权重获得轮询结果的策略,第2级仲裁使用可配置访问时间的轮询仲裁方法,动态调整读、写任务访问外部存储器的时间。
固定时间T作为一次轮询的总时间,设读、写任务获得的权重分别为Rw、Rr,则权重之和为:
R=Rw+Rr。
根据权值,读、写任务各自获得访问时间Tw、Tr为:
Tw=TRw/R,
Tr=TRr/R。
根据访问时间,读、写任务将获得带宽Bw、Br为:
Bw=TwBe/T,
Br=TrBe/T。
在每次轮询开始时,读、写任务会获得各自的访问时间,对外部存储器访问规定的时间后,或是任务已经执行完毕且没有新任务需要执行后,将访问权切换至另一任务,访问完成后,更新访问时间,其工作过程伪码如下:
//写任务执行
If wr-task over & no newwr-task then
task switch
//切换至读任务
else if wr-time==Twthen
//执行访问时间
task switch
else
wr-time=wr-time+1
//执行时间计数
//读任务执行
If rd-task over & no new rd-task then
update access time
//更新访问时间
task switch
//切换至写任务
else if rd-time==Trthen
update access time
task switch
else
rd-time=rd-time+1
为验证并行访存控制器的功能,并进行性能评估,在Xilinx XCVU440 FPGA开发板上对所设计的并行访存控制器进行验证。
并行访存控制器使用DDR3 SDRAM作为外部存储器,拥有1条高优先级通道,读、写各8条独立任务通道,以及读、写各1组支持8个运算单元执行并行任务的并行任务组,整体资源消耗见表1所列。
表1 并行访存控制器资源消耗
实验使用的DDR3理论带宽为102.4 Gb/s,相当于16个运算单元同时访问所需带宽,由于DDR3中内部预充电、激活和自刷新等时间消耗,实际带宽无法达到理论值。定义带宽利用率u为并行访存控制器工作时的实际带宽Breal与外部存储器理论带宽Be的比值,即
u=(Breal/Be)×100%
(3)
计算并行访存控制器在工作过程中带宽利用率的平均值,将平均带宽利用率作为性能评估的参考。其中没有运算单元要求访存的情况不计算,平均带宽利用率越高代表端口传输速率以及任务并行度越高。
对并行访存控制器在独立工作模式和并行工作模式下分别进行满载读、写,以测试各工作模式的并行访存设计所能达到的最大带宽利用率。系统单次任务一般使用8个运算单元执行,因此满载测试使用8个运算单元执行写任务,8个运算单元执行读任务,共使用16个运算单元,读、写任务同时进行。读、写数据量相同,独立工作模式下将读、写任务数据各分为128个数据组,并行工作模式下8个运算单元共同处理单个数据组,读、写任务数据各分为16个数据组以保证每个运算单元获得数据量相同。运算单元对数据组的读、写过程连续,测试不同数据量以及工作模式下的并行访存控制器平均带宽利用率,结果见表2所列。
表2 满载状态下平均带宽利用率
由表2可知,在满载情况下平均带宽利用率最高能够达到84.738%,并行工作模式下平均带宽利用率相对较高,这是由于并行工作模式下读写过程更加连续,且没有通道切换损耗。
对实际任务执行情况进行测试,分别以运算时间小于访存时间的复数加任务以及运算时间大于访存时间的快速傅里叶变换(fast Fourier transform,FFT)运算任务作为测试对象。
测试过程中同时执行1组并行任务及1组独立任务,2组任务待处理数据量相同,独立任务数据拆分为128个数据组,并行任务数据拆分为16个数据组。2组任务各使用8个运算单元处理,运算单元每次处理1个数据组,执行读取、计算、写入过程。测试2种任务在不同数据量下的平均带宽利用率,结果见表3所列。
由表3可知,实际任务执行过程中,平均带宽利用率通常会低于满载情况,且对于FFT运算任务,平均带宽利用率更低。这是由于实际任务执行过程中并行访存控制器不会始终工作在满载状态,系统的实际带宽需求低于存储器理论带宽。运算时间较长时,访存请求分散,任务并行度降低,系统的实际带宽需求减少,进一步降低了平均带宽利用率。
表3 执行实际任务时平均带宽利用率
选择表3中并行工作模式数据组容量为8 192,独立工作模式数据组容量为1 024的任务,对实际任务执行过程中各阶段的平均带宽利用率变化进行分析。将任务执行过程分为10个阶段,按照任务执行总时间平均划分,任务每执行其总时间的1/10,计为一个阶段,计算其在不同阶段内的平均带宽利用率,如图6所示。
图6 不同阶段的平均带宽利用率
任务执行过程中,任务的平均带宽利用率变化曲线不断变化,FFT运算任务由于访存请求分散,平均带宽利用率始终低于运算时间较小的复数加任务。各阶段平均带宽利用率的变化主要是由于任务执行状态的不同。并行任务组与独立任务组同时进行访存,例如,并行任务组执行读任务时,独立任务组同时执行写任务的情况下,任务并行度较高,此类情况较多的阶段,平均带宽利用率较高,反之,平均带宽利用率较低。此外,若有任务组在执行读任务时,存在之前缓存在任务组中的数据需要写入外部存储器,此时数据的写入过程不会计入任务并行度,但是将导致读任务的任务并行度降低,这种情况较多的阶段,平均带宽利用率也会有所降低。
本文设计了一种用于多核SoC中多运算单元并行访问外部存储器的接口结构。针对目标SoC系统的工作特点设计了多种并行访问机制以实现利用带宽差异进行并行访存,使用两级仲裁弥补单一仲裁方法的局限性,对不同任务进行仲裁。经测试,该并行访存控制器能够有效利用外部存储器带宽,在满载情况下平均带宽利用率最高能够达到84.738%,实际任务执行过程中平均带宽利用率最高能够达到54.653%。