一种基于龙芯3b的自适应矩阵乘法优化方法

文档序号:6513144阅读:405来源:国知局
一种基于龙芯3b的自适应矩阵乘法优化方法
【专利摘要】本发明公开了一种基于龙芯3B的自适应矩阵乘法优化方法,先将龙芯3B的乘法矩阵和被乘矩阵按分块大小不大于二级缓存的原则划分成为两个子矩阵,利用龙芯3B芯片上的直接高速缓冲存储器存取器预取列长为M宽为K的乘法矩阵到高速缓冲区,同时将列长为K宽为N的被乘矩阵复制于二级高速缓冲区,用直接寄存器存取器从二级高速缓冲区中预取列长为l,宽为h的乘法矩阵以及长为h宽为g的被乘矩阵到寄存器,利用乘加指令完成乘加运算,通过访存状态收集模块获得信息并对分块参数M、K、N、l、h、g进行自适应调整,获得新的分块参数,从而实现龙芯3B平台上矩阵乘法运算的高效自适应优化。
【专利说明】一种基于龙芯3B的自适应矩阵乘法优化方法
【技术领域】
[0001]本发明属于电数字数据处理【技术领域】,具体涉及基于龙芯3B的线性系统软件包优化方法。
【背景技术】
[0002]龙芯3B是中国第一个具有完全自主知识产权的八核中央处理器(CPU)。在高性能计算领域,龙芯3B需要基础线性代数子程序库的支持。根据官方发布的龙芯3B处理用户手册说明,现有龙芯3B处理器在龙芯3A处理器的基础上增加了高速缓冲存储器(cache )锁窗口、直接寄存器存取器(DRA)、直接高速缓冲存储器存取器(DCA)等功能。每个中央处理器(CPU)核均采用4发射超标量结构,包含两个256位的向量部件,128x256比特的浮点寄存器堆,可以存放512个双精度浮点数,CPU的工作频率为1GHz,浮点理论性能为128Gflops。由于龙芯3B系列处理是由中科院计算所自主研发的国产处理器,其体系结构与其他处理器有较大差别,目前已有的通用基础线性代数子程序库在龙芯3B系统上的运行性能普遍不高。作为基础线性代数子程序库的矩阵乘法运算需经过相应优化才能发挥龙芯3B实际的计算性能。目前已有的基于龙芯3B硬件体系的矩阵乘法运算优化方法普遍存在编程麻烦,调试困难的问题。
【发明内容】

