CN103530276B - 一种基于龙芯3b的自适应矩阵乘法优化方法 - Google Patents
一种基于龙芯3b的自适应矩阵乘法优化方法 Download PDFInfo
- Publication number
- CN103530276B CN103530276B CN201310442878.6A CN201310442878A CN103530276B CN 103530276 B CN103530276 B CN 103530276B CN 201310442878 A CN201310442878 A CN 201310442878A CN 103530276 B CN103530276 B CN 103530276B
- Authority
- CN
- China
- Prior art keywords
- matrix
- memory access
- dra
- piecemeal
- multiplication
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Landscapes
- Memory System Of A Hierarchy Structure (AREA)
Abstract
本发明公开了一种基于龙芯3B的自适应矩阵乘法优化方法,先将龙芯3B的乘法矩阵和被乘矩阵按分块大小不大于二级缓存的原则划分成为两个子矩阵,利用龙芯3B芯片上的直接高速缓冲存储器存取器预取列长为M宽为K的乘法矩阵到高速缓冲区,同时将列长为K宽为N的被乘矩阵复制于二级高速缓冲区,用直接寄存器存取器从二级高速缓冲区中预取列长为l,宽为h的乘法矩阵以及长为h宽为g的被乘矩阵到寄存器,利用乘加指令完成乘加运算,通过访存状态收集模块获得信息并对分块参数M、K、N、l、h、g进行自适应调整,获得新的分块参数,从而实现龙芯3B平台上矩阵乘法运算的高效自适应优化。
Description
技术领域
本发明属于电数字数据处理技术领域,具体涉及基于龙芯3B的线性系统软件包优化方法。
背景技术
龙芯3B是中国第一个具有完全自主知识产权的八核中央处理器(CPU)。在高性能计算领域,龙芯3B需要基础线性代数子程序库的支持。根据官方发布的龙芯3B处理用户手册说明,现有龙芯3B处理器在龙芯3A处理器的基础上增加了高速缓冲存储器(cache)锁窗口、直接寄存器存取器(DRA)、直接高速缓冲存储器存取器(DCA)等功能。每个中央处理器(CPU)核均采用4发射超标量结构,包含两个256位的向量部件,128x256比特的浮点寄存器堆,可以存放512个双精度浮点数,CPU的工作频率为1GHz,浮点理论性能为128Gflops。由于龙芯3B系列处理是由中科院计算所自主研发的国产处理器,其体系结构与其他处理器有较大差别,目前已有的通用基础线性代数子程序库在龙芯3B系统上的运行性能普遍不高。作为基础线性代数子程序库的矩阵乘法运算需经过相应优化才能发挥龙芯3B实际的计算性能。目前已有的基于龙芯3B硬件体系的矩阵乘法运算优化方法普遍存在编程麻烦,调试困难的问题。
发明内容
本发明是为避免上述现有技术所存在的不足之处,提供一种基于龙芯3B的自适应矩阵乘法优化方法,通过调整分块参数M、K、N、l、h、g的数值以达到在龙芯3B平台上矩阵乘法运算优化的高效自适应实现。
本发明为解决以上技术问题采用如下方案:
本发明一种基于龙芯3B的自适应矩阵乘法优化方法的特点是:所述优化方法按如下步骤进行:
步骤1、对乘法矩阵和被乘矩阵进行一次分块
以龙芯3B上的乘法矩阵的起始地址为基准划分为列长为M宽为K的单元乘法矩阵,以所述龙芯3B上的被乘矩阵的起始地址为基准划分为列长为K宽为N的单元被乘矩阵,所述单元乘法矩阵和单元被乘矩阵的大小不超过二级高速缓冲存储器L2-cache的大小;
步骤2、预取分块后的乘法矩阵和被乘矩阵至二级高速缓冲存储器L2-cache
2-1、通过nmap函数映射获得所述龙芯3B上的直接高速缓冲存储器存取器DCA的控制寄存器的读写虚地址;
2-2、将直接高速缓冲存储器存取器DCA的控制寄存器的源矩阵行元素个数域赋值为所述单元乘法矩阵的列长M,
2-3、将直接高速缓冲存储器存取器DCA的控制寄存器的源矩阵列元素个数域赋值为所述单元乘法矩阵的行宽K;
2-4、将直接高速缓冲存储器存取器DCA的控制寄存器的源矩阵起始地址域赋值为所述单元乘法矩阵所在内存空间的起始地址;
2-5、将所述单元被乘矩阵的数据复制到二级高速缓冲存储器L2-cache中;
步骤3、对分块后的乘法矩阵和被乘矩阵进行二次分块
将所述二级高速缓冲存储器L2-cache中的单元乘法矩阵划分为列长为l宽为h的次单元乘法矩阵,将所述二级高速缓冲存储器L2-cache中的单元被乘矩阵划分为列长为h宽为g的次单元被乘矩阵;
步骤4、预取二次分块后的乘法矩阵和被乘矩阵至寄存器堆中
通过nmap函数映射获得所述龙芯3B上的直接寄存器存取器DRA的控制寄存器的读写基地址;
步骤A、二次分块后的乘法矩阵的预取
A1、将直接寄存器存取器DRA的Cr2寄存器的行宽域赋值为所述次单元乘法矩阵的行宽h;
A2、将直接寄存器存取器DRA的Cr2寄存器的次数域赋值为所述次单元乘法矩阵的列长l;
A3、将直接寄存器存取器DRA的Cr3寄存器的寄存器堆起始域赋值为存放次单元乘法矩阵的寄存器堆的起始地址;
A4、将直接寄存器存取器DRA的R0寄存器的源矩阵起始地址域赋值为次单元乘法矩阵所在内存空间的起始地址;
步骤B、二次分块后的被乘矩阵的预取
B1、将直接寄存器存取器DRA的Cr4寄存器的行宽域赋值为所述次单元被乘矩阵的行宽g;
B2、将直接寄存器存取器DRA的Cr4寄存器的次数域赋值为所述次单元被乘矩阵的列长h;
B3、将直接寄存器存取器DRA的Cr5寄存器的寄存器堆起始域赋值为存放次单元被乘矩阵的寄存器堆的起始地址;
B4、将直接寄存器存取器DRA的R1寄存器的源矩阵起始地址域赋值为次单元被乘矩阵所在内存空间的起始地址;
步骤5、对所述寄存器堆中的次单元乘法矩阵和次单元被乘矩阵进行乘加运算
C1、CPU等待直接寄存器存取器DRA发送的取数中断命令;
C2、CPU根据所获得的取数中断命令从寄存器堆中取出次单元乘法矩阵的n列和次单元被乘矩阵的n行;
C2、CPU利用乘加向量指令对所述的n列次单元乘法矩阵和n行次单元被乘矩阵进行乘加运算;
C3、CPU设置直接寄存器存取器DRA的控制寄存器的Cr16到Cr23的值为0;
C4、重复步骤C1至C3,直到所述次单元乘法矩阵和次单元被乘矩阵中的数据都完成乘加运算;
步骤6、将所述乘加运算的结果存储至内存上的结果矩阵
D1、将直接寄存器存取器DRA的Cr12寄存器的行宽域赋值为结果矩阵行宽的行宽g;
D2、将直接寄存器存取器DRA的Cr12寄存器的次数域赋值为结果矩阵的列长l;
D3、将直接寄存器存取器DRA的Cr13寄存器的寄存器堆起始域赋值为存放所述乘加运算的结果所在的寄存器堆的起始地址;
D4、将直接寄存器存取器DRA的R*寄存器的源矩阵起始地址域赋值为所述结果矩阵所在内存空间的起始地址;
步骤7、构建访存状态收集模块
所述访存状态收集模块是利用结构体Dstruct来构建的;所述结构体Dstruct包含:当前访存状态收集模块所统计的事件的名称、所述事件对应的访存协处理器的名称、CPU等待访存协处理器就绪状态的周期、CPU查询访存协处理器工作状态的次数、CPU等待访存协处理器就绪状态的周期的阈值;
步骤8、利用访存状态收集模块统计访存协处理器的预取状态;
E1、记录所述当前访存状态收集模块所统计的事件名称和所述事件对应存协处理器的名称、设定CPU等待访存协处理器到达空闲状态的周期的阈值;
E2、利用CPU查询对应访存协处理器的工作状态寄存器;
E3、记录CPU查询访存协处理器工作状态的次数;
E4、判断所述CPU查询访存协处理器工作状态的次数是否达到所述CPU等待访存协处理器就绪状态的周期的阈值;
E5、若所述CPU查询访存协处理器工作状态的次数达到所述CPU等待访存协处理器就绪状态的周期的阈值,则所述CPU等待访存协处理器就绪状态的周期加1;
E6、重复步骤C2至C4直至对应访存协处理器的工作状态为空闲;
步骤9、更新所述乘法矩阵和被乘矩阵的一次分块和二次分块的参数
CPU获得不同事件所对应的结构体Dstruct内容;并查询所述不同事件所对应的结构体Dstruct内容中的当前访存状态收集模块所统计的事件的名称;
F1、当事件为直接寄存器存取器DRA预取次单元被乘矩阵或直接寄存器存取器DRA预取次单元乘法矩阵时;
F1.1、查询直接寄存器存取器DRA预取次单元被乘矩阵事件或直接寄存器存取器DRA预取次单元乘法矩阵事件所对应的CPU等待访存协处理器就绪状态的周期;
F1.2、若直接寄存器存取器DRA预取次单元被乘矩阵事件或直接寄存器存取器DRA预取次单元乘法矩阵事件所对应的CPU等待访存协处理器就绪状态的周期不为零,则同步增加二次分块参数l与二次分块参数g的数值直至达到二次分块约束上限;
所述二次分块约束上限是指二次分块参数l和二次分块参数g满足式(1):
l×g<256(1)
F2、当事件为直接寄存器存取器DRA写回单元结果矩阵时;
F2.1、查询直接寄存器存取器DRA写回单元结果矩阵事件所对应的CPU等待访存协处理器就绪状态的周期;
F2.2、若直接寄存器存取器DRA写回单元结果矩阵事件所对应的CPU等待访存协处理器就绪状态的周期不为零,则增加二次分块的分块参数h的数值直到达到对二次分块约束上限;
所述二次分块约束上限是指二次分块参数l、二次分块参数h和二次分块参数g满足式
(2):
4×(l×h+h×g)+2(l×g)<512(2)
F3、当事件为直接高速缓冲存储器存取器DCA预取单元乘法矩阵时;
F3.1、查询直接高速缓冲存储器存取器DCA预取单元乘法矩阵事件所对应的CPU等待访存协处理器就绪状态的周期;
F3.2、当直接高速缓冲存储器存取器DCA预取单元乘法矩阵事件所对应的CPU等待访存协处理器就绪状态的周期不为零,则增加一次分块参数N和一次分块参数K的数值直到达到一次分块约束上限;
所述一次分块约束上限是指M为l的倍数,K为h的倍数,N为g的倍数且满足式(3):
8×(2M×K+K×N)≤1.5×1024×1024(3)
步骤10、根据更新前的一次分块参数M、一次分块参数N、一次分块参数K,通过地址偏移计算获得新的乘法矩阵和被乘矩阵的起始地址;
步骤11、重复步骤2至步骤10直至新的乘法矩阵和被乘矩阵的起始地址超过乘法矩阵和被乘矩阵所处的地址空间范围。
本发明基于龙芯3B的自适应矩阵乘法优化方法利用龙芯3B的直接高速缓冲存储器存取器控制寄存器和直接寄存器存取器对源矩阵进行二次预取,并利用访存状态收集模块对直接高速缓冲存储器存取器控制寄存器和直接寄存器存取器的工作状态进行分析,当直接高速缓冲存储器存取器控制寄存器和直接寄存器存取器的访存性能无法满足计算需求时,通过调整分块参数M、K、N、l、h、g的数值实现将访存掩盖于计算的目的。
与已有技术相比,本发明有益效果体现在:
本发明提出的基于龙芯3B的自适应矩阵乘法优化方法,可以根据访存协处理器在程序运行过程中的工作状态自动更新分块参数,针对不同配置下的龙芯3B平台加速矩阵乘法的优化速度,优化后的矩阵乘法平均效率占龙芯3B理论计算峰值的85%以上。
具体实施方式
本发明基于龙芯3B的自适应矩阵乘法优化方法,是先将龙芯3B的两个源矩阵(即乘法矩阵和被乘矩阵)按分块大小分别不大于二级缓存的原则划分成为两个子矩阵(即单元乘法矩阵和单元被乘矩阵),利用龙芯3B芯片上的直接高速缓冲存储器存取器DCA预取列长为M宽为K的乘法矩阵到高速缓冲区,通过添加代码的方式在直接高速缓冲存储器存取器DCA控制代码中加入访存状态收集模块,同时将列长为K宽为N的被乘矩阵复制于二级高速缓冲区,用直接寄存器存取器DRA从二级高速缓冲区中预取列长为l,宽为h的乘法矩阵以及长为h宽为g的被乘矩阵到寄存器,在直接寄存器存取器DRA的控制代码中加入访存状态收集模块,利用向量部件完成乘加运算,在矩阵乘法计算过程中通过访存状态收集模块获得的信息对分块参数M、K、N、l、h、g进行自适应调整和更新,获得目标平台下的新的分块参数。
具体过程如下:
步骤1、对乘法矩阵和被乘矩阵进行一次分块
以龙芯3B上的乘法矩阵的起始地址为基准划分为列长为M宽为K的单元乘法矩阵,以龙芯3B上的被乘矩阵的起始地址为基准划分为列长为K宽为N的单元被乘矩阵,单元乘法矩阵和单元被乘矩阵的大小将会在矩阵乘法程序运行的时候做自适应的调整,所以M,N,K的值只需设定在一个初始范围内即可,本实例中将M的值初始化为128,K的值初始化为200,N的值初始化为24;
步骤2、预取分块后的乘法矩阵和被乘矩阵至二级高速缓冲存储器L2-cache
2-1、通过nmap函数映射获得龙芯3B上的直接高速缓冲存储器存取器DCA的控制寄存器的读写虚地址,在本实例中通过nmap函数映射0x3ff00600地址,得到直接高速缓冲存储器存取器DCA的控制寄存器的读写虚地址;
2-2、将直接高速缓冲存储器存取器DCA的控制寄存器的源矩阵行元素个数域赋值为单元乘法矩阵的列长M,
2-3、将直接高速缓冲存储器存取器DCA的控制寄存器的源矩阵列元素个数域赋值为单元乘法矩阵的行宽K;
2-4、将直接高速缓冲存储器存取器DCA的控制寄存器的源矩阵起始地址域赋值为单元乘法矩阵所在内存空间的起始地址;以实现直接高速缓冲存储器存取器DCA预取单元乘法矩阵到二级高速缓冲存储器L2-cache的功能;
2-5、将单元被乘矩阵的数据复制到二级高速缓冲存储器L2-cache中;以实现CPU对单元被乘矩阵的预取功能;
步骤3、对分块后的乘法矩阵和被乘矩阵进行二次分块
将二级高速缓冲存储器L2-cache中的单元乘法矩阵划分为列长为l宽为h的次单元乘法矩阵,将二级高速缓冲存储器L2-cache中的单元被乘矩阵划分为列长为h宽为g的次单元被乘矩阵;由于这是对步骤1中所划分的矩阵的二次划分,这一划分过程中的l,h,g数值分别应该小于M,N,K当前的数值;并且,在自适应调整的过程中l,h,g通过增加自身的数值来进行调节;所以在本实例中将l,h,g均设定为较小值12。
步骤4、预取二次分块后的乘法矩阵和被乘矩阵至寄存器堆中
通过nmap函数映射获得龙芯3B上的直接寄存器存取器DRA的控制寄存器的读写基地址;在本实例中通过nmap函数映射0x1fa00000地址获得龙芯3B上的直接寄存器存取器DRA的控制寄存器的读写基地址,并通过增加地址偏移值得到龙芯3B上的直接寄存器存取器DRA的Cr2、Cr3、Cr4、Cr5寄存器的配置地址;
步骤A、二次分块后的乘法矩阵的预取
A1、将直接寄存器存取器DRA的Cr2寄存器的行宽域赋值为次单元乘法矩阵的行宽h;
A2、将直接寄存器存取器DRA的Cr2寄存器的次数域赋值为次单元乘法矩阵的列长l;
A3、将直接寄存器存取器DRA的Cr3寄存器的寄存器堆起始域赋值为存放次单元乘法矩阵的寄存器堆的起始地址;
A4、将直接寄存器存取器DRA的R0寄存器的源矩阵起始地址域赋值为次单元乘法矩阵所在内存空间的起始地址;以实现直接寄存器存取器DRA的预取次单元乘法矩阵到寄存器堆的功能;
步骤B、二次分块后的被乘矩阵的预取
B1、将直接寄存器存取器DRA的Cr4寄存器的行宽域赋值为次单元被乘矩阵的行宽g;
B2、将直接寄存器存取器DRA的Cr4寄存器的次数域赋值为次单元被乘矩阵的列长h;
B3、将直接寄存器存取器DRA的Cr5寄存器的寄存器堆起始域赋值为存放次单元被乘矩阵的寄存器堆的起始地址;
B4、将直接寄存器存取器DRA的R1寄存器的源矩阵起始地址域赋值为次单元被乘矩阵所在内存空间的起始地址;以实现直接寄存器存取器DRA的预取次单元被乘矩阵到寄存器堆的功能;
步骤5、对寄存器堆中的次单元乘法矩阵和次单元被乘矩阵进行乘加运算
C1、CPU等待直接寄存器存取器DRA发送的取数中断命令;
C2、CPU根据所获得的取数中断命令从寄存器堆中取出次单元乘法矩阵的n列和次单元被乘矩阵的n行,n的值必须小于等于当前h的值,在本实例中将n初始化为2;
C3、CPU利用乘加向量指令对的n列次单元乘法矩阵和n行次单元被乘矩阵进行乘加运算;
以上C1至C3过程的其实际操作代码为:
bc2f(0,0xffff)//
nop
.align3
VBCMULADDPDC1_00,B0_0,A0_0,0
VBCMULADDPDC1_01,B0_0,A0_1,0
VBCMULADDPDC1_02,B0_0,A0_2,0
C3、CPU设置直接寄存器存取器DRA的控制寄存器的Cr16到Cr23的值为0;该行为即CPU清空取数中断命令
C5、重复步骤C1至C3,直到次单元乘法矩阵和次单元被乘矩阵中的数据都完成乘加运算;
步骤6、将乘加运算的结果存储至内存上的结果矩阵
D1、将直接寄存器存取器DRA的Cr12寄存器的行宽域赋值为结果矩阵行宽的行宽g;
D2、将直接寄存器存取器DRA的Cr12寄存器的次数域赋值为结果矩阵的列长l;
D3、将直接寄存器存取器DRA的Cr13寄存器的寄存器堆起始域赋值为存放乘加运算的结果所在的寄存器堆的起始地址;
D4、将直接寄存器存取器DRA的R*寄存器的源矩阵起始地址域赋值为结果矩阵所在内存空间的起始地址;以实现直接寄存器存取器DRA将寄存器堆的计算结果写回结果矩阵的功能;
步骤7、构建访存状态收集模块
访存状态收集模块是利用结构体Dstruct来构建的;结构体Dstruct包含:当前访存状态收集模块所统计的事件的名称、该事件是指直接高速缓冲存储器存取器DCA预取单元乘法矩阵、直接寄存器存取器DRA预取次单元被乘矩阵、直接寄存器存取器DRA预取次单元乘法矩阵、直接寄存器存取器DRA写回单元结果矩阵这四个事件,事件对应的访存协处理器的名称、CPU等待访存协处理器就绪状态的周期、CPU查询访存协处理器工作状态的次数、CPU等待访存协处理器就绪状态的周期的阈值;访存协处理器是指直接高速缓冲存储器存取器DCA和直接寄存器存取器DRA的统称
结构体Dstruct可用伪代码描述如下:
其中componentName用于记录对应访存协处理器的名称,hitTimeIt记录达到就绪状态需要的周期,numTmp记录查询的次数,hitThreshold记录周期的单位,evenTags记录对应的事件;
本实例中,hitThreshold的值为512,即每发生512次查询则等待周期的记录加1;
步骤8、利用访存状态收集模块统计访存协处理器的预取状态;
E1、记录当前访存状态收集模块所统计的事件名称和事件对应存协处理器的名称、设定CPU等待访存协处理器到达空闲状态的周期的阈值;
E2、利用CPU查询对应访存协处理器的工作状态寄存器;
E3、记录CPU查询访存协处理器工作状态的次数;
E4、判断CPU查询访存协处理器工作状态的次数是否达到CPU等待访存协处理器就绪状态的周期的阈值;
E5、若CPU查询访存协处理器工作状态的次数达到CPU等待访存协处理器就绪状态的周期的阈值,则CPU等待访存协处理器就绪状态的周期加1;否则不加1,
E6、重复步骤C2至C5直至对应访存协处理器的工作状态为空闲;
步骤9、更新乘法矩阵和被乘矩阵的一次分块和二次分块的参数
CPU获得不同事件所对应的结构体Dstruct内容;并查询不同事件所对应的结构体Dstruct内容中的当前访存状态收集模块所统计的事件的名称;
F1、当事件为直接寄存器存取器DRA预取次单元被乘矩阵或直接寄存器存取器DRA预取次单元乘法矩阵时;
F1.1、查询直接寄存器存取器DRA预取次单元被乘矩阵事件或直接寄存器存取器DRA预取次单元乘法矩阵事件所对应的CPU等待访存协处理器就绪状态的周期;该CPU等待访存协处理器就绪状态的周期用于表征访存协处理器的预取状态
F1.2、当直接寄存器存取器DRA预取次单元被乘矩阵事件或直接寄存器存取器DRA预取次单元乘法矩阵事件所对应的CPU等待访存协处理器就绪状态的周期不为零,则同步增加二次分块参数l与二次分块参数g的数值直至达到二次分块约束上限;
二次分块约束上限是指二次分块参数l和二次分块参数g满足式(1)
l×g<256(1)
F2、当事件为直接寄存器存取器DRA写回单元结果矩阵时;
F2.1、查询直接寄存器存取器DRA写回单元结果矩阵事件所对应的CPU等待访存协处理器就绪状态的周期;
F2.2、当直接寄存器存取器DRA写回单元结果矩阵事件所对应的CPU等待访存协处理器就绪状态的周期不为零,则增加二次分块的分块参数h的数值直到达到对二次分块约束上限;该分块参数h是指单元乘法矩阵的行宽h和次单元被乘矩阵的列长h;
二次分块约束上限是指二次分块参数l、二次分块参数h和二次分块参数g满足式(2):
4×(l×h+h×g)+2(l×g)<512(2)
F3、当事件为直接高速缓冲存储器存取器DCA预取单元乘法矩阵时;
F3.1、查询直接高速缓冲存储器存取器DCA预取单元乘法矩阵事件所对应的CPU等待访存协处理器就绪状态的周期;
F3.2、当直接高速缓冲存储器存取器DCA预取单元乘法矩阵事件所对应的CPU等待访存协处理器就绪状态的周期不为零,则增加一次分块参数N和一次分块参数K的数值直到达到一次分块约束上限;
一次分块约束上限是指M为l的倍数,K为h的倍数,N为g的倍数且满足式(3);
8×(2M×K+K×N)≤1.5×1024×1024(3)
步骤10、根据更新前的一次分块参数M、一次分块参数N、一次分块参数K,通过地址偏移计算获得新的乘法矩阵和被乘矩阵的起始地址;
步骤11、重复步骤2至步骤10直至新的乘法矩阵和被乘矩阵的起始地址超过乘法矩阵和被乘矩阵的所处的地址空间范围,即乘法矩阵和被乘矩阵的所有分块完成计算。
综合使用上述优化方法后,在龙芯3B体系结构下,测试环境为:中央处理器(CPU)主频为800M,内存主频为375M,测试规模为10240到20480之间,采用本方法优化后的矩阵乘法可以根据访存协处理器在程序运行过程中的工作状态自动更新分块参数,可针对不同配置下的龙芯3B平台加速矩阵乘法的优化速度。在本实例中,算法最终得到的g为12,h为2,l为12,M为48,N为192且K值为256;优化后的矩阵乘法平均性能为10.92G,占龙芯3B理论计算峰值的85%以上。
Claims (1)
1.一种基于龙芯3B的自适应矩阵乘法优化方法,其特征在于,所述优化方法按如下步骤进行:
步骤1、对乘法矩阵和被乘矩阵进行一次分块
以龙芯3B上的乘法矩阵的起始地址为基准划分为列长为M宽为K的单元乘法矩阵,以所述龙芯3B上的被乘矩阵的起始地址为基准划分为列长为K宽为N的单元被乘矩阵,所述单元乘法矩阵和单元被乘矩阵的大小不超过二级高速缓冲存储器L2-cache的大小;
步骤2、预取分块后的乘法矩阵和被乘矩阵至二级高速缓冲存储器L2-cache
2-1、通过nmap函数映射获得所述龙芯3B上的直接高速缓冲存储器存取器DCA的控制寄存器的读写虚地址;
2-2、将直接高速缓冲存储器存取器DCA的控制寄存器的源矩阵行元素个数域赋值为所述单元乘法矩阵的列长M,
2-3、将直接高速缓冲存储器存取器DCA的控制寄存器的源矩阵列元素个数域赋值为所述单元乘法矩阵的行宽K;
2-4、将直接高速缓冲存储器存取器DCA的控制寄存器的源矩阵起始地址域赋值为所述单元乘法矩阵所在内存空间的起始地址;
2-5、将所述单元被乘矩阵的数据复制到二级高速缓冲存储器L2-cache中;
步骤3、对分块后的乘法矩阵和被乘矩阵进行二次分块
将所述二级高速缓冲存储器L2-cache中的单元乘法矩阵划分为列长为l宽为h的次单元乘法矩阵,将所述二级高速缓冲存储器L2-cache中的单元被乘矩阵划分为列长为h宽为g的次单元被乘矩阵;
步骤4、预取二次分块后的乘法矩阵和被乘矩阵至寄存器堆中
通过nmap函数映射获得所述龙芯3B上的直接寄存器存取器DRA的控制寄存器的读写基地址;
步骤A、二次分块后的乘法矩阵的预取
A1、将直接寄存器存取器DRA的Cr2寄存器的行宽域赋值为所述次单元乘法矩阵的行宽h;
A2、将直接寄存器存取器DRA的Cr2寄存器的次数域赋值为所述次单元乘法矩阵的列长l;
A3、将直接寄存器存取器DRA的Cr3寄存器的寄存器堆起始域赋值为存放次单元乘法矩阵的寄存器堆的起始地址;
A4、将直接寄存器存取器DRA的R0寄存器的源矩阵起始地址域赋值为次单元乘法矩阵所在内存空间的起始地址;
步骤B、二次分块后的被乘矩阵的预取
B1、将直接寄存器存取器DRA的Cr4寄存器的行宽域赋值为所述次单元被乘矩阵的行宽g;
B2、将直接寄存器存取器DRA的Cr4寄存器的次数域赋值为所述次单元被乘矩阵的列长h;
B3、将直接寄存器存取器DRA的Cr5寄存器的寄存器堆起始域赋值为存放次单元被乘矩阵的寄存器堆的起始地址;
B4、将直接寄存器存取器DRA的R1寄存器的源矩阵起始地址域赋值为次单元被乘矩阵所在内存空间的起始地址;
步骤5、对所述寄存器堆中的次单元乘法矩阵和次单元被乘矩阵进行乘加运算
C1、CPU等待直接寄存器存取器DRA发送的取数中断命令;
C2、CPU根据所获得的取数中断命令从寄存器堆中取出次单元乘法矩阵的n列和次单元被乘矩阵的n行;
C2、CPU利用乘加向量指令对所述的n列次单元乘法矩阵和n行次单元被乘矩阵进行乘加运算;
C3、CPU设置直接寄存器存取器DRA的控制寄存器的Cr16到Cr23的值为0;
C4、重复步骤C1至C3,直到所述次单元乘法矩阵和次单元被乘矩阵中的数据都完成乘加运算;
步骤6、将所述乘加运算的结果存储至内存上的结果矩阵
D1、将直接寄存器存取器DRA的Cr12寄存器的行宽域赋值为结果矩阵行宽的行宽g;
D2、将直接寄存器存取器DRA的Cr12寄存器的次数域赋值为结果矩阵的列长l;
D3、将直接寄存器存取器DRA的Cr13寄存器的寄存器堆起始域赋值为存放所述乘加运算的结果所在的寄存器堆的起始地址;
D4、将直接寄存器存取器DRA的R*寄存器的源矩阵起始地址域赋值为所述结果矩阵所在内存空间的起始地址;
步骤7、构建访存状态收集模块
所述访存状态收集模块是利用结构体Dstruct来构建的;所述结构体Dstruct包含:当前访存状态收集模块所统计的事件的名称、所述事件对应的访存协处理器的名称、CPU等待访存协处理器就绪状态的周期、CPU查询访存协处理器工作状态的次数、CPU等待访存协处理器就绪状态的周期的阈值;
步骤8、利用访存状态收集模块统计访存协处理器的预取状态;
E1、记录所述当前访存状态收集模块所统计的事件名称和所述事件对应存协处理器的名称、设定CPU等待访存协处理器到达空闲状态的周期的阈值;
E2、利用CPU查询对应访存协处理器的工作状态寄存器;
E3、记录CPU查询访存协处理器工作状态的次数;
E4、判断所述CPU查询访存协处理器工作状态的次数是否达到所述CPU等待访存协处理器就绪状态的周期的阈值;
E5、若所述CPU查询访存协处理器工作状态的次数达到所述CPU等待访存协处理器就绪状态的周期的阈值,则所述CPU等待访存协处理器就绪状态的周期加1;
E6、重复步骤C2至C4直至对应访存协处理器的工作状态为空闲;
步骤9、更新所述乘法矩阵和被乘矩阵的一次分块和二次分块的参数
CPU获得不同事件所对应的结构体Dstruct内容;并查询所述不同事件所对应的结构体Dstruct内容中的当前访存状态收集模块所统计的事件的名称;
F1、当事件为直接寄存器存取器DRA预取次单元被乘矩阵或直接寄存器存取器DRA预取次单元乘法矩阵时;
F1.1、查询直接寄存器存取器DRA预取次单元被乘矩阵事件或直接寄存器存取器DRA预取次单元乘法矩阵事件所对应的CPU等待访存协处理器就绪状态的周期;
F1.2、当直接寄存器存取器DRA预取次单元被乘矩阵事件或直接寄存器存取器DRA预取次单元乘法矩阵事件所对应的CPU等待访存协处理器就绪状态的周期不为零,则同步增加二次分块参数l与二次分块参数g的数值直至达到二次分块约束上限;
所述二次分块约束上限是指二次分块参数l和二次分块参数g满足式(1):
l×g<256(1)
F2、当事件为直接寄存器存取器DRA写回单元结果矩阵时;
F2.1、查询直接寄存器存取器DRA写回单元结果矩阵事件所对应的CPU等待访存协处理器就绪状态的周期;
F2.2、若直接寄存器存取器DRA写回单元结果矩阵事件所对应的CPU等待访存协处理器就绪状态的周期不为零,则增加二次分块的分块参数h的数值直到达到对二次分块约束上限;
所述二次分块约束上限是指二次分块参数l、二次分块参数h和二次分块参数g满足式
(2):
4×(l×h+h×g)+2(l×g)<512(2)
F3、当事件为直接高速缓冲存储器存取器DCA预取单元乘法矩阵时;
F3.1、查询直接高速缓冲存储器存取器DCA预取单元乘法矩阵事件所对应的CPU等待访存协处理器就绪状态的周期;
F3.2、若直接高速缓冲存储器存取器DCA预取单元乘法矩阵事件所对应的CPU等待访存协处理器就绪状态的周期不为零,则增加一次分块参数N和一次分块参数K的数值直到达到一次分块约束上限;
所述一次分块约束上限是指M为l的倍数,K为h的倍数,N为g的倍数且满足式(3):
8×(2M×K+K×N)≤1.5×1024×1024(3)
步骤10、根据更新前的一次分块参数M、一次分块参数N、一次分块参数K,通过地址偏移计算获得新的乘法矩阵和被乘矩阵的起始地址;
步骤11、重复步骤2至步骤10直至新的乘法矩阵和被乘矩阵的起始地址超过乘法矩阵和被乘矩阵所处的地址空间范围。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310442878.6A CN103530276B (zh) | 2013-09-25 | 2013-09-25 | 一种基于龙芯3b的自适应矩阵乘法优化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310442878.6A CN103530276B (zh) | 2013-09-25 | 2013-09-25 | 一种基于龙芯3b的自适应矩阵乘法优化方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103530276A CN103530276A (zh) | 2014-01-22 |
CN103530276B true CN103530276B (zh) | 2016-06-22 |
Family
ID=49932298
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310442878.6A Expired - Fee Related CN103530276B (zh) | 2013-09-25 | 2013-09-25 | 一种基于龙芯3b的自适应矩阵乘法优化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103530276B (zh) |
Families Citing this family (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103902506B (zh) * | 2014-04-16 | 2017-02-15 | 中国科学技术大学先进技术研究院 | 一种基于龙芯3b的fftw3优化方法 |
CN104572587B (zh) * | 2014-12-23 | 2017-11-14 | 中国电子科技集团公司第三十八研究所 | 数据矩阵相乘的加速运算方法和装置 |
CN108491359B (zh) * | 2016-04-22 | 2019-12-24 | 北京中科寒武纪科技有限公司 | 子矩阵运算装置及方法 |
EP3447653A4 (en) * | 2016-04-22 | 2019-11-13 | Cambricon Technologies Corporation Limited | SUBMATRIX OPERATING DEVICE AND METHOD |
CN106126481B (zh) * | 2016-06-29 | 2019-04-12 | 华为技术有限公司 | 一种计算系统和电子设备 |
CN108874445A (zh) | 2017-10-30 | 2018-11-23 | 上海寒武纪信息科技有限公司 | 神经网络处理器及使用处理器执行向量点积指令的方法 |
US12094456B2 (en) | 2018-09-13 | 2024-09-17 | Shanghai Cambricon Information Technology Co., Ltd. | Information processing method and system |
CN112765551B (zh) * | 2021-01-21 | 2024-05-07 | 中国科学院重庆绿色智能技术研究院 | 一种双重约化的矩阵乘法的分块参数空间优化方法 |
US11556337B2 (en) | 2021-04-12 | 2023-01-17 | Analog Devices International Unlimited Company | Parallel matrix multiplication technique optimized for memory fetches |
CN115373630B (zh) * | 2022-10-24 | 2022-12-20 | 北京麟卓信息科技有限公司 | 一种面向异构芯片的矩阵乘法运算过程优化方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102214160A (zh) * | 2011-07-08 | 2011-10-12 | 中国科学技术大学 | 一种基于龙芯3a的单精度矩阵乘法优化方法 |
CN102262553A (zh) * | 2011-08-03 | 2011-11-30 | 中国科学技术大学 | 一种基于龙芯3b的线性系统软件包优化方法 |
US8473539B1 (en) * | 2009-09-01 | 2013-06-25 | Xilinx, Inc. | Modified givens rotation for matrices with complex numbers |
-
2013
- 2013-09-25 CN CN201310442878.6A patent/CN103530276B/zh not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8473539B1 (en) * | 2009-09-01 | 2013-06-25 | Xilinx, Inc. | Modified givens rotation for matrices with complex numbers |
CN102214160A (zh) * | 2011-07-08 | 2011-10-12 | 中国科学技术大学 | 一种基于龙芯3a的单精度矩阵乘法优化方法 |
CN102262553A (zh) * | 2011-08-03 | 2011-11-30 | 中国科学技术大学 | 一种基于龙芯3b的线性系统软件包优化方法 |
Also Published As
Publication number | Publication date |
---|---|
CN103530276A (zh) | 2014-01-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103530276B (zh) | 一种基于龙芯3b的自适应矩阵乘法优化方法 | |
Bakhshalipour et al. | Bingo spatial data prefetcher | |
Wang et al. | Adaptive placement and migration policy for an STT-RAM-based hybrid cache | |
Shevgoor et al. | Efficiently prefetching complex address patterns | |
Sethia et al. | APOGEE: Adaptive prefetching on GPUs for energy efficiency | |
Sethumadhavan et al. | Scalable hardware memory disambiguation for high ILP processors | |
EP2115583A2 (en) | Speculative throughput computing | |
US8327121B2 (en) | Data cache receive flop bypass | |
WO2017172121A1 (en) | Pipelined prefetcher for parallel advancement of multiple data streams | |
Xu et al. | Frequent access pattern-based prefetching inside of solid-state drives | |
Alves et al. | Energy savings via dead sub-block prediction | |
Wang et al. | Gpu register packing: Dynamically exploiting narrow-width operands to improve performance | |
Yang et al. | Tolerating memory latency through push prefetching for pointer-intensive applications | |
Yoon et al. | Design of DRAM-NAND flash hybrid main memory and Q-learning-based prefetching method | |
Sazeides | Modeling value speculation | |
Srinivasan | Improving cache utilisation | |
Lotfi-Kamran et al. | Introduction to data prefetching | |
Li et al. | Thread criticality assisted replication and migration for chip multiprocessor caches | |
Tian et al. | Temporal-based multilevel correlating inclusive cache replacement | |
Gellert et al. | A multicore architecture with selective load value prediction | |
Fu et al. | Differential-Matching Prefetcher for Indirect Memory Access | |
Zhu et al. | Improving memory access performance of in-memory key-value store using data prefetching techniques | |
Derebasoglu et al. | Coherency traffic reduction in manycore systems | |
Dang et al. | An adaptive filtering mechanism for energy efficient data prefetching | |
Yang et al. | A programmable memory hierarchy for prefetching linked data structures |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20160622 Termination date: 20210925 |
|
CF01 | Termination of patent right due to non-payment of annual fee |