技术领域
[0001] 本
发明实施例涉及
高性能计算领域,尤其涉及一种矩阵向量乘法的实现方法和装置。
背景技术
[0002] 当前社会人类的数据
大爆炸,信息数据越来越多,人们对信息数据的处理能
力的要求也越来越高,例如在
人工智能、气象预报、航天国防、金融经济、石油勘探、科学研究等领域,对高性能运算的需求与日俱增,而高性能的矩阵向量乘法计算,更是其重要的基石。但目前的矩阵向量乘法中采用的方案是CPU(Central Processing Unit
中央处理器)串行计算矩阵向量乘法,即对矩阵中的一个数据乘完以后再进行下一个数据的相乘,计算时间长,效率低,远不能满足当前日益增长的
数据处理速度要求。
发明内容
[0003] 为了解决上述问题,本发明实施例提出了一种矩阵向量乘法的实现方法和装置,能够在高性能计算平台上实施,充分利用计算机
硬件资源,并且大大缩短了计算时间,提高了运算效率。
[0004] 为了达到上述目的,本发明实施例提出了一种矩阵向量乘法的实现方法,该方法包括:
[0005] 在开放运算语言OpenCL
框架下,对相乘的第一矩阵和第二矩阵分别进行向量化处理;
[0006] 将向量化处理后获得的多个子矩阵进行并行运算。
[0007] 可选地,在开放运算语言OpenCL框架下,对相乘的第一矩阵和第二矩阵分别进行向量化处理包括:
[0008] 将第一矩阵中的每一个行向量作为一个行数据
块,并将第二矩阵中的每一个列向量作为一个列数据块;
[0009] 分别将任意一个行数据块与任意一个列数据块传入一个kernel函数中,并获取多个kernel函数;其中,每个kernel函数与其中传入的行数据块和列数据块一一对应;
[0010] 对每个kernel函数中的行数据块和列数据块分别进行向量化处理,以获得多个行向量子矩阵和多个列向量子矩阵。
[0011] 可选地,对每个kernel函数中的行数据块和列数据块分别进行向量化处理包括:
[0012] 采用OpenCL的向量Vector数据类型,分别对行数据块中的每n个浮点型数据进行向量化处理以获得多个行向量子矩阵,并且分别对列数据块中的每n个浮点型数据进行向量化处理以获得多个列向量子矩阵,其中,n为正整数。
[0013] 可选地,将向量化处理后获得的多个子矩阵进行并行运算包括:
[0014] 在每个kernel函数中,分别将相互对应的行向量子矩阵与列向量子矩阵进行并行相乘。
[0015] 可选地,n=4。
[0016] 为了达到上述目的,本发明实施例还提出了一种矩阵向量乘法的实现装置,该装置包括:处理模块和运算模块;
[0017] 处理模块,用于在开放运算语言OpenCL框架下,对相乘的第一矩阵和第二矩阵分别进行向量化处理;
[0018] 运算模块,用于将向量化处理后获得的多个子矩阵进行并行运算。
[0019] 可选地,处理模块在开放运算语言OpenCL框架下,对相乘的第一矩阵和第二矩阵分别进行向量化处理包括:
[0020] 将第一矩阵中的每一个行向量作为一个行数据块,并将第二矩阵中的每一个列向量作为一个列数据块;
[0021] 分别将任意一个行数据块与任意一个列数据块传入一个kernel函数中,并获取多个kernel函数;其中,每个kernel函数与其中传入的行数据块和列数据块一一对应;
[0022] 对每个kernel函数中的行数据块和列数据块分别进行向量化处理,以获得多个行向量子矩阵和多个列向量子矩阵。
[0023] 可选地,处理模块对每个kernel函数中的行数据块和列数据块分别进行向量化处理包括:
[0024] 采用OpenCL的Vector数据类型,分别对行数据块中的每n个浮点型数据进行向量化处理以获得多个行向量子矩阵,并且分别对列数据块中的每n个浮点型数据进行向量化处理以获得多个列向量子矩阵,其中,n为正整数。
[0025] 可选地,运算模块将向量化处理后获得的多个子矩阵进行并行运算包括:
[0026] 在每个kernel函数中,分别将相互对应的行向量子矩阵与列向量子矩阵进行并行相乘。
[0027] 可选地,n=4。
[0028] 本发明实施例方案包括:在开放运算语言OpenCL框架下,对相乘的第一矩阵和第二矩阵分别进行向量化处理;将向量化处理后获得的多个子矩阵进行并行运算。通过本发明实施例的方案,能够在高性能计算平台上实施,充分利用了计算机硬件资源,并且大大缩短了计算时间,提高了运算效率。
附图说明
[0029] 下面对本发明实施例中的附图进行说明,实施例中的附图是用于对本发明实施例的进一步理解,与
说明书一起用于解释本发明实施例,并不构成对本发明实施例保护范围的限制。
[0030] 图1为本发明实施例的矩阵向量乘法的实现方法
流程图;
[0031] 图2为本发明实施例的对相乘的第一矩阵和第二矩阵分别进行向量化处理方法流程图;
[0032] 图3为本发明实施例的对第一矩阵和第二矩阵进行数据块划分示意图;
[0033] 图4为本发明实施例的矩阵向量乘法的OpenCL框架流程图;
[0034] 图5为本发明实施例的kernel函数中对行数据块与列数据块进行向量化示意图;
[0035] 图6为本发明实施例的矩阵向量乘法的实现装置组成
框图。
具体实施方式
[0036] 为了便于本领域技术人员的理解,下面结合附图对本发明实施例作进一步的描述,并不能用来限制本发明实施例的保护范围。
[0037] 本发明实施例提出了一种矩阵向量乘法的实现方法,如图1所示,该方法可以包括S101-S102:
[0038] S101、在开放运算语言OpenCL框架下,对相乘的第一矩阵和第二矩阵分别进行向量化处理。
[0039] 在本发明实施例中,为了解决当前矩阵乘法运算方法存在的速度慢、效率低的问题,提出了一种基于OpenCL的矩阵向量乘法实现方法。OpenCL(OpenComputingLanguage开放运算语言)语言,它是开放的、跨平台的面向异构系统通用目的的并行编程框架。在目前的可实现并行
加速的计算机硬件条件下,可以充分利用计算机硬件资源,提高矩阵向量乘法的运算效率;所述的计算机硬件为所有支持OpenCL的计算机硬件平台,例如,此计算机硬件平台可由CPU、GPU(Graphic Processing Unit,图形处理器)或其他类型的处理器组成。
[0040] 在本发明实施例中,基于OpenCL的矩阵向量乘法实现的方法是通过将运算矩阵分块处理,分块个数与矩阵行列数相等,从而实现数据的并行化处理。具体可以通过以下方案实现。
[0041] 可选地,如图2所示,在开放运算语言OpenCL框架下,对相乘的第一矩阵和第二矩阵分别进行向量化处理可以包括S201-S203:
[0042] S201、将第一矩阵中的每一个行向量作为一个行数据块,并将第二矩阵中的每一个列向量作为一个列数据块。
[0043] 在本发明实施例中,在OpenCL框架下首先进行初始化工作,对设备Device、上下文Context、程序Program等必需的组件进行定义与赋值,然后对相乘的第一矩阵和第二矩阵进行分块处理。具体地,可以将第一矩阵中的每一个行向量作为一个行数据块,并将第二矩阵中的每一个列向量作为一个列数据块。如图3所示的行数据块Hblock1、Hblock2、Hblock3……Hblockn,以及列数据块Lblock1、Lblock2、Lblock3……Lblockn。
[0044] S202、分别将任意一个行数据块与任意一个列数据块传入一个kernel函数中,并获取多个kernel函数;其中,每个kernel函数与其中传入的行数据块和列数据块一一对应。
[0045] 在本发明实施例中,如图4所示,在进行计算时,可以将任意的一个行数据块以及一个列数据块传入一个kernel函数中,例如,将Hblock1与Lblock1传入kernel中,将Hblock2与Lblock1传入kerne2中,将Hblock3与Lblock1传入kerne3中,……,依此类推,将不同的行数据块与列数据块的组合放入不同的kernel函数中,以在不同的kernel函数中分别对相应的行数据块与列数据块做并行乘法运算。
[0046] S203、对每个kernel函数中的行数据块和列数据块分别进行向量化处理,以获得多个行向量子矩阵和多个列向量子矩阵。
[0047] 在本发明实施例中,在将行数据块与列数据块传入不同的kernel函数中以后,在每个kernel函数中,还可以进一步对行数据块与列数据块进行向量化处理,以将该行数据块与列数据块进一步划分为更小的子向量或子矩阵。具体可以通过以下方案实现。
[0048] 可选地,对每个kernel函数中的行数据块和列数据块分别进行向量化处理包括:
[0049] 采用OpenCL的向量Vector数据类型,分别对行数据块中的每n个浮点型数据进行向量化处理以获得多个行向量子矩阵,并且分别对列数据块中的每n个浮点型数据进行向量化处理以获得多个列向量子矩阵,其中,n为正整数。
[0050] 在本发明实施例中,如图5所示,在kernel函数的运算当中,采用OpenCL的Vector数据类型,可以进一步将每个行数据块以及列数据块中包含的数据进行向量化处理,每个行数据块和列数据块可以被划分为多个子矩阵,每个子矩阵中可以包含n个浮点型数据。
[0051] 在本发明实施例中,n的数值可以根据当前计算平台的计算能力进行确定,如果当前计算平台的计算能力较强,可以将n的数值设置的较小一些,如果当前计算平台的计算能力较差,可以将n的数值设置的较大一些。可选地,n=4。例如,将行数据块中的每相邻的4个单
精度浮点数据作为一个行向量子矩阵,对应地,将列数据块中的每相邻的4个单精度浮点数据作为一个列向量子矩阵,如图5所示的行向量子矩阵HVector1、HVector2……HVectorn,以及列向量子矩阵LVector1、LVector2……LVectorn。
[0052] S102、将向量化处理后获得的多个子矩阵进行并行运算。
[0053] 在本发明实施例中,对每个kernel函数中的数据块进一步向量化以后,便可以对向量化后的多个子矩阵采用异步线程进行并行运算了。
[0054] 可选地,将向量化处理后获得的多个子矩阵进行并行运算可以包括:
[0055] 在每个kernel函数中,分别将相互对应的行向量子矩阵与列向量子矩阵进行并行相乘。
[0056] 在本发明实施例中,例如分别将HVector1与LVector1相乘,将HVector2与LVector2相乘,……将HVectorn与LVectorn相乘,并且上述运算并行进行,当n=4时,使得每一个线程一次处理4个单精度浮点数操作,从而利用向量运算进一步提高运算效率。每个计算单元在运算过程中相互独立,无需通信,故也具有良好的可拓展性,并且该实施例方案兼顾了并行粒度与运算效率。
[0057] 在本发明实施例中,通过本发明实施例方案将实现高性能计算单元之间独立运算,无需通信或相互等待,实现高性能快速计算;并且本发明实施例方案具有良好的平台移植性,由于OpenCL的跨平台特性,此实施例方案可方便的移植到所有支持OpenCL的异构高性能计算平台上;与传统的CPU串行计算矩阵向量乘法相比,利用了数据并行与向量化方法,大大提高了计算效率。
[0058] 为了达到上述目的,本发明实施例还提出了一种矩阵向量乘法的实现装置1,需要说明的是,上述的方法实施例中的任意一个实施例均适用于本发明的装置实施例中,在此不再赘述,如图6所示,该装置可以包括:处理模块11和运算模块12;
[0059] 处理模块11,用于在开放运算语言OpenCL框架下,对相乘的第一矩阵和第二矩阵分别进行向量化处理;
[0060] 运算模块12,用于将向量化处理后获得的多个子矩阵进行并行运算。
[0061] 可选地,处理模块11在开放运算语言OpenCL框架下,对相乘的第一矩阵和第二矩阵分别进行向量化处理包括:
[0062] 将第一矩阵中的每一个行向量作为一个行数据块,并将第二矩阵中的每一个列向量作为一个列数据块;
[0063] 分别将任意一个行数据块与任意一个列数据块传入一个kernel函数中,并获取多个kernel函数;其中,每个kernel函数与其中传入的行数据块和列数据块一一对应;
[0064] 对每个kernel函数中的行数据块和列数据块分别进行向量化处理,以获得多个行向量子矩阵和多个列向量子矩阵。
[0065] 可选地,处理模块11对每个kernel函数中的行数据块和列数据块分别进行向量化处理包括:
[0066] 采用OpenCL的Vector数据类型,分别对行数据块中的每n个浮点型数据进行向量化处理以获得多个行向量子矩阵,并且分别对列数据块中的每n个浮点型数据进行向量化处理以获得多个列向量子矩阵,其中,n为正整数。
[0067] 可选地,运算模块12将向量化处理后获得的多个子矩阵进行并行运算包括:
[0068] 在每个kernel函数中,分别将相互对应的行向量子矩阵与列向量子矩阵进行并行相乘。
[0069] 可选地,n=4。
[0070] 本发明实施例方案包括:在开放运算语言OpenCL框架下,对相乘的第一矩阵和第二矩阵分别进行向量化处理;将向量化处理后获得的多个子矩阵进行并行运算。通过本发明实施例的方案,能够在高性能计算平台上实施,充分利用了计算机硬件资源,并且大大缩短了计算时间,提高了运算效率。
[0071] 需要说明的是,以上所述的实施例仅是为了便于本领域的技术人员理解而已,并不用于限制本发明实施例的保护范围,在不脱离本发明实施例的发明构思的前提下,本领域技术人员对本发明实施例所做出的任何显而易见的替换和改进等均在本发明实施例的保护范围之内。