[0003]本发明是为避免上述现有技术所存在的不足之处,提供一种基于龙芯3B的自适应矩阵乘法优化方法,通过调整分块参数M、K、N、1、h、g的数值以达到在龙芯3B平台上矩阵乘法运算优化的高效自适应实现。
[0004]本发明为解决以上技术问题采用如下方案:
[0005]本发明一种基于龙芯3B的自适应矩阵乘法优化方法的特点是:所述优化方法按如下步骤进行:
[0006]步骤1、对乘法矩阵和被乘矩阵进行一次分块
[0007]以龙芯3B上的乘法矩阵的起始地址为基准划分为列长为M宽为K的单元乘法矩阵,以所述龙芯3B上的被乘矩阵的起始地址为基准划分为列长为K宽为N的单元被乘矩阵,所述单元乘法矩阵和单元被乘矩阵的大小不超过二级高速缓冲存储器L2-cache的大小;
[0008]步骤2、预取分块后的乘法矩阵和被乘矩阵至二级高速缓冲存储器L2-cache
[0009]2-1、通过nmap函数映射获得所述龙芯3B上的直接高速缓冲存储器存取器DCA的控制寄存器的读写虚地址;
[0010]2-2、将直接高速缓冲存储器存取器DCA的控制寄存器的源矩阵行元素个数域赋值为所述单元乘法矩阵的列长M,
[0011]2-3、将直接高速缓冲存储器存取器DCA的控制寄存器的源矩阵列元素个数域赋值为所述单元乘法矩阵的行宽K ;
[0012]2-4、将直接高速缓冲存储器存取器DCA的控制寄存器的源矩阵起始地址域赋值为所述单元乘法矩阵所在内存空间的起始地址;[0013]2-5、将所述单元被乘矩阵的数据复制到二级高速缓冲存储器L2-cache中;
[0014]步骤3、对分块后的乘法矩阵和被乘矩阵进行二次分块
[0015]将所述二级高速缓冲存储器L2-cache中的单元乘法矩阵划分为列长为I宽为h的次单元乘法矩阵,将所述二级高速缓冲存储器L2-cache中的单元被乘矩阵划分为列长为h宽为g的次单元被乘矩阵;
[0016]步骤4、预取二次分块后的乘法矩阵和被乘矩阵至寄存器堆中
[0017]通过nmap函数映射获得所述龙芯3B上的直接寄存器存取器DRA的控制寄存器的读与基地址;
[0018]步骤A、二次分块后的乘法矩阵的预取
[0019]Al、将直接寄存器存取器DRA的Cr2寄存器的行宽域赋值为所述次单元乘法矩阵的行宽h ;
[0020]A2、将直接寄存器存取器DRA的Cr2寄存器的次数域赋值为所述次单元乘法矩阵的列长I ;
[0021]A3、将直接寄存器存取器DRA的Cr3寄存器的寄存器堆起始域赋值为存放次单元乘法矩阵的寄存器堆的起始地址;
[0022]A4、将直接寄存器存取器DRA的RO寄存器的源矩阵起始地址域赋值为次单元乘法矩阵所在内存空间的起始地址;
[0023]步骤B、二次分块后的被乘矩阵的预取
[0024]B1、将直接寄存器存取器DRA的Cr4寄存器的行宽域赋值为所述次单元被乘矩阵的行宽g ;
[0025]B2、将直接寄存器存取器DRA的Cr4寄存器的次数域赋值为所述次单元被乘矩阵的列长h ;
[0026]B3、将直接寄存器存取器DRA的Cr5寄存器的寄存器堆起始域赋值为存放次单元被乘矩阵的寄存器堆的起始地址;
[0027]B4、将直接寄存器存取器DRA的Rl寄存器的源矩阵起始地址域赋值为次单元被乘矩阵所在内存空间的起始地址;
[0028]步骤5、对所述寄存器堆中的次单元乘法矩阵和次单元被乘矩阵进行乘加运算
[0029]Cl、CPU等待直接寄存器存取器DRA发送的取数中断命令;
[0030]C2、CPU根据所获得的取数中断命令从寄存器堆中取出次单元乘法矩阵的n列和次单元被乘矩阵的n行;
[0031]C2、CPU利用乘加向量指令对所述的n列次单元乘法矩阵和n行次单元被乘矩阵进行乘加运算;
[0032]C3、CPU设置直接寄存器存取器DRA的控制寄存器的Crl6到Cr23的值为0 ;
[0033]C5、重复步骤Cl至C3,直到所述次单元乘法矩阵和次单元被乘矩阵中的数据都完成乘加运算;
[0034]步骤6、将所述乘加运算的结果存储至内存上的结果矩阵
[0035]D1、将直接寄存器存取器DRA的Crl2寄存器的行宽域赋值为结果矩阵行宽的行宽g ;
[0036]D2、将直接寄存器存取器DRA的Crl2寄存器的次数域赋值为结果矩阵的列长I ;[0037]D3、将直接寄存器存取器DRA的Crl3寄存器的寄存器堆起始域赋值为存放所述乘加运算的结果所在的寄存器堆的起始地址;
[0038]D4、将直接寄存器存取器DRA的R*寄存器的源矩阵起始地址域赋值为所述结果矩阵所在内存空间的起始地址;
[0039]步骤7、构建访存状态收集模块
[0040]所述访存状态收集模块是利用结构体Dstruct来构建的;所述结构体Dstruct包含:当前访存状态收集模块所统计的事件的名称、所述事件对应的访存协处理器的名称、CPU等待访存协处理器就绪状态的周期、CPU查询访存协处理器工作状态的次数、CPU等待访存协处理器就绪状态的周期的阈值;
[0041]步骤8、利用访存状态收集模块统计访存协处理器的预取状态;
[0042]E1、记录所述当前访存状态收集模块所统计的事件名称和所述事件对应存协处理器的名称、设定CPU等待访存协处理器到达空闲状态的周期的阈值;
[0043]E2、利用CPU查询对应访存协处理器的工作状态寄存器;
[0044]E3、记录CPU查询访存协处理器工作状态的次数;
[0045]E4、判断所述CPU查询访存协处理器工作状态的次数是否达到所述CPU等待访存协处理器就绪状态的周期的阈值;
[0046]E5、若所述CPU查询访存协处理器工作状态的次数达到所述CPU等待访存协处理器就绪状态的周期的阈值,则所述CPU等待访存协处理器就绪状态的周期加I ;
[0047]E6、重复步骤C2至C5直至对应访存协处理器的工作状态为空闲;
[0048]步骤9、更新所述乘法矩阵和被乘矩阵的一次分块和二次分块的参数
[0049]CPU获得不同事件所对应的结构体Dstruct内容;并查询所述不同事件所对应的结构体Dstruct内容中的当前访存状态收集模块所统计的事件的名称;
[0050]F1、当事件为直接寄存器存取器DRA预取次单元被乘矩阵或直接寄存器存取器DRA预取次单元乘法矩阵时;
[0051]Fl.1、查询直接寄存器存取器DRA预取次单元被乘矩阵事件或直接寄存器存取器DRA预取次单元乘法矩阵事件所对应的CPU等待访存协处理器就绪状态的周期;
[0052]Fl.2、当直接寄存器存取器DRA预取次单元被乘矩阵事件或直接寄存器存取器DRA预取次单元乘法矩阵事件所对应的CPU等待访存协处理器就绪状态的周期不为零,则同步增加二次分块参数I与二次分块参数g的数值直至达到二次分块约束上限;
[0053]所述二次分块约束上限是指二次分块参数I和二次分块参数g满足式(I)
[0054]IXg < 256 (I)
[0055]F2、当事件为直接寄存器存取器DRA写回单元结果矩阵时;
[0056]F2.1、查询直接寄存器存取器DRA写回单元结果矩阵事件所对应的CPU等待访存协处理器就绪状态的周期;
[0057]F2.2、当直接寄存器存取器DRA写回单元结果矩阵事件所对应的CPU等待访存协处理器就绪状态的周期不为零,则增加二次分块的分块参数h的数值直到达到对二次分块约束上限;
[0058]所述二次分块约束上限是指二次分块参数1、二次分块参数h和二次分块参数g满足式[0059](2):
[0060]4X (lXh+hXg)+2(lXg) < 512 (2)
[0061]F3、当事件为直接高速缓冲存储器存取器DCA预取单元乘法矩阵时;
[0062]F3.1、查询直接高速缓冲存储器存取器DCA预取单元乘法矩阵事件所对应的CPU等待访存协处理器就绪状态的周期;
[0063]F3.2、当直接高速缓冲存储器存取器DCA预取单元乘法矩阵事件所对应的CPU等待访存协处理器就绪状态的周期不为零,则增加一次分块参数N和一次分块参数K的数值直到达到一次分块约束上限;
[0064]所述一次分块约束上限是指M为I的倍数,KSh的倍数,N为g的倍数且满足式
(3);
[0065]8X (2MXK+KXN) ^ 1.5X1024X1024 (3)
[0066]步骤10、根据更新前的一次分块参数M、一次分块参数N、一次分块参数K,通过地址偏移计算获得新的乘法矩阵和被乘矩阵的起始地址;
[0067]步骤11、重复步骤2至步骤10直至新的乘法矩阵和被乘矩阵的起始地址超过乘法矩阵和被乘矩阵的所处的地址空间范围。
[0068]本发明基于龙芯3B的自适应矩阵乘法优化方法利用龙芯3B的直接高速缓冲存储器存取器控制寄存器和直接寄存器存取器对源矩阵进行二次预取,并利用访存状态收集模块对直接高速缓冲存储器存取器控制寄存器和直接寄存器存取器的工作状态进行分析,当直接高速缓冲存储器存取器控制寄存器和直接寄存器存取器的访存性能无法满足计算需求时,通过调整分块参数M、K、N、1、h、g的数值实现将访存掩盖于计算的目的。
[0069]与已有技术相比,本发明有益效果体现在:
[0070]本发明提出的基于龙芯3B的自适应矩阵乘法优化方法,可以根据访存协处理器在程序运行过程中的工作状态自动更新分块参数,针对不同配置下的龙芯3B平台加速矩阵乘法的优化速度,优化后的矩阵乘法平均效率占龙芯3B理论计算峰值的85%以上。
【具体实施方式】
[0071]本发明基于龙芯3B的自适应矩阵乘法优化方法,是先将龙芯3B的两个源矩阵(SP乘法矩阵和被乘矩阵)按分块大小分别不大于二级缓存的原则划分成为两个子矩阵(即单元乘法矩阵和单元被乘矩阵),利用龙芯3B芯片上的直接高速缓冲存储器存取器DCA预取列长为M宽为K的乘法矩阵到高速缓冲区,通过添加代码的方式在直接高速缓冲存储器存取器DCA控制代码中加入访存状态收集模块,同时将列长为K宽为N的被乘矩阵复制于二级高速缓冲区,用直接寄存器存取器DRA从二级高速缓冲区中预取列长为1,宽为h的乘法矩阵以及长为h宽为g的被乘矩阵到寄存器,在直接寄存器存取器DRA的控制代码中加入访存状态收集模块,利用向量部件完成乘加运算,在矩阵乘法计算过程中通过访存状态收集模块获得的信息对分块参数M、K、N、l、h、g进行自适应调整和更新,获得目标平台下的新的分块参数。
[0072]具体过程如下:
[0073]步骤1、对乘法矩阵和被乘矩阵进行一次分块
[0074]以龙芯3B上的乘法矩阵的起始地址为基准划分为列长为M宽为K的单元乘法矩阵,以龙芯3B上的被乘矩阵的起始地址为基准划分为列长为K宽为N的单元被乘矩阵,单元乘法矩阵和单元被乘矩阵的大小将会在矩阵乘法程序运行的时候做自适应的调整,所以M,N,K的值只需设定在一个初始范围内即可,本实例中将M的值初始化为128,K的值初始化为200,N的值初始化为24 ;
[0075]步骤2、预取分块后的乘法矩阵和被乘矩阵至二级高速缓冲存储器L2-cache
[0076]2-1、通过nmap函数映射获得龙芯3B上的直接高速缓冲存储器存取器DCA的控制寄存器的读写虚地址,在本实例中通过nmap函数映射0X3fT00600地址,得到直接高速缓冲存储器存取器DCA的控制寄存器的读写虚地址;
[0077]2-2、将直接高速缓冲存储器存取器DCA的控制寄存器的源矩阵行元素个数域赋值为单元乘法矩阵的列长M,
[0078]2-3、将直接高速缓冲存储器存取器DCA的控制寄存器的源矩阵列元素个数域赋值为单元乘法矩阵的行宽K ;
[0079]2-4、将直接高速缓冲存储器存取器DCA的控制寄存器的源矩阵起始地址域赋值为单元乘法矩阵所在内存空间的起始地址;以实现直接高速缓冲存储器存取器DCA预取单元乘法矩阵到二级高速缓冲存储器L2-cache的功能;
[0080]2-5、将单元被乘矩阵的数据复制到二级高速缓冲存储器L2-cache中;以实现CPU对单元被乘矩阵的预取功能;
[0081]步骤3、对分块后的乘法矩阵和被乘矩阵进行二次分块
[0082]将二级高速缓冲存储器L2-cache中的单元乘法矩阵划分为列长为I宽为h的次单元乘法矩阵,将二级高速缓冲存储器L2-cache中的单元被乘矩阵划分为列长为h宽为g的次单元被乘矩阵;由于这是对步骤I中所划分的矩阵的二次划分,这一划分过程中的1,h,g数值分别应该小于M,N,K当前的数值;并且,在自适应调整的过程中I,h,g通过增加自身的数值来进行调节;所以在本实例中将1,h,g均设定为较小值12。
[0083]步骤4、预取二次分块后的乘法矩阵和被乘矩阵至寄存器堆中
[0084]通过nmap函数映射获得龙芯3B上的直接寄存器存取器DRA的控制寄存器的读写基地址;在本实例中通过nmap函数映射OxlfaOOOOO地址获得龙芯3B上的直接寄存器存取器DRA的控制寄存器的读写基地址,并通过增加地址偏移值得到龙芯3B上的直接寄存器存取器DRA的Cr2、Cr3、Cr4、Cr5寄存器的配置地址;
[0085]步骤A、二次分块后的乘法矩阵的预取
[0086]Al、将直接寄存器存取器DRA的Cr2寄存器的行宽域赋值为次单元乘法矩阵的行宽h ;
[0087]A2、将直接寄存器存取器DRA的Cr2寄存器的次数域赋值为次单元乘法矩阵的列长I ;
[0088]A3、将直接寄存器存取器DRA的Cr3寄存器的寄存器堆起始域赋值为存放次单元乘法矩阵的寄存器堆的起始地址;
[0089]A4、将直接寄存器存取器DRA的RO寄存器的源矩阵起始地址域赋值为次单元乘法矩阵所在内存空间的起始地址;以实现直接寄存器存取器DRA的预取次单元乘法矩阵到寄存器堆的功能;
[0090]步骤B、二次分块后的被乘矩阵的预取[0091]B1、将直接寄存器存取器DRA的Cr4寄存器的行宽域赋值为次单元被乘矩阵的行宽g ;
[0092]B2、将直接寄存器存取器DRA的Cr4寄存器的次数域赋值为次单元被乘矩阵的列长h ;
[0093]B3、将直接寄存器存取器DRA的Cr5寄存器的寄存器堆起始域赋值为存放次单元被乘矩阵的寄存器堆的起始地址;
[0094]B4、将直接寄存器存取器DRA的Rl寄存器的源矩阵起始地址域赋值为次单元被乘矩阵所在内存空间的起始地址;以实现直接寄存器存取器DRA的预取次单元被乘矩阵到寄存器堆的功能;
[0095]步骤5、对寄存器堆中的次单元乘法矩阵和次单元被乘矩阵进行乘加运算
[0096]Cl、CPU等待直接寄存器存取器DRA发送的取数中断命令;
[0097]C2、CPU根据所获得的取数中断命令从寄存器堆中取出次单元乘法矩阵的n列和次单元被乘矩阵的n行,n的值必须小于等于当前h的值,在本实例中将n初始化为2 ;
[0098]C3、CPU利用乘加向量指令对的n列次单元乘法矩阵和n行次单元被乘矩阵进行乘加运算;
[0099]以上Cl至C3过程的其实际操作代码为:
[0100]bc2f (0, Oxffff) //
[0101]nop
[0102].align3
[0103]VBCMULADDPD C1_00, B0_0, A0_0, 0
[0104]VBCMULADDPD Cl_01, B0_0, A0_1, 0
[0105]VBCMULADDPD Cl_02, B0_0, A0_2, 0
[0106]C3、CPU设置直接寄存器存取器DRA的控制寄存器的Crl6到Cr23的值为0 ;该行为即CPU清空取数中断命令
[0107]C5、重复步骤Cl至C3,直到次单元乘法矩阵和次单元被乘矩阵中的数据都完成乘加运算;
[0108]步骤6、将乘加运算的结果存储至内存上的结果矩阵
[0109]D1、将直接寄存器存取器DRA的Crl2寄存器的行宽域赋值为结果矩阵行宽的行宽g ;
[0110]D2、将直接寄存器存取器DRA的Crl2寄存器的次数域赋值为结果矩阵的列长I ;
[0111]D3、将直接寄存器存取器DRA的Crl3寄存器的寄存器堆起始域赋值为存放乘加运算的结果所在的寄存器堆的起始地址;
[0112]D4、将直接寄存器存取器DRA的R*寄存器的源矩阵起始地址域赋值为结果矩阵所在内存空间的起始地址;以实现直接寄存器存取器DRA将寄存器堆的计算结果写回结果矩阵的功能;
[0113]步骤7、构建访存状态收集模块
[0114]访存状态收集模块是利用结构体Dstruct来构建的;结构体Dstruct包含:当前访存状态收集模块所统计的事件的名称、该事件是指直接高速缓冲存储器存取器DCA预取单元乘法矩阵、直接寄存器存取器DRA预取次单元被乘矩阵、直接寄存器存取器DRA预取次单元乘法矩阵、直接寄存器存取器DRA写回单元结果矩阵这四个事件,事件对应的访存协处理器的名称、CPU等待访存协处理器就绪状态的周期、CPU查询访存协处理器工作状态的次数、CPU等待访存协处理器就绪状态的周期的阈值;访存协处理器是指直接高速缓冲存储器存取器DCA和直接寄存器存取器DRA的统称
[0115]结构体Dstruct可用伪代码描述如下:
[0116]
【权利要求】
1.一种基于龙芯3B的自适应矩阵乘法优化方法,其特征在于,所述优化方法按如下步骤进行: 步骤1、对乘法矩阵和被乘矩阵进行一次分块 以龙芯3B上的乘法矩阵的起始地址为基准划分为列长为M宽为K的单元乘法矩阵,以所述龙芯3B上的被乘矩阵的起始地址为基准划分为列长为K宽为N的单元被乘矩阵,所述单元乘法矩阵和单元被乘矩阵的大小不超过二级高速缓冲存储器L2-cache的大小; 步骤2、预取分块后的乘法矩阵和被乘矩阵至二级高速缓冲存储器L2-cache2-1、通过nmap函数映射获得所述龙芯3B上的直接高速缓冲存储器存取器DCA的控制寄存器的读写虚地址; 2-2、将直接高速缓冲存储器存取器DCA的控制寄存器的源矩阵行元素个数域赋值为所述单元乘法矩阵的列长M, 2-3、将直接高速缓冲存储器存取器DCA的控制寄存器的源矩阵列元素个数域赋值为所述单元乘法矩阵的行宽K ; 2-4、将直接高速缓冲存储器存取器DCA的控制寄存器的源矩阵起始地址域赋值为所述单元乘法矩阵所在内存空间的起始地址; 2-5、将所述单元被 乘矩阵的数据复制到二级高速缓冲存储器L2-cache中; 步骤3、对分块后的乘法矩阵和被乘矩阵进行二次分块 将所述二级高速缓冲存储器L2-cache中的单元乘法矩阵划分为列长为I宽为h的次单元乘法矩阵,将所述二级高速缓冲存储器L2-cache中的单元被乘矩阵划分为列长为h宽为g的次单元被乘矩阵; 步骤4、预取二次分块后的乘法矩阵和被乘矩阵至寄存器堆中 通过nmap函数映射获得所述龙芯3B上的直接寄存器存取器DRA的控制寄存器的读写基地址; 步骤A、二次分块后的乘法矩阵的预取 Al、将直接寄存器存取器DRA的Cr2寄存器的行宽域赋值为所述次单元乘法矩阵的行宽h ; A2、将直接寄存器存取器DRA的Cr2寄存器的次数域赋值为所述次单元乘法矩阵的列长I ; A3、将直接寄存器存取器DRA的Cr3寄存器的寄存器堆起始域赋值为存放次单元乘法矩阵的寄存器堆的起始地址; A4、将直接寄存器存取器DRA的RO寄存器的源矩阵起始地址域赋值为次单元乘法矩阵所在内存空间的起始地址; 步骤B、二次分块后的被乘矩阵的预取 B1、将直接寄存器存取器DRA的Cr4寄存器的行宽域赋值为所述次单元被乘矩阵的行宽g ; B2、将直接寄存器存取器DRA的Cr4寄存器的次数域赋值为所述次单元被乘矩阵的列长h ; B3、将直接寄存器存取器DRA的Cr5寄存器的寄存器堆起始域赋值为存放次单元被乘矩阵的寄存器堆的起始地址;B4、将直接寄存器存取器DRA的Rl寄存器的源矩阵起始地址域赋值为次单元被乘矩阵所在内存空间的起始地址; 步骤5、对所述寄存器堆中的次单元乘法矩阵和次单元被乘矩阵进行乘加运算 Cl、CPU等待直接寄存器存取器DRA发送的取数中断命令; C2、 CPU根据所获得的取数中断命令从寄存器堆中取出次单元乘法矩阵的n列和次单元被乘矩阵的n行; C2、CPU利用乘加向量指令对所述的n列次单元乘法矩阵和n行次单元被乘矩阵进行乘加运算; C3、CPU设置直接寄存器存取器DRA的控制寄存器的Crl6到Cr23的值为O ; C5、重复步骤Cl至C3,直到所述次单元乘法矩阵和次单元被乘矩阵中的数据都完成乘加运算; 步骤6、将所述乘加运算的结果存储至内存上的结果矩阵 D1、将直接寄存器存取器DRA的Crl2寄存器的行宽域赋值为结果矩阵行宽的行宽g ; D2、将直接寄存器存取器DRA的Crl2寄存器的次数域赋值为结果矩阵的列长I ; D3、将直接寄存器存取器DRA的Crl3寄存器的寄存器堆起始域赋值为存放所述乘加运算的结果所在的寄存器堆的起始地址; D4、将直接寄存器存取器DRA的R*寄存器的源矩阵起始地址域赋值为所述结果矩阵所在内存空间的起始地址; 步骤7、构建访存状态收集模块 所述访存状态收集模块是利用结构体Dstruct来构建的;所述结构体Dstruct包含:当前访存状态收集模块所统计的事件的名称、所述事件对应的访存协处理器的名称、CPU等待访存协处理器就绪状态的周期、CPU查询访存协处理器工作状态的次数、CPU等待访存协处理器就绪状态的周期的阈值; 步骤8、利用访存状态收集模块统计访存协处理器的预取状态; E1、记录所述当前访存状态收集模块所统计的事件名称和所述事件对应存协处理器的名称、设定CPU等待访存协处理器到达空闲状态的周期的阈值; E2、利用CPU查询对应访存协处理器的工作状态寄存器; E3、记录CPU查询访存协处理器工作状态的次数; E4、判断所述CPU查询访存协处理器工作状态的次数是否达到所述CPU等待访存协处理器就绪状态的周期的阈值; E5、若所述CPU查询访存协处理器工作状态的次数达到所述CPU等待访存协处理器就绪状态的周期的阈值,则所述CPU等待访存协处理器就绪状态的周期加I ; E6、重复步骤C2至C5直至对应访存协处理器的工作状态为空闲; 步骤9、更新所述乘法矩阵和被乘矩阵的一次分块和二次分块的参数CPU获得不同事件所对应的结构体Dstruct内容;并查询所述不同事件所对应的结构体Dstruct内容中的当前访存状态收集模块所统计的事件的名称; Fl、当事件为直接寄存器存取器DRA预取次单元被乘矩阵或直接寄存器存取器DRA预取次单元乘法矩阵时; Fl.1、查询直接寄存器存取器DRA预取次单元被乘矩阵事件或直接寄存器存取器DRA预取次单元乘法矩阵事件所对应的CPU等待访存协处理器就绪状态的周期; Fl.2、当直接寄存器存取器DRA预取次单元被乘矩阵事件或直接寄存器存取器DRA预取次单元乘法矩阵事件所对应的CPU等待访存协处理器就绪状态的周期不为零,则同步增加二次分块参数I与二次分块参数g的数值直至达到二次分块约束上限; 所述二次分块约束上限是指二次分块参数I和二次分块参数g满足式(I) IXg < 256 (I) F2、当事件为直接寄存器存取器DRA写回单元结果矩阵时; F2.1、查询直接寄存器存取器DRA写回单元结果矩阵事件所对应的CPU等待访存协处理器就绪状态的周期; F2.2、当直接寄存器存取器DRA写回单元结果矩阵事件所对应的CPU等待访存协处理器就绪状态的周期不为零,则增加二次分块的分块参数h的数值直到达到对二次分块约束上限; 所述二次分块约束上限是指二次分块参数1、二次分块参数h和二次分块参数g满足式
(2): 4X (lXh+hXg)+2(lXg) <512 (2) F3、当事件为直接高速缓冲存储器存取器DCA预取单元乘法矩阵时; F3.1、查询直接高速缓冲存储器存取器DCA预取单元乘法矩阵事件所对应的CPU等待访存协处理器就绪状态的周期; F3.2、当直接高速缓冲存储器存取器DCA预取单元乘法矩阵事件所对应的CPU等待访存协处理器就绪状态的周期不为零,则增加一次分块参数N和一次分块参数K的数值直到达到一次分块约束上限; 所述一次分块约束上限是指M为I的倍数,K为h的倍数,N为g的倍数且满足式(3); 8X (2MXK+KXN)≤ 1.5X1024X1024 (3) 步骤10、根据更新前的一次分块参数M、一次分块参数N、一次分块参数K,通过地址偏移计算获得新的乘法矩阵和被乘矩阵的起始地址; 步骤11、重复步骤2至步骤10直至新的乘法矩阵和被乘矩阵的起始地址超过乘法矩阵和被乘矩阵的所处的地址空间范围。
【文档编号】G06F17/16GK103530276SQ201310442878
【公开日】2014年1月22日 申请日期:2013年9月25日 优先权日:2013年9月25日
【发明者】顾乃杰, 赵增, 张孝慈, 张明 申请人:中国科学技术大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1