具体实施方式
在下面的描述中阐述了很多具体细节以便于充分理解本说明书。但是本说明书能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本说明书内涵的情况下做类似推广,因此本说明书不受下面公开的具体实施的限制。
在本说明书一个或多个实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本说明书一个或多个实施例中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本说明书一个或多个实施例中可能采用术语第一、第二等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一也可以被称为第二,类似地,第二也可以被称为第一。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
首先,对本说明书一个或多个实施例涉及的名词术语进行解释。
区块链:是一种新型的去中心化的分布式数据系统,一种带有数据“散列验证”功能的数据库。区块,就是数据块,按照时间顺序将数据块组合成一种链式结构,并利用密码学算法,以分布式记账的方式,集体维护数据库的可靠性。所有数据块按时间顺序相连,从而形成区块链,结合了共识机制、加密算法、点对点传输等多种技术。
Poseidon Hash:一种应用于零知识证明系统的全新的Hash函数,采用Poseidon的零知识证明系统的约束复杂度相对Pedersen Hash而言,可以减少8倍。
零知识证明:证明者(prover)能够在不向验证者(verifier)提供任何有用的信息的情况下,使验证者(verifier)相信某个论断是正确的。
Filecoin:是由协议实验室发起的一种分散式存储解决方案,是IPFS星际文件系统的一种区块链实现。
指令:指令是软件和硬件之间的桥梁,指令的设计决定着软件、硬件的设计复杂性和性能。
专用指令:为特定应用领域设计的专用处理器的指令,可以加速特定应用领域的算法,本说明书实施例中的专用指令专门为Poseidon Hash算法设计。
蒙哥马利模乘加指令:专为Poseidon Hash算法设计的一条指令,同时完成蒙哥马利域的乘法和加法运算。
Poseidon Hash作为一种最新散列函数广泛应用于区块链和隐私保护领域,比如,IPFS/Filecoin区块链、Loopring项目便采用了Poseidon Hash作为核心散列函数提升其安全性,而Poseidon Hash中的核心计算为矩阵乘运算,如何提升矩阵乘执行效率是面临的主要问题,如何利用流水化的模乘运算部件及相关指令是提升性能的关键。因而,本说明书实施例本提供了一种高性能的基于蒙哥马利模乘加的矩阵模乘算法,有效利用专用指令批处理的优势,大大提升矩阵乘运算部件的运行效率。
在本说明书中,提供了一种数据处理方法,本说明书同时涉及一种数据处理装置,一种计算设备,以及一种计算机可读存储介质,在下面的实施例中逐一进行详细说明。
图1示出了根据本说明书一个实施例提供的一种数据处理的场景示意图,如图1所示,处理器为执行矩阵乘运算的处理器,采用本说明书实施例提供的矩阵乘运算的数据处理方法,可以提高进行矩阵乘运算的处理器的运行效率,从而提高处理器的数据处理效率,节省矩阵乘运算的运算时间。
Filecoin中Poseidon Hash(Precommit2)阶段在单块处理器上的执行时间为20分钟左右,本说明书实施例提供了一种高性能的基于蒙哥马利模乘加的矩阵乘的处理方法,可以使Precommit2阶段在单块处理器上的执行时间缩短为10分钟左右,Poseidon Hash算法的核心计算为矩阵乘算法,提升矩阵乘算法的性能对提升处理器的运行效率起到了关键性作用。
需要说明的是,本说明书实施例提供的数据处理方法是应用于矩阵乘算法中,目前多个场景中都会涉及到矩阵乘算法,如区块链和隐私保护领域中的Poseidon Hash算法。以隐私保护领域来说,在对用户的数据信息进行加密时,可能会涉及到矩阵乘算法,即可以将用户的数据信息转换成矩阵,然后通过矩阵乘的方式进行加密,从而保护用户的数据安全;或者在对用户上传的隐私图片进行加密时,也可能会涉及到矩阵乘算法,即可以提取用户上传的图片中的数据,将图片的数据转换成矩阵,然后通过矩阵乘的方式进行加密,从而保护用户的数据安全。因而,不同场景中都会涉及到对矩阵乘的运算,本说明书实施例中提供的数据处理方法,可以应用于各种场景下涉及的矩阵乘运算。
图2A示出了根据本说明书一个实施例提供的一种数据处理方法的流程图,包括步骤S1至步骤S4。
步骤S1:确定第一矩阵和第二矩阵,并将所述第二矩阵拆分为第一预设数量的矩阵块。
具体的,第一矩阵和第二矩阵可以是指等待进行矩阵乘运算的两个矩阵,第一矩阵和第二矩阵均按列存储。需要说明的是,Poseidon Hash中的核心计算为矩阵乘运算,且可以是基于大整数模乘的矩阵乘运算,或者还可以是稀疏矩阵模乘运算,也就是说需要进行矩阵乘运算的矩阵中包括的元素可以为大整数,即该元素所占长度较长,如需要进行矩阵乘运算的矩阵中包括的元素可以为256比特的数据。另外,第一矩阵和第二矩阵可以为小规模的矩阵,即第一矩阵和第二矩阵的行、列可以小于预设阈值。其中,矩阵乘是指两个矩阵进行模乘的运算。
另外,由于两个矩阵能够进行乘法运算,需要第一矩阵的列等于第二矩阵的行,又由于本说明书实施例中是将第二矩阵拆分为第一预设数量的矩阵块,然后依次针对第一矩阵和第二矩阵拆分得到的数据块的每一行进行运算,因而第一矩阵的行和第二矩阵的行也相同。也就是说,第一矩阵是一个方阵,其包括的行、列相同,且第二矩阵的行与第一矩阵的行也相同。
示例的,确定出的第一矩阵为12*12的矩阵,第二矩阵为12*32的矩阵。
需要说明的是,执行蒙哥马利模乘加的处理器可以为全流水化运算部件,要高效利用该运算部件需要有充足的可并行执行的乘加操作,需要将原始的矩阵乘算法进行优化,以利用运算部件的这一特性,从而提升运算部件的运行效率。
本实施例一个可选的实施方式中,在对第一矩阵和第二矩阵进行矩阵乘运算时,将第二矩阵拆分为多个矩阵块之后,可以将第一矩阵分别与拆分得到的各个矩阵块进行运算,在对第一矩阵和拆分得到的矩阵块进行运算时,矩阵块可以存储在缓冲空间中,为了提高缓冲空间的空间利用率,节省存储资源开销,需要在缓冲空间中存储尽可能多列的元素,也即可以根据缓冲空间的大小,确定将第二矩阵拆分为多少个数据块,因而将所述第二矩阵拆分为第一预设数量个矩阵块,实现过程可以如下:
确定所述缓冲空间的缓冲容量;
根据所述缓冲容量,确定所述缓冲空间针对所述第二矩阵的存储列数;
根据所述第二矩阵的总列数和所述存储列数,确定所述第一预设数量;
将所述第二矩阵拆分为所述第一预设数量个矩阵块,每个所述矩阵块包括第二预设数量列元素。
具体的,缓冲空间是用于临时存储矩阵块的空间,缓冲容量是指缓冲空间的大小,根据缓冲空间的大小,可以确定出缓冲空间最多能够存储的第二矩阵的列数,即缓冲空间针对所述第二矩阵的存储列数,将所述第二矩阵的总列数除以所述存储列数,可以得到第二矩阵需要拆分的数据块的数量。
示例的,第二矩阵为12*32的矩阵,也就是说,第二矩阵包括32列元素,假设缓冲空间针对所述第二矩阵的存储列数为(即缓冲空间的大小最多能够存储)2列元素,则此时可以将第二矩阵拆分为16个矩阵块;或者,假设缓冲空间针对所述第二矩阵的存储列数为4列元素,则此时可以将第二矩阵拆分为8个矩阵块。
本实施例一个可选的实施方式中,将第二矩阵拆分为第一预设数量的矩阵块之后,可以把要与第一矩阵进行运算的矩阵块存储至缓冲空间中,以进行后续运算,也即调用蒙哥马利模乘加指令将所述第一矩阵包括的元素与第j个矩阵块包括的元素进行运算,得到所述第j个矩阵块对应的矩阵块运算结果之前,还包括:
将所述第j个矩阵块存储至缓冲空间中。
本说明书实施例中,在确定出第一矩阵和第二矩阵后,可以将所述第二矩阵拆分为第一预设数量的矩阵块,然后可以将要进行运算的矩阵块存储在缓冲空间中,便于后续将第一矩阵单独与该数据块进行运算,并使用与第一矩阵的运算结果覆盖矩阵块中原本的元素,即对缓冲空间存储的数据块进行更新,不断利用缓冲空间中存储的数据,充分利用了矩阵乘算法中的数据重用性,且缓冲空间存储的矩阵块的列数,是该缓冲空间最多所能存储的矩阵列数,最大化节省了存储资源开销。
步骤S2:调用蒙哥马利模乘加指令将所述第一矩阵包括的元素与第j个矩阵块包括的元素进行运算,得到所述第j个矩阵块对应的矩阵块运算结果,其中,j等于1。
其中,蒙哥马利模乘加指令是预先定义的专用指令,该指令可以同时实现蒙哥马利域的乘法和加法运算,蒙哥马利域是将常数域通过蒙哥马利模乘计算转换而成。需要说明的是,模乘需要进行乘法和除法操作,操作较为复杂,蒙哥马利算法是将模乘转换为乘法、加法、位移等操作。
具体的,在将所述第二矩阵拆分为第一预设数量的矩阵块的基础上,进一步的,可以调用蒙哥马利模乘加指令将所述第一矩阵包括的元素与第j个矩阵块包括的元素进行运算,得到所述第j个矩阵块对应的矩阵块运算结果,其中,j等于1。另外,蒙哥马利模乘加指令是预先定义的专用指令,该指令可以同时实现蒙哥马利域的乘法和加法运算。
本实施例一个可选的实施方式中,可以预先自定义蒙哥马利模乘加指令,来实现第一矩阵和各个矩阵块之前的运算,即调用蒙哥马利模乘加指令将所述第一矩阵包括的元素与第j个矩阵块包括的元素进行运算,得到所述第j个矩阵块对应的矩阵块运算结果之前,还包括:
设置所述蒙哥马利模乘加指令,所述蒙哥马利模乘加指令包括操作类型标识、第一源操作数、第二源操作数、第三源操作数和目标操作数。
具体的,操作类型标识可以是通过蒙哥马利模乘加指令要实现的运算类型,如操作类型标识可以为乘加操作、乘法操作、加法操作;第一源操作数、第二源操作数和第三源操作数可以为需要通过蒙哥马利模乘加指令进行运算的数据源,目标操作数可以是进行相应运算后得到的结果,即运算结果。
本说明书中可以预先自定义对第一矩阵和第二矩阵进行运算的专用指令,即蒙哥马利模乘加指令,后续可以通过自定义的蒙哥马利模乘加指令同时实现蒙哥马利域的乘法和加法操作,以执行第一矩阵包括的元素与第j个矩阵块包括的元素之间的复杂运算,从而得到最终进行矩阵乘运算后的目标矩阵,有效利用蒙哥马利模乘加指令批处理的优势,提高进行矩阵乘运算的处理器的运行效率,从而提高数据处理效率,节省矩阵进行矩阵乘运算的运算时间。
本实施例一个可选的实施方式中,调用蒙哥马利模乘加指令将所述第一矩阵包括的元素与第j个矩阵块包括的元素进行运算,得到所述第j个矩阵块对应的矩阵块运算结果,实现过程可以如下:
从所述缓冲空间中读取所述第j个矩阵块;
调用所述蒙哥马利模乘加指令将所述第一矩阵包括的元素与读取到的所述第j个矩阵块包括的元素进行运算,得到所述第j个矩阵块对应的矩阵块运算结果。
需要说明的是,将第二矩阵拆分为第一预设数量的矩阵块之后,可以把要与第一矩阵进行运算的矩阵块存储至缓冲空间中,因而在需要对第一矩阵和某个矩阵块进行运算时,可以从缓冲空间获取相应的数据块,再进行后续运算。
图2B是本说明书一个实施例提供的一种运算过程的流程图,本实施例一个可选的实施方式中,在将所述第一矩阵包括的元素与第j个矩阵块包括的元素进行运算的过程中,可以逐行将第一矩阵包括的元素与第j个矩阵块包括的元素进行运算,如图2B所示,所述第一矩阵包括第二预设数量行元素;
相应地,所述调用蒙哥马利模乘加指令将所述第一矩阵包括的元素与第j个矩阵块包括的元素进行运算,得到所述第j个矩阵块对应的矩阵块运算结果,实现过程可以包括如下步骤S21-S25:
步骤S21:设置所述第j个矩阵块中各列元素对应的初始中间结果,所述初始中间结果包括的各个元素均设置为0。
步骤S22:将所述第一矩阵的第i行的所有元素与所述第j个矩阵块包括的元素进行运算,得到所述第i行对应的目标中间结果,其中,i等于1。
步骤S23:判断i是否等于第二预设数量,若否,则执行步骤S24,若是,则执行步骤S25。
步骤S24:将所述第i行对应的目标中间结果确定为所述初始中间结果,令i自增1,继续执行步骤S22。
步骤S25:将所述第i行对应的目标中间结果确定为所述第j个矩阵块对应的矩阵块运算结果。
需要说明的是,对于第1行来说,将第一矩阵的第1行元素和第j个矩阵块进行运算,可以得到第1行对应的目标中间结果,由于第1行前面不存在数据,无需和前面的数据相结合,因而可以将初始中间结果包括的元素设置为0,后续可以将第1行得到的目标中间结果与初始中间结果相结合,并将第1行对应的目标中间结果确定为所述初始中间结果,即根据第1行对应的目标中间结果,对初始中间结果进行更新,便于后续在对第2行进行运算时,可以结合第1行的运算结果。因而,对于第2行来说,将第一矩阵的第2行元素和第j个矩阵块进行运算,可以得到第2行对应的目标中间结果,然后可以再根据第2行对应的目标中间结果对初始中间结果进行更新,直至得到最后一行对应的目标中间结果,即为第j个矩阵块对应的矩阵块运算结果。
另一种可能的实现方式中,也可以不预先设置初始中间结果,直接将第一矩阵的第1行和第j个矩阵块进行运算,得到第1行对应的目标中间结果,此时可以将第1行对应的目标中间结果设置为初始中间结果,然后将第一矩阵的第2行和第j个矩阵块进行运算,得到第2行对应的目标中间结果,再根据第2行对应的目标中间结果对所述初始中间结果进行更新,以进行后续的运算。
图2C是本说明书一个实施例提供的另一种运算过程的流程图,本实施例一个可选的实施方式中,在将所述第一矩阵的第i行的所有元素与所述第j个矩阵块包括的元素进行运算的过程中,可以将第一矩阵包括的元素与第j个矩阵块包括的元素逐列进行运算,如图2C所示,每个所述矩阵块包括第三预设数量列元素;
相应地,所述将所述第一矩阵的第i行的所有元素与所述第j个矩阵块包括的元素进行运算,得到所述第i行对应的目标中间结果,实现过程可以如下:
S221,将所述第一矩阵的第i行的所有元素与所述第j个矩阵块中第i行第k列的元素相乘,得到所述第k列元素对应的参考中间结果,其中,k等于1;
S222,将所述第k列元素对应的参考中间结果与所述第k列元素对应的初始中间结果相加,得到所述第k列元素对应的目标中间结果;
S223,判断k是否等于第三预设数量,若否,则将k自增1,继续执行步骤S221,若是,则执行步骤S224;
S224,将得到的各个所述目标中间结果确定为所述第i行对应的目标中间结果。
需要说明的是,对于某一行来说,可以先将该行的所有元素与所述第j个矩阵块中该行第1列的元素相乘,得到所述第1列元素对应的参考中间结果,然后将所述第1列元素对应的参考中间结果与所述第1列元素对应的初始中间结果相加,得到所述第1列元素对应的目标中间结果,直至该矩阵块中每列元素均运算完毕,可以得到相应的目标中间结果,此时得到的各列元素对应的目标中间结果即为该行对应的目标中间结果。
另外,对于某个矩阵块来说,其每一列元素都可以预先设置对应的初始中间结果,便于后续将第k列元素对应的参考中间结果与第k列元素对应的初始中间结果相加,得到第k列元素对应的目标中间结果。
再者,将第i行对应的目标中间结果确定为初始中间结果的过程中,可以将第i行第k列对应的目标中间结果确定为所述第k列对应的初始中间结果,即某一列对应的目标中间结果用来更新该列元素对应的初始中间结果。
示例的,图2D是本说明书一个实施例提供的一种运算过程的示意图,如图2D所示,第一矩阵为3*3的矩阵A,第二矩阵为3*4的矩阵B,将矩阵B拆分为2个矩阵块,每个矩阵块包括2列元素,即第一预设数量为2、第二预设数量为3、第三预设数量为2。针对第1个矩阵块,预先设置该矩阵块的第1列元素对应的初始中间结果1,以及该矩阵块的第2列元素对应的初始中间结果2,所述初始中间结果包括的各个元素均设置为0。
针对第1行元素(即i等于1),令k等于1,将矩阵A的第1行的所有元素与该矩阵块中第1行第1列的元素相乘,得到第1列元素对应的参考中间结果1,将该参考中间结果1和初始中间结果1相加,得到目标中间结果1;由于当前k等于1,不等于第三预设数量,因而令k自增1,将矩阵A的第1行的所有元素与该矩阵块中第1行第2列的元素相乘,得到第2列元素对应的参考中间结果2,将该参考中间结果2和初始中间结果2相加,得到目标中间结果2,由于当前k等于第三预设数量,因而将得到的目标中间结果1和目标中间结果2,确定为第1行对应的目标中间结果。
由于此时i等于1,不等于第二预设数量,因而将确定出的第1行对应的目标中间结果确定为初始中间结果,也即将第1行第1列对应的目标中间结果确定为第1列元素对应的初始中间结果,将第1行第2列对应的目标中间结果确定为第2列元素对应的初始中间结果,此时初始中间结果1为目标中间结果1,初始中间结果2为目标中间结果2。然后令i自增1,将矩阵A的第2行的所有元素与该矩阵块中第2行第1列的元素相乘,得到第1列元素对应的参考中间结果3,将该参考中间结果3和初始中间结果1(目标中间结果1)相加,得到目标中间结果3;由于当前k等于1,不等于第三预设数量,因而令k自增1,将矩阵A的第2行的所有元素与该矩阵块中第2行第2列的元素相乘,得到第2列元素对应的参考中间结果4,将该参考中间结果4和初始中间结果2(目标中间结果2)相加,得到目标中间结果4,由于当前k等于第三预设数量,因而将得到的目标中间结果3和目标中间结果4,确定为第2行对应的目标中间结果。
由于此时i等于2,不等于第二预设数量,因而将确定出的第2行对应的目标中间结果确定为初始中间结果,也即将第2行第1列对应的目标中间结果确定为第1列元素对应的初始中间结果,将第2行第2列对应的目标中间结果确定为第2列元素对应的初始中间结果,此时初始中间结果1为目标中间结果3,初始中间结果2为目标中间结果4。然后令i自增1,将矩阵A的第3行的所有元素与该矩阵块中第3行第1列的元素相乘,得到第1列元素对应的参考中间结果5,将该参考中间结果5和初始中间结果1(目标中间结果3)相加,得到目标中间结果5;由于当前k等于1,不等于第三预设数量,因而令k自增1,将矩阵A的第3行的所有元素与该矩阵块中第3行第2列的元素相乘,得到第2列元素对应的参考中间结果6,将该参考中间结果6和初始中间结果2(目标中间结果4)相加,得到目标中间结果6,由于当前k等于第三预设数量,因而将得到的目标中间结果5和目标中间结果6,确定为第3行对应的目标中间结果。
由于此时i等于第二预设数量,因而将第3行对应的目标中间结果确定为第1个矩阵块对应的矩阵块运算结果,即此时第1个矩阵块对应的矩阵块运算结果为目标中间结果5和目标中间结果6。
针对第二个矩阵块重复执行上述操作,可以得到第2个矩阵块对应的矩阵块运算结果,从而得到进行矩阵乘运算后的目标矩阵。
本实施例一个可选的实施方式中,预先自定义了蒙哥马利模乘加指令,因而上述每个运算过程都可以通过调用蒙哥马利模乘加指令实现,也即将所述第一矩阵的第i行的所有元素与所述第j个矩阵块包括的元素进行运算,得到所述第i行对应的目标中间结果,实现过程可以如下:
根据所述第一矩阵的第i行的所有元素与所述第j个矩阵块包括的元素的运算过程,确定所述操作类型标识、第一源操作数、第二源操作数和第三源操作数;
根据所述操作类型标识、第一源操作数、第二源操作数和第三源操作数,调用所述蒙哥马利模乘加指令,以执行所述步骤S221和步骤S222;
执行所述蒙哥马利模乘加指令后得到的目标操作数为所述目标中间结果。
需要说明的是,要进行运算的是第一矩阵的第i行的所有元素与所述第j个矩阵块包括的元素,由于所述第一矩阵的第i行的所有元素与所述第j个矩阵块包括的元素的运算过程包括上述步骤S221和步骤S222,因而需要根据步骤S221和步骤S222,确定蒙哥马利模乘加指令中所需的参数,即操作类型标识、第一源操作数、第二源操作数和第三源操作数。在确定出了操作类型标识、第一源操作数、第二源操作数和第三源操作数之后,可以根据所述操作类型标识、第一源操作数、第二源操作数和第三源操作数,调用所述蒙哥马利模乘加指令,以执行上述步骤S221和步骤S222的操作,得到相应的目标中间结果。
本实施例一个可选的实施方式中,根据所述第一矩阵的第i行的所有元素与所述第j个矩阵块包括的元素的运算过程,确定所述操作类型标识、第一源操作数、第二源操作数和第三源操作数,实现过程可以如下:
根据所述第一矩阵的第i行的所有元素与所述第j个矩阵块包括的元素的运算过程中包括的步骤S221和步骤S222,将所述操作类型标识确定为乘加操作;
将所述初始中间结果确定为所述第一源操作数,将所述第一矩阵的第i行的所有元素确定为所述第二源操作数,并将所述第j个矩阵块中第i行第k列的元素确定为所述第三源操作数。
需要说明的是,由于上述步骤S221为乘法运算对应的操作步骤,而步骤S222为加法运算对应的操作步骤,因而所述第一矩阵的第i行的所有元素与所述第j个矩阵块包括的元素的运算过程中包括乘法运算和加法运算,此时可以将所述操作类型标识确定为乘加操作。另外,步骤S221是将第一矩阵的第i行的所有元素与所述第j个矩阵块中第i行第k列的元素相乘,此时可以将所述第一矩阵的第i行的所有元素确定为所述第二源操作数,并将所述第j个矩阵块中第i行第k列的元素确定为所述第三源操作数,步骤S222是将步骤S221的结果与初始中间结果相加,因而可以确定所述初始中间结果确定为所述第一源操作数,执行蒙哥马利模乘加指令后得到的目标操作数为第i行对应的目标中间结果。
本说明书实施例提供了一种高性能的基于蒙哥马利模乘加的矩阵乘算法,通过将第二矩阵拆分成多个矩阵块,分别与第一矩阵进行运算,从而得到矩阵乘运算后的目标矩阵,简化了矩阵进行矩阵乘运算的运算过程,降低了运算复杂度;另外,可以预先自定义专用的蒙哥马利模乘加指令,通过调用蒙哥马利模乘加指令实现第一矩阵包括的元素与第j个矩阵块包括的元素之间的复杂运算,从而得到最终进行蒙哥马利模乘加运算后的目标矩阵,有效利用蒙哥马利模乘加指令批处理的优势,提高进行矩阵乘运算的处理器的运行效率,从而提高数据处理效率,节省矩阵进行矩阵乘运算的运算时间。
步骤S3:将所述第j个矩阵块对应的矩阵块运算结果覆盖所述第j个矩阵块中的元素。
具体的,在调用蒙哥马利模乘加指令将所述第一矩阵包括的元素与第j个矩阵块包括的元素进行运算,得到所述第j个矩阵块对应的矩阵块运算结果的基础上,进一步地,可以将所述第j个矩阵块对应的矩阵块运算结果覆盖所述第j个矩阵块中的元素。
需要说明的是,确定出的第j个矩阵块对应的矩阵块运算结果中可以包括该矩阵块中每一列元素对应的目标中间结果,因而可以在将所述第j个矩阵块对应的矩阵块运算结果覆盖所述第j个矩阵块中的元素时,可以使用第j个矩阵块对应的矩阵块运算结果中第k列元素对应的目标中间结果,替换第j个矩阵块中所述第k列的元素。
沿用上例,如图2D所示,针对第1个矩阵块,得到的矩阵块运算结果为目标中间结果5和目标中间结果6,目标中间结果5是第1个矩阵块中第1列元素对应目标中间结果,目标中间结果6是第1个矩阵块中第2列元素对应的目标中间结果,因而此时可以使用目标中间结果5覆盖第1个矩阵块中第1列的元素,使用目标中间结果6覆盖第1个矩阵块中第2列的元素,得到更新后的第1个矩阵块。
本说明书实施例提供了一种高性能的基于蒙哥马利模乘加的矩阵模乘算法,可以使用矩阵块与第一矩阵的运算结果覆盖矩阵块中原本的元素,从而得到矩阵乘运算后的目标矩阵,简化了矩阵进行矩阵乘运算的运算过程,降低了运算复杂度,算法简洁,可以适用于多种小规模的矩阵乘运算,且提高进行矩阵乘运算的处理器的运行效率,从而提高数据处理效率,节省矩阵进行矩阵乘运算的运算时间。
步骤S4:将j自增1,继续执行步骤S2,直至j等于所述第一预设数量,得到所述第一矩阵和第二矩阵进行矩阵乘运算后的目标矩阵。
具体的,在将所述第j个矩阵块对应的矩阵块运算结果覆盖所述第j个矩阵块中的元素的基础上,进一步地,可以将j自增1,继续执行上述步骤S2,直至j等于所述第一预设数量,得到所述第一矩阵和第二矩阵进行矩阵乘运算后的目标矩阵。
需要说明的是,在对第1个矩阵块中的元素进行覆盖,得到更新后的第1个矩阵块之后,还可以继续对第2个矩阵块重复执行上述操作过程,对第2个矩阵块中的元素进行覆盖,得到更新后的第2个矩阵块,直至拆分得到的各个矩阵块均覆盖完毕,此时说明第一矩阵和第二矩阵之间的运算完毕,得到的各个更新后的矩阵块合并后就是第一矩阵和第二矩阵进行矩阵乘运算后的目标矩阵。
本说明书一个实施例提供了一种数据处理方法,可以先确定出第一矩阵和第二矩阵,并将第二矩阵拆分为第一预设数量的矩阵块,然后调用蒙哥马利模乘加指令将第一矩阵包括的元素与第j个矩阵块包括的元素进行运算,得到第j个矩阵块对应的矩阵块运算结果,并使用第j个矩阵块对应的矩阵块运算结果覆盖第j个矩阵块中的元素,之后将j自增1,继续执行上述的得到矩阵块运算结果步骤,直至j等于第一预设数量,得到第一矩阵和第二矩阵进行矩阵乘运算后的目标矩阵。如此,提供了一种高性能的基于蒙哥马利模乘加的矩阵模乘算法,通过将第二矩阵拆分成多个矩阵块,然后使用与第一矩阵的运算结果覆盖矩阵块中原本的元素,从而得到矩阵乘运算后的目标矩阵,简化了矩阵乘运算的运算过程,降低了运算复杂度;另外,可以通过调用蒙哥马利模乘加指令实现第一矩阵包括的元素与第j个矩阵块包括的元素之间的复杂运算,从而得到最终进行矩阵乘运算后的目标矩阵,有效利用蒙哥马利模乘加指令批处理的优势,提高进行矩阵乘运算的处理器的运行效率,从而提高数据处理效率,节省矩阵进行模乘运算的运算时间。
图3A示出了根据本说明书一个实施例提供的另一种数据处理方法的流程图,如图3A所示,该方法包括:
步骤302:确定第一矩阵和第二矩阵,并将所述第二矩阵拆分为第一预设数量的矩阵块,所述第一矩阵包括第二预设数量行元素,每个所述矩阵块包括第三预设数量列元素。
步骤304:将所述第一矩阵的第1行的所有元素与所述第j个矩阵块中第1行第k列的元素相乘,得到所述第k列元素对应的参考中间结果,其中,k等于1,j等于1。
步骤306:判断k是否等于所述第三预设数量,若否,则将k自增1,继续执行步骤304,若是,则执行步骤308。
步骤308:将得到的各列元素对应的参考中间结果确定为各列元素对应的初始中间结果。
步骤310:将k设置为1。
步骤312:将所述第一矩阵的第i行的所有元素与所述第j个矩阵块中第i行第k列的元素相乘,得到所述第k列元素对应的参考中间结果,所述i等于2。
步骤314:将所述第k列元素对应的参考中间结果与所述第k列元素对应的初始中间结果相加,得到所述第k列元素对应的目标中间结果。
步骤316:判断k是否等于所述第三预设数量,若否,则将k自增1,继续执行步骤312,若是,则执行步骤318。
步骤318:将得到的各个目标中间结果确定第i行对应的目标中间结果。
步骤320:判断i是否等于第二预设数量,若否,则执行步骤322,若是,则执行步骤324。
步骤322:将所述第i行对应的目标中间结果确定为所述初始中间结果,令i自增1,继续执行步骤310。
步骤324:将所述第i行对应的目标中间结果确定为所述第j个矩阵块对应的矩阵块运算结果。
步骤326:将所述第j个矩阵块对应的矩阵块运算结果覆盖所述第j个矩阵块中的元素。
步骤328:将j自增1,返回执行步骤304,直至j等于所述第一预设数量,得到所述第一矩阵和第二矩阵进行矩阵乘运算后的目标矩阵。
需要说明的是,本实施例描述的是不预先设置初始中间结果,直接将第一矩阵的第1行和第j个矩阵块进行运算,得到第1行对应的目标中间结果,然后将第1行对应的目标中间结果设置为初始中间结果,再将第一矩阵的第2行和第j个矩阵块进行运算,得到第2行对应的目标中间结果,再根据第2行对应的目标中间结果对所述初始中间结果进行更新,以此类推,根据每一行对应的目标中间结果,对初始中间结果进行更新,直至得到最后一行对应的目标中间结果,将最后一行对应的目标中间结果确定为该矩阵块对应的矩阵运算结果。
示例的,图3B是本说明书一个实施例提供的另一种运算过程的示意图,如图3B所示,第一矩阵为3*3的矩阵A,第二矩阵为3*4的矩阵B,将矩阵B拆分为2个矩阵块,每个矩阵块包括2列元素,即第一预设数量为2、第二预设数量为3、第三预设数量为2。针对第1个矩阵块,且针对第1行元素(即i等于1),令k等于1,将矩阵A的第1行的所有元素与该矩阵块中第1行第1列的元素相乘,得到第1列元素对应的参考中间结果1,将该参考中间结果1确定为初始中间结果1;由于当前k等于1,不等于第三预设数量,因而令k自增1,将矩阵A的第1行的所有元素与该矩阵块中第1行第2列的元素相乘,得到第2列元素对应的参考中间结果2,将该参考中间结果2确定为初始中间结果2,由于当前k等于第三预设数量,因而此时可以将得到的参考中间结果1和参考中间结果2,确定为第1行对应的目标中间结果。
令i自增1,此时i等于2,将矩阵A的第2行的所有元素与该矩阵块中第2行第1列的元素相乘,得到第1列元素对应的参考中间结果3,将该参考中间结果3和初始中间结果1相加,得到目标中间结果1;由于当前k等于1,不等于第三预设数量,因而令k自增1,将矩阵A的第2行的所有元素与该矩阵块中第2行第2列的元素相乘,得到第2列元素对应的参考中间结果4,将该参考中间结果4和初始中间结果2相加,得到目标中间结果2,由于当前k等于第三预设数量,因而将得到的目标中间结果1和目标中间结果2,确定为第2行对应的目标中间结果。
由于此时i等于2,不等于第二预设数量,因而将确定出的第2行对应的目标中间结果确定为初始中间结果,也即将第2行第1列对应的目标中间结果确定为第1列元素对应的初始中间结果,将第2行第2列对应的目标中间结果确定为第2列元素对应的初始中间结果,此时初始中间结果1为目标中间结果1,初始中间结果2为目标中间结果2。然后令i自增1,将矩阵A的第3行的所有元素与该矩阵块中第3行第1列的元素相乘,得到第1列元素对应的参考中间结果5,将该参考中间结果5和初始中间结果1(目标中间结果1)相加,得到目标中间结果3;由于当前k等于1,不等于第三预设数量,因而令k自增1,将矩阵A的第3行的所有元素与该矩阵块中第3行第2列的元素相乘,得到第2列元素对应的参考中间结果6,将该参考中间结果6和初始中间结果2(目标中间结果2)相加,得到目标中间结果4,由于当前k等于第三预设数量,因而将得到的目标中间结果3和目标中间结果4,确定为第3行对应的目标中间结果。
由于此时i等于第二预设数量,因而将第3行对应的目标中间结果确定为第1个矩阵块对应的矩阵块运算结果,即此时第1个矩阵块对应的矩阵块运算结果为目标中间结果3和目标中间结果4。
使用目标中间结果3覆盖第1个矩阵块中第1列的元素,使用目标中间结果4覆盖第1个矩阵块中第2列的元素,得到更新后的第1个矩阵块。
针对第二个矩阵块重复执行上述操作,可以得到第2个矩阵块对应的矩阵块运算结果,从而得到进行矩阵乘运算后的目标矩阵。
另外,本实施例中描述的运算过程与图2A所示的实施例所描述的运算过程相类似,因而不预先设置初始中间结果直接进行运算的实现方式的详细内容可以参考上述图2A所示的实施例,本说明书实施例在此不再进行赘述。
本说明书一个实施例提供了一种高性能的基于蒙哥马利模乘加的矩阵模乘算法,通过将第二矩阵拆分成多个矩阵块,然后使用与第一矩阵的运算结果覆盖矩阵块中原本的元素,从而得到矩阵乘运算后的目标矩阵,简化了矩阵乘运算的运算过程,降低了运算复杂度;另外,可以通过调用蒙哥马利模乘加指令实现第一矩阵包括的元素与第j个矩阵块包括的元素之间的复杂运算,从而得到最终进行矩阵乘运算后的目标矩阵,有效利用蒙哥马利模乘加指令批处理的优势,提高进行矩阵乘运算的处理器的运行效率,从而提高数据处理效率,节省矩阵进行矩阵乘运算的运算时间。
图4示出了根据本说明书一个实施例提供的另一种数据处理方法的流程图,如图4所示,该方法包括:
步骤402:确定第一矩阵和第二矩阵,并将所述第二矩阵拆分为第一预设数量的矩阵块,所述第一矩阵包括第二预设数量行元素,每个所述矩阵块包括第三预设数量列元素。
步骤404:设置第j个矩阵块中各列元素对应的初始中间结果,所述初始中间结果包括的各个元素均设置为0,j等于1。
步骤406:将所述第一矩阵的第i行的所有元素与所述第j个矩阵块中第i行第k列的元素相乘,得到所述第k列元素对应的参考中间结果,其中,k等于1。
步骤408:将所述第k列元素对应的参考中间结果与所述第k列元素对应的初始中间结果相加,得到所述第k列元素对应的目标中间结果。
步骤410:判断k是否等于第三预设数量,若否,则将k自增1,继续执行步骤406,若是,则执行步骤412。
步骤412:将得到的各个目标中间结果确定第i行对应的目标中间结果。
步骤414:判断i是否等于第二预设数量,若否,则执行步骤416,若是,则执行步骤418。
步骤416:将所述第i行对应的目标中间结果确定为所述初始中间结果,令i自增1,继续执行步骤406。
步骤418:将所述第i行对应的目标中间结果确定为所述第j个矩阵块对应的矩阵块运算结果。
步骤420:将所述第j个矩阵块对应的矩阵块运算结果覆盖所述第j个矩阵块中的元素。
步骤422:将j自增1,返回执行步骤404,直至j等于所述第一预设数量,得到所述第一矩阵和第二矩阵进行矩阵乘运算后的目标矩阵。
需要说明的是,对于第1行来说,将第一矩阵的第1行元素和第j个矩阵块进行运算,可以得到第1行对应的目标中间结果,由于第1行前面不存在数据,无需和前面的数据相结合,因而可以将初始中间结果包括的元素设置为0,然后可以将第1行得到的目标中间结果与初始中间结果相结合,并将第1行对应的目标中间结果确定为所述初始中间结果,即根据第1行对应的目标中间结果,对初始中间结果进行更新,以此类推,得到每一行对应的目标中间结果后,对初始中间结果进行更新,直至得到最后一行对应的目标中间结果。
另外,本实施例中描述的运算过程与图2A所示的实施例所描述的运算过程相类似,因而预先设置初始中间结果,再进行运算的实现方式的详细内容可以参考上述图2A所示的实施例,本说明书实施例在此不再进行赘述。
本说明书一个实施例提供了一种高性能的基于蒙哥马利模乘加的矩阵模乘算法,通过将第二矩阵拆分成多个矩阵块,然后使用与第一矩阵的运算结果覆盖矩阵块中原本的元素,从而得到矩阵乘运算后的目标矩阵,简化了矩阵进行矩阵乘运算的运算过程,降低了运算复杂度;另外,可以通过调用蒙哥马利模乘加指令实现第一矩阵包括的元素与第j个矩阵块包括的元素之间的复杂运算,从而得到最终进行矩阵乘运算后的目标矩阵,有效利用蒙哥马利模乘加指令批处理的优势,提高进行矩阵乘运算的处理器的运行效率,从而提高数据处理效率,节省矩阵进行矩阵乘运算的运算时间。
与上述方法实施例相对应,本说明书还提供了数据处理装置实施例,图5示出了本说明书一个实施例提供的一种数据处理装置的结构示意图。如图5所示,该装置包括:
拆分模块502,被配置为确定第一矩阵和第二矩阵,并将所述第二矩阵拆分为第一预设数量的矩阵块;
调用模块504,被配置为调用蒙哥马利模乘加指令将所述第一矩阵包括的元素与第j个矩阵块包括的元素进行运算,得到所述第j个矩阵块对应的矩阵块运算结果,其中,j等于1,所述蒙哥马利模乘加指令用于同时实现蒙哥马利域的乘法和加法运算;
覆盖模块506,被配置为将所述第j个矩阵块对应的矩阵块运算结果覆盖所述第j个矩阵块中的元素;
执行模块508,被配置为将j自增1,继续执行所述调用模块,直至j等于所述第一预设数量,得到所述第一矩阵和第二矩阵进行矩阵乘运算后的目标矩阵。
可选地,所述第一矩阵包括第二预设数量行元素;
相应的,所述调用模块504进一步包括:
设置子模块,被配置为设置所述第j个矩阵块中各列元素对应的初始中间结果,所述初始中间结果包括的各个元素均设置为0;
运算子模块,被配置为将所述第一矩阵的第i行的所有元素与所述第j个矩阵块包括的元素进行运算,得到所述第i行对应的目标中间结果,其中,i等于1;
判断子模块,被配置为判断i是否等于所述第二预设数量,若否,则运行第一确定子模块,若是,则运行第二确定子模块;
第一确定子模块,被配置为将所述第i行对应的目标中间结果确定为所述初始中间结果,令i自增1,继续运行所述运算子模块;
第二确定子模块,被配置为将所述第i行对应的目标中间结果确定为所述第j个矩阵块对应的矩阵块运算结果。
可选地,每个所述矩阵块包括第三预设数量列元素;
相应地,所述运算子模块进一步包括:
乘法子单元,被配置为将所述第一矩阵的第i行的所有元素与所述第j个矩阵块中第i行第k列的元素相乘,得到所述第k列元素对应的参考中间结果,其中,k等于1;
加法子单元,被配置为将所述第k列元素对应的参考中间结果与所述第k列元素对应的初始中间结果相加,得到所述第k列元素对应的目标中间结果;
判断子单元,被配置为判断k是否等于所述第三预设数量,若否,则将k自增1,继续运行上述乘法子单元,若是,则运行下述确定子单元;
确定子单元,被配置为将得到的各个所述目标中间结果确定为所述第i行对应的目标中间结果。
可选地,所述装置还包括设置模块,被配置为:
设置所述蒙哥马利模乘加指令,所述蒙哥马利模乘加指令包括操作类型标识、第一源操作数、第二源操作数、第三源操作数和目标操作数。
可选地,运算子模块进一步被配置为:
根据所述第一矩阵的第i行的所有元素与所述第j个矩阵块包括的元素的运算过程,确定所述操作类型标识、第一源操作数、第二源操作数和第三源操作数;
根据所述操作类型标识、第一源操作数、第二源操作数和第三源操作数,调用所述蒙哥马利模乘加指令,以运行所述乘法子单元和加法子单元;
执行所述蒙哥马利模乘加指令后得到的目标操作数为所述目标中间结果。
可选地,运算子模块进一步被配置为:
根据所述第一矩阵的第i行的所有元素与所述第j个矩阵块包括的元素的运算过程中运行的乘法子单元和加法子单元,将所述操作类型标识确定为乘加操作;
将所述初始中间结果确定为所述第一源操作数,将所述第一矩阵的第i行的所有元素确定为所述第二源操作数,并将所述第j个矩阵块中第i行第k列的元素确定为所述第三源操作数。
可选地,所述装置还包括存储模块,被配置为:
将所述第j个矩阵块存储至缓冲空间中;
相应的,调用模块504进一步被配置为:
从所述缓冲空间中读取所述第j个矩阵块;
调用所述蒙哥马利模乘加指令将所述第一矩阵包括的元素与读取到的所述第j个矩阵块包括的元素进行运算,得到所述第j个矩阵块对应的矩阵块运算结果。
可选地,拆分模块502进一步被配置为:
确定所述缓冲空间的缓冲容量;
根据所述缓冲容量,确定所述缓冲空间针对所述第二矩阵的存储列数;
根据所述第二矩阵的总列数和所述存储列数,确定所述第一预设数量;
将所述第二矩阵拆分为所述第一预设数量个矩阵块,每个所述矩阵块包括第二预设数量列元素。
本说明书一个实施例提供了一种数据处理装置,通过将第二矩阵拆分成多个矩阵块,然后使用与第一矩阵的运算结果覆盖矩阵块中原本的元素,从而得到矩阵乘运算后的目标矩阵,简化了矩阵乘运算的运算过程,降低了运算复杂度;另外,可以通过调用蒙哥马利模乘加指令实现第一矩阵包括的元素与第j个矩阵块包括的元素之间的复杂运算,从而得到最终进行矩阵乘运算后的目标矩阵,有效利用蒙哥马利模乘加指令批处理的优势,提高进行矩阵乘运算的处理器的运行效率,从而提高数据处理效率,节省矩阵进行矩阵乘运算的运算时间。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于数据处理装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
图6示出了根据本说明书一个实施例提供的一种计算设备600的结构框图。该计算设备600的部件包括但不限于存储器610和处理器620。处理器620与存储器610通过总线630相连接,数据库650用于保存数据。
计算设备600还包括接入设备640,接入设备640使得计算设备600能够经由一个或多个网络660通信。这些网络的示例包括公用交换电话网(PSTN)、局域网(LAN)、广域网(WAN)、个域网(PAN)或诸如因特网的通信网络的组合。接入设备640可以包括有线或无线的任何类型的网络接口(例如,网络接口卡(NIC))中的一个或多个,诸如IEEE802.11无线局域网(WLAN)无线接口、全球微波互联接入(Wi-MAX)接口、以太网接口、通用串行总线(USB)接口、蜂窝网络接口、蓝牙接口、近场通信(NFC)接口,等等。
在本说明书的一个实施例中,计算设备600的上述部件以及图6中未示出的其他部件也可以彼此相连接,例如通过总线。应当理解,图6所示的计算设备结构框图仅仅是出于示例的目的,而不是对本说明书范围的限制。本领域技术人员可以根据需要,增添或替换其他部件。
计算设备600可以是任何类型的静止或移动计算设备,包括移动计算机或移动计算设备(例如,平板计算机、个人数字助理、膝上型计算机、笔记本计算机、上网本等)、移动电话(例如,智能手机)、可佩戴的计算设备(例如,智能手表、智能眼镜等)或其他类型的移动设备,或者诸如台式计算机或PC的静止计算设备。计算设备600还可以是移动式或静止式的服务器。
其中,处理器620用于执行如下计算机可执行指令以实现:
S1,确定第一矩阵和第二矩阵,并将所述第二矩阵拆分为第一预设数量的矩阵块;
S2,调用蒙哥马利模乘加指令将所述第一矩阵包括的元素与第j个矩阵块包括的元素进行运算,得到所述第j个矩阵块对应的矩阵块运算结果,其中,j等于1,所述蒙哥马利模乘加指令用于同时实现蒙哥马利域的乘法和加法运算;
S3,将所述第j个矩阵块对应的矩阵块运算结果覆盖所述第j个矩阵块中的元素;
S4,将j自增1,继续执行步骤S2,直至j等于所述第一预设数量,得到所述第一矩阵和第二矩阵进行矩阵乘运算后的目标矩阵。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于计算设备实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本说明书一实施例还提供一种计算机可读存储介质,其存储有计算机指令,该指令被处理器执行时以用于实现上述任意一项所述数据处理方法的步骤。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于计算机可读存储介质实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
所述计算机指令包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,RandomAccess Memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。
需要说明的是,对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本说明书实施例并不受所描述的动作顺序的限制,因为依据本说明书实施例,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本说明书实施例所必须的。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。
以上公开的本说明书优选实施例只是用于帮助阐述本说明书。可选实施例并没有详尽叙述所有的细节,也不限制该发明仅为所述的具体实施方式。显然,根据本说明书实施例的内容,可作很多的修改和变化。本说明书选取并具体描述这些实施例,是为了更好地解释本说明书实施例的原理和实际应用,从而使所属技术领域技术人员能很好地理解和利用本说明书。本说明书仅受权利要求书及其全部范围和等效物的限制。