CN102446160A - 面向双精度simd部件的矩阵乘实现方法 - Google Patents
面向双精度simd部件的矩阵乘实现方法 Download PDFInfo
- Publication number
- CN102446160A CN102446160A CN2011102623836A CN201110262383A CN102446160A CN 102446160 A CN102446160 A CN 102446160A CN 2011102623836 A CN2011102623836 A CN 2011102623836A CN 201110262383 A CN201110262383 A CN 201110262383A CN 102446160 A CN102446160 A CN 102446160A
- Authority
- CN
- China
- Prior art keywords
- matrix
- simd
- vector
- result
- parts
- 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.)
- Granted
Links
Images
Landscapes
- Complex Calculations (AREA)
Abstract
本发明公开了一种面向双精度SIMD部件的矩阵乘实现方法,目的是提高矩阵乘在SIMD部件上的计算速度。技术方案是先增加矩阵B和矩阵C的列数;然后对矩阵A、B进行分块;A的每个分块和对应的B分块使用SIMD部件进行相乘,并将结果加到矩阵C中相应位置的结果和上;采用本发明避免了对矩阵数据进行重排序,提高了矩阵乘在SIMD部件上的计算速度。
Description
技术领域
本发明涉及通用微处理器中的SIMD(单指令多数据)部件,尤其指面向双精度SIMD部件的矩阵乘实现方法。
背景技术
通用微处理器芯片的集成度越来越大,在处理器中设计实现支持双精度浮点计算的SIMD部件来支持大规模科学和工程计算是一个重要的发展趋势。目前,商用微处理器上已经集成了SIMD部件,如Intel的MMX/SSE/AVX以及AMD的3D Now!技术等,都是面向SIMD部件的SIMD指令集。SIMD部件利用SIMD指令对向量进行操作,一个向量由多个浮点数据组成,从而实现了同时对多个浮点数据进行操作,加速了计算过程。
矩阵乘操作是数值计算中最常用的一类操作,很多应用中都包含矩阵乘的计算过程,利用SIMD部件加速矩阵乘计算过程可以有效提高应用的计算速度。实现面向SIMD部件的高效矩阵乘方法是关系到发挥SIMD部件加速能力的关键。否则,难以达到SIMD部件的加速计算的设计目标。
矩阵乘法是将被乘数矩阵A的一行和乘数矩阵B的一列相乘得到结果矩阵C中的一个元素。由于访问A和B的顺序不同,要对矩阵A或B进行重排序,传统的做法是将其中的一个矩阵进行转置。中国专利200380107095.7提出了一种使用SIMD寄存器的小矩阵乘法,方法中首先对矩阵数据进行重排序及寄存器加载,随后,将被乘数矩阵A的对角线乘以乘数矩阵B的列,把结果被加到结果矩阵C的列的结果和上。但是,这种方法只能处理维度较小的两个矩阵相乘。2001年Douglas和Jonathan提出了一种面向Intel SIMD部件的矩阵乘实现方法,但是,这种方法只适用于Intel的SIMD部件,而且方法中首先要对输入矩阵B进行转置操作。美国专利US007873812B1提出了一种面向SIMD部件的矩阵乘实现方法,但是它对矩阵的列数有特殊要求,只能处理输入矩阵A的列数可以被W(SIMD部件的向量长度)整除的情况,而且需要先对输入矩阵A进行转置操作,并要使用选择部件来选择向量寄存器中的元素。
综上所述,这些方法中都要求对矩阵数据进行有效的重排序,重排序会导致较大的计算开销,影响了矩阵乘在SIMD部件上的计算速度。面向SIMD部件,实现无需重排序的矩阵相乘方法仍是本领域技术人员迫切希望解决的技术问题。
发明内容
本发明要解决的技术问题是提出一种面向包含广播指令ld1toW的双精度SIMD部件的矩阵乘实现方法,避免对矩阵数据进行重排序,提高矩阵乘在SIMD部件上的计算速度。广播指令ld1toW是指将1个双精度浮点数据从存储器装载到向量寄存器的W个位置中。
本发明的技术方案为:对矩阵A和B进行分块,使用SIMD对A、B的子矩阵相乘,将子矩阵结果累加到结果矩阵C。
具体的技术方案为:
设A和B为输入矩阵,且均为双精度浮点矩阵,结果矩阵为C(C=A×B),A矩阵的大小是M*K,B矩阵为K*N,C大小为M*N。双精度SIMD部件的向量长度为W,即一个向量包含W个双精度浮点数。N、W、K全是整数。
第一步,增加矩阵B的列数,对增加的列使用0进行数据填充;
SIMD部件每次按行读取矩阵B的W个数据,如果N不是W的整数倍,在对B中每行数据的最后一次读取时,不能得到和矩阵A相乘的正确数据,这样就会得到错误结果。
所以,当N不是W的整数倍时,增加B的列数,将B增加W-N%W列,使B的列数为N+W-N%W,%表示模运算,增加的列使用0进行数据填充;当N是W的整数倍时,B的列数不变。
第二步,增加矩阵C的列数并将矩阵C的内容初始化为全0;
矩阵乘结果使用向量存指令存储到矩阵C中,矩阵C的列数必须和矩阵B相同,因此,需要增加矩阵C的列数,使C的列数为N+W-N%W。
矩阵C需要存储计算的中间结果,并对中间结果进行累加,所以需要将矩阵C的初始值初始化为0。
当矩阵B的K*N较大时,SIMD部件不可能将B中的所有数据取至SIMD部件的寄存器中,为了提高计算效率,需要对矩阵B进行分块。这样可以使每次子矩阵相乘的过程中,矩阵B的数据在SIMD部件的寄存器中被重复利用,提高SIMD部件的计算效率。
子矩阵Bj的大小即n和k值须满足:
2+n*(k+1)/W<VN且n%W=0和k%W=0,
2+n*(k+1)/W为每次子矩阵相乘所需的最少的向量寄存器数目(使用1个向量寄存器存储矩阵A的一个数据,使用n*k/W个向量寄存器存储B矩阵的数据,使用1个向量寄存器存储向量乘结果,使用n/W个向量寄存器存储每行的最终计算结果)。
第五步,子矩阵Ai和Bj在SIMD部件中相乘,并将结果累加到结果矩阵C中;
5.1令i=1,j=1,u=1,v=1;
5.2将n/W个结果向量寄存器Vs的内容初始化为0,1≤s≤n/W;
5.3使用广播指令ld1toW将Ai中的一个元素auv取至向量寄存器V0;
5.4令P=1;
5.5如果u等于1,使用向量访存指令将Bj中的第v行元素中从(P-1)*W+1至P*W的元素取至向量寄存器VZ中,1+n/W≤z≤n*(k+1)/W,执行第5.6步;如果u不等于1,则数据已经存放在向量寄存器中,执行第5.6步;
5.6V0和VZ进行向量乘法操作,将结果存储在向量寄存器Vt中t=1+n*(k+1)/W;
5.7Vt和结果向量寄存器Vs进行向量加操作,将结果存放在Vs中;
5.8如果P<n/W,P=P+1,跳转至5.5;否则,执行5.9步;
5.9将n/W个结果向量寄存器Vs中的数据和C的第u行中第(u-1)*n+1+(i-1)*n列至第u*n+(i-1)*n列的n个数据进行累加,并将结果写到C中;
5.10如果v<k,v=v+1,跳转至5.2步;否则,执行5.11步;
5.11如果u<M,u=u+1,跳转至5.2步;否则,执行第六步。
第六步,如果j=j+1,跳转至第五步。否则,j=j+1,执行第七步。
如果SIMD部件包含乘加指令,5.6和5.7可以合并为一个步骤。
采用本发明可以达到以下技术效果:
采用本发明可以实现任意维度(第一个输入矩阵A的列数等于第二个输入矩阵B的行数)的两个矩阵在双精度SIMD部件上相乘。本发明中5.3步对Ai是按行进行访问的(5.10步增加v,其后的5.11步增加u,因此5.3步的auv是按行访问的),5.5步中对Bj也是按行访问的,即对输入矩阵A和B可以按照其在存储中的相同顺序访问(如果A和B是按列存储的,将5.10和5.11调换顺序,5.5中取Bj每列的W个数据,就可以实现对输入矩阵A和B都是进行按列访问),避免了对其中的一个矩阵进行转置操作。同时,在子矩阵计算过程中,矩阵B的内容可以被重复利用,减少了访问矩阵B的时间,提高了双精度SIMD部件的计算效率。
附图说明
图1是本发明总体流程图;
图2是传统的面向SIMD部件的矩阵乘方法的一个实例。
图3是使用本发明的方法进行矩阵乘的一个实例。
具体实现方式
图1是本发明总体流程图,本发明的总体过程为:
第一步,增加矩阵B的列数并进行数据填充;
第二步,增加矩阵C的列数,并将C的内容初始化为全0;
第三步,矩阵B进行分块;
第四步,矩阵A进行分块;
第五步,子矩阵相乘,并将结果加到矩阵C中的行的结果和上;
第六步,是否遍历了B的位于同行的分块,如果是,执行第七步;否则,跳转至第五步;
第七步,是否遍历了A的所有分块,如果是,程序结束;否则,跳转至第五步。
为了检验面向SIMD部件的矩阵乘实现效果,使用国防科大飞腾CPU为实现平台,飞腾CPU的SIMD部件的向量长度为4,向量寄存器的个数为32。在该平台上采用C语言实现了SIMD部件的矩阵乘方法。假设两个输入矩阵是64×64的矩阵,根据本发明,B被划分为64个子块Bj,每个子块的大小为16×4;A被划分为4个子块Ai,每个子块的大小为64×16。图3给出了使用本发明实现两个64×64矩阵乘的方法,子块Ai(i为从1至4的整数)分别和子块Bj(j为从1+16*(i-1)至16*i的整数)进行相乘,将子矩阵相乘结果进行累加得到结果矩阵。因此采用本发明进行A和B相乘是对A和B按相同顺序进行访问,无需对A或B进行转置操作。图2给出了面向SIMD部件的两个64×64矩阵乘的传统方法,需要对B进行转置后进行矩阵乘的计算。
在飞腾CPU上,使用传统方法,转置B矩阵的时间为0.002秒,SIMD部件的计算时间为0.056秒,矩阵乘总共的计算时间为0.058秒。使用本发明时,面向SIMD部件的矩阵乘计算时间为0.055秒,性能提升了5.2%。
同时,对640×640的两个矩阵乘进行了实验,使用传统方法,转置B矩阵的时间为0.033秒,SIMD部件的计算时间为0.82秒,矩阵乘总共的计算时间为0.853秒;使用本发明时,矩阵乘计算时间为0.81秒,性能提升了5.04%。
Claims (1)
1.一种面向双精度SIMD部件的矩阵乘实现方法,其特征在于包括以下步骤:
第一步,对于输入矩阵A和B,当N不是W的整数倍时,增加输入矩阵B的列数,将B增加W-N%W列,使B的列数为N+W-N%W,%表示模运算,增加的列使用0进行数据填充;A矩阵的大小是M*K,B矩阵为K*N,A、B均为双精度浮点矩阵,W为双精度SIMD部件的向量长度,即一个向量包含W个双精度浮点数;N、W、K全是整数;结果矩阵为C,大小为M*N;
第二步,增加结果矩阵C的列数,使C的列数为N+W-N%W,并将矩阵C的内容初始化为全0;
子矩阵Bj的大小即n和k值须满足:
2+n*(k+1)/W<VN且n%W=0和k%W=0,
2+n*(k+1)/W为每次子矩阵相乘所需的最少的向量寄存器数目;
第五步,子矩阵Ai和Bj在SIMD部件中相乘,并将结果累加到结果矩阵C中;
5.1令i=1,j=1,u=1,v=1;
5.2将n/W个结果向量寄存器Vs的内容初始化为0,1≤s≤n/W;
5.3使用广播指令ld1toW将Ai中的一个元素auv取至向量寄存器V0;
5.4令P=1;
5.5如果u等于1,使用向量访存指令将Bj中的第v行元素中从(P-1)*W+1至P*W的元素取至向量寄存器VZ中,1+n/W≤z≤n*(k+1)/W,执行第5.6步;如果u不等于1,则数据已经存放在向量寄存器中,执行第5.6步;
5.6V0和VZ进行向量乘法操作,将结果存储在向量寄存器Vt中t=1+n*(k+1)/W;
5.7Vt和结果向量寄存器Vs进行向量加操作,将结果存放在Vs中;
5.8如果P<n/W,P=P+1,跳转至5.5;否则,执行5.9步;
5.9将n/W个结果向量寄存器Vs中的数据和C的第u行中第(u-1)*n+1+(i-1)*n列至第u*n+(i-1)*n列的n个数据进行累加,并将结果写到C中;
5.10如果v<k,v=v+1,跳转至5.2步;否则,执行5.11步;
5.11如果u<M,u=u+1,跳转至5.2步;否则,执行第六步;
第六步,如果j=j+1,跳转至第五步,否则,j=j+1,执行第七步;
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110262383.6A CN102446160B (zh) | 2011-09-06 | 2011-09-06 | 面向双精度simd部件的矩阵乘实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110262383.6A CN102446160B (zh) | 2011-09-06 | 2011-09-06 | 面向双精度simd部件的矩阵乘实现方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102446160A true CN102446160A (zh) | 2012-05-09 |
CN102446160B CN102446160B (zh) | 2015-02-18 |
Family
ID=46008664
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201110262383.6A Expired - Fee Related CN102446160B (zh) | 2011-09-06 | 2011-09-06 | 面向双精度simd部件的矩阵乘实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102446160B (zh) |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103294648A (zh) * | 2013-05-08 | 2013-09-11 | 中国人民解放军国防科学技术大学 | 支持多mac运算部件向量处理器的分块矩阵乘法向量化方法 |
CN104166852A (zh) * | 2013-05-20 | 2014-11-26 | 南京壹进制信息技术有限公司 | 利用simd提高lbp的提取速度 |
CN109313723A (zh) * | 2018-01-15 | 2019-02-05 | 深圳鲲云信息科技有限公司 | 人工智能卷积处理方法、装置、可读存储介质、及终端 |
CN109522125A (zh) * | 2018-11-19 | 2019-03-26 | 郑州云海信息技术有限公司 | 一种矩阵乘积转置的加速方法、装置及处理器 |
CN110147222A (zh) * | 2018-09-18 | 2019-08-20 | 北京中科寒武纪科技有限公司 | 运算装置及方法 |
WO2019171238A1 (en) * | 2018-03-05 | 2019-09-12 | International Business Machines Corporation | Multiple precision integer multiplier by matrix-matrix multiplications using 16-bit floating point multiplier |
CN110321161A (zh) * | 2019-06-26 | 2019-10-11 | 中国人民解放军国防科技大学 | 使用simd指令的向量函数快速查表法、系统及介质 |
CN112446007A (zh) * | 2019-08-29 | 2021-03-05 | 上海华为技术有限公司 | 一种矩阵运算方法、运算装置以及处理器 |
CN112783503A (zh) * | 2021-01-18 | 2021-05-11 | 中山大学 | 一种基于Arm架构的NumPy运算加速优化方法 |
US11874898B2 (en) | 2018-01-15 | 2024-01-16 | Shenzhen Corerain Technologies Co., Ltd. | Streaming-based artificial intelligence convolution processing method and apparatus, readable storage medium and terminal |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1774709A (zh) * | 2002-12-20 | 2006-05-17 | 英特尔公司 | 使用simd寄存器的小矩阵有效乘法 |
US7873812B1 (en) * | 2004-04-05 | 2011-01-18 | Tibet MIMAR | Method and system for efficient matrix multiplication in a SIMD processor architecture |
CN101986264A (zh) * | 2010-11-25 | 2011-03-16 | 中国人民解放军国防科学技术大学 | 用于simd向量微处理器的多功能浮点乘加运算装置 |
-
2011
- 2011-09-06 CN CN201110262383.6A patent/CN102446160B/zh not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1774709A (zh) * | 2002-12-20 | 2006-05-17 | 英特尔公司 | 使用simd寄存器的小矩阵有效乘法 |
US7873812B1 (en) * | 2004-04-05 | 2011-01-18 | Tibet MIMAR | Method and system for efficient matrix multiplication in a SIMD processor architecture |
CN101986264A (zh) * | 2010-11-25 | 2011-03-16 | 中国人民解放军国防科学技术大学 | 用于simd向量微处理器的多功能浮点乘加运算装置 |
Cited By (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103294648B (zh) * | 2013-05-08 | 2016-06-01 | 中国人民解放军国防科学技术大学 | 支持多mac运算部件向量处理器的分块矩阵乘法向量化方法 |
CN103294648A (zh) * | 2013-05-08 | 2013-09-11 | 中国人民解放军国防科学技术大学 | 支持多mac运算部件向量处理器的分块矩阵乘法向量化方法 |
CN104166852A (zh) * | 2013-05-20 | 2014-11-26 | 南京壹进制信息技术有限公司 | 利用simd提高lbp的提取速度 |
CN109313723B (zh) * | 2018-01-15 | 2022-03-15 | 深圳鲲云信息科技有限公司 | 人工智能卷积处理方法、装置、可读存储介质、及终端 |
CN109313723A (zh) * | 2018-01-15 | 2019-02-05 | 深圳鲲云信息科技有限公司 | 人工智能卷积处理方法、装置、可读存储介质、及终端 |
US11874898B2 (en) | 2018-01-15 | 2024-01-16 | Shenzhen Corerain Technologies Co., Ltd. | Streaming-based artificial intelligence convolution processing method and apparatus, readable storage medium and terminal |
WO2019171238A1 (en) * | 2018-03-05 | 2019-09-12 | International Business Machines Corporation | Multiple precision integer multiplier by matrix-matrix multiplications using 16-bit floating point multiplier |
CN111801651A (zh) * | 2018-03-05 | 2020-10-20 | 国际商业机器公司 | 使用16比特浮点乘法器的矩阵-矩阵乘法的多精度整数乘法器 |
GB2584265A (en) * | 2018-03-05 | 2020-11-25 | Ibm | Multiple precision integer multiplier by matrix-matrix multiplications using 16-bit floating point multiplier |
CN110147222A (zh) * | 2018-09-18 | 2019-08-20 | 北京中科寒武纪科技有限公司 | 运算装置及方法 |
CN110147222B (zh) * | 2018-09-18 | 2021-02-05 | 安徽寒武纪信息科技有限公司 | 运算装置及方法 |
CN109522125A (zh) * | 2018-11-19 | 2019-03-26 | 郑州云海信息技术有限公司 | 一种矩阵乘积转置的加速方法、装置及处理器 |
CN109522125B (zh) * | 2018-11-19 | 2021-12-03 | 郑州云海信息技术有限公司 | 一种矩阵乘积转置的加速方法、装置及处理器 |
CN110321161B (zh) * | 2019-06-26 | 2021-03-02 | 中国人民解放军国防科技大学 | 使用simd指令的向量函数快速查表法、系统及介质 |
CN110321161A (zh) * | 2019-06-26 | 2019-10-11 | 中国人民解放军国防科技大学 | 使用simd指令的向量函数快速查表法、系统及介质 |
CN112446007A (zh) * | 2019-08-29 | 2021-03-05 | 上海华为技术有限公司 | 一种矩阵运算方法、运算装置以及处理器 |
CN112783503A (zh) * | 2021-01-18 | 2021-05-11 | 中山大学 | 一种基于Arm架构的NumPy运算加速优化方法 |
CN112783503B (zh) * | 2021-01-18 | 2023-12-22 | 中山大学 | 一种基于Arm架构的NumPy运算加速优化方法 |
Also Published As
Publication number | Publication date |
---|---|
CN102446160B (zh) | 2015-02-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102446160B (zh) | 面向双精度simd部件的矩阵乘实现方法 | |
EP3499428A1 (en) | Method and electronic device for convolution calculation in neutral network | |
Gautschi | Numerical analysis | |
US9753695B2 (en) | Datapath circuit for digital signal processors | |
US8028015B2 (en) | Method and system for large number multiplication | |
CN101751376B (zh) | 利用cpu和gpu协同工作对三角线性方程组求解的加速方法 | |
CN109324827B (zh) | 用于处理用于访问数据的指令的装置、方法和系统 | |
US6609140B1 (en) | Methods and apparatus for fast fourier transforms | |
US20130185345A1 (en) | Algebraic processor | |
CN106951211B (zh) | 一种可重构定浮点通用乘法器 | |
US10067910B2 (en) | System and method for GPU maximum register count optimization applied to general matrix-matrix multiplication | |
CN103336758A (zh) | 一种稀疏矩阵的存储方法CSRL及基于该方法的SpMV实现方法 | |
US9996345B2 (en) | Variable length execution pipeline | |
CN103914276A (zh) | 利用浮点架构的定点除法电路 | |
US6202077B1 (en) | SIMD data processing extended precision arithmetic operand format | |
Gandham et al. | Gpu acceleration of equation of state calculations in compositional reservoir simulation | |
Bražėnas et al. | Parallel algorithms for fitting Markov arrival processes | |
JP4477959B2 (ja) | ブロードキャスト型並列処理のための演算処理装置 | |
CN104615584A (zh) | 面向gpdsp的大规模三角线性方程组求解向量化计算的方法 | |
JP5157484B2 (ja) | 行列演算コプロセッサ | |
US20070260660A1 (en) | Efficient mapping of FFT to a reconfigurable parallel and pipeline data flow machine | |
CN104793922B (zh) | 一种大整数乘法Comba算法基于OpenMP的并行实现方法 | |
CN103559312B (zh) | 一种基于gpu的旋律匹配并行化方法 | |
US7774399B2 (en) | Shift-add based parallel multiplication | |
CN103049716A (zh) | 基于一阶矩的卷积器 |
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 | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20150218 Termination date: 20180906 |