CN118626762A - 一种矩阵读取写出方法和装置 - Google Patents
一种矩阵读取写出方法和装置 Download PDFInfo
- Publication number
- CN118626762A CN118626762A CN202411116529.XA CN202411116529A CN118626762A CN 118626762 A CN118626762 A CN 118626762A CN 202411116529 A CN202411116529 A CN 202411116529A CN 118626762 A CN118626762 A CN 118626762A
- Authority
- CN
- China
- Prior art keywords
- matrix
- block
- external storage
- read
- address
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F17/00—Digital computing or data processing equipment or methods, specially adapted for specific functions
- G06F17/10—Complex mathematical operations
- G06F17/16—Matrix or vector computation, e.g. matrix-matrix or matrix-vector multiplication, matrix factorization
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/30007—Arrangements for executing specific machine instructions to perform operations on data operands
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/3004—Arrangements for executing specific machine instructions to perform operations on memory
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3867—Concurrent instruction execution, e.g. pipeline or look ahead using instruction pipelines
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Mathematical Physics (AREA)
- Mathematical Analysis (AREA)
- Mathematical Optimization (AREA)
- Computational Mathematics (AREA)
- Pure & Applied Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Computing Systems (AREA)
- Algebra (AREA)
- Databases & Information Systems (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
本发明涉及矩阵处理技术领域,提供了一种矩阵读取写出方法和装置。方法包括:当需要将矩阵中的矩阵块读取到各线程中时,线程组整体执行单次矩阵块读取操作,单次矩阵块读取操作包括:获取矩阵块的第一个元素的外部存储地址、矩阵的存储方式以及待写入地址;根据所述矩阵的存储方式和所述第一个元素的外部存储地址,获取矩阵块中各元素的外部存储地址,从各元素的外部存储地址读取各元素,并写入对应的缓存块中;根据所述对应关系,将各缓存块中的元素写入到各线程寄存器的待写入地址位置。本发明通过将线程组中的多个线程的矩阵写入转换为单次的矩阵块写入操作,从而大大缩减各线程矩阵读取中进行位置计算所需要的时间,提高矩阵块读取效率。
Description
技术领域
本发明涉及矩阵处理技术领域,特别是涉及一种矩阵读取写出方法和装置。
背景技术
基于单指令多线程(Single Instruction Multiple Threads,简称为:SIMT)的多核通用处理器被广泛应用到矩阵计算的算法中。一般而言,SIMT处理器会以多个线程为最小处理单元,这多个线程构成线程组,由线程组中的多个线程共同执行处理相关任务。
如图1所示,对于大矩阵乘法计算,通常会将大的矩阵计算分为若干小矩阵块的计算,一个线程组会负责完成一个矩阵块的计算,线程组内的多个线程需要协同工作,一起完成这个矩阵块的计算,如图1中由四个线程组完成矩阵A与矩阵B之间的乘法运算,具体到单个矩阵块时,如图2所示,将矩阵块中的相应元素加载到线程组中的对应线程中(实际是将元素写入到线程的寄存器中),从而使各线程能够对已加载的各个元素进行运算,线程组内的每个线程都会需要矩阵块的一部分元素去完成矩阵计算。如何高效的将矩阵块从外部存储中读取并写入到线程组内的每个线程所对应的寄存器文件中成了一个关键问题。
现有技术中,从外部存储中读取数据到相应线程所使用的方法有两种,分别是使用Sample(简称为:SMP)指令和使用load/store(简称为:LD/ST)指令实现,其中,Sample指令需要将矩阵数据存储在规定的图像对象中,然后通过内建的Sample函数读取每个线程对应的数据。这个需要修改用户的代码,对于大多数应用而言,为了便于中央处理器(CentralProcessing Unit,简称为:CPU)和图形处理器(Graphics Processing Unit,简称为:GPU)共享该矩阵缓存,用户更倾向于将矩阵存储在线性存储结构中,如数组对象中,这就导致Sample指令在使用上存在不便。
LD/ST指令虽然支持将矩阵数据存储到数组对象中,但是在现有的实现方案下,各线程需要各自进行相应所需获取的数据地址的计算,并且要求多个线程的地址能有效合并,如果无法有效合并,则会降低外部存储访问的带宽利用率。并且Sample指令和LD/ST指令无法应对以多种存储方式进行存储的矩阵。
鉴于此,克服该现有技术所存在的缺陷是本技术领域亟待解决的问题。
发明内容
本发明要解决的技术问题是现有技术中,各线程需要各自进行相应所需获取的数据地址的计算,导致矩阵读取写出低下。
本发明采用如下技术方案:
第一方面,本发明提供了一种矩阵读取写出方法,预先建立预设缓存中的各缓存块与线程组中各线程之间的对应关系,其中,第i个缓存块对应第i个线程;当需要将矩阵中的第m个矩阵块读取到各线程中时,线程组整体执行单次矩阵块读取操作,单次矩阵块读取操作包括:
获取第m个矩阵块的第一个元素的外部存储地址、矩阵的存储方式layout以及待写入地址R0;
根据所述矩阵的存储方式layout和所述第一个元素的外部存储地址,获取第m个矩阵块中各元素的外部存储地址,从各元素的外部存储地址读取各元素,并写入对应的缓存块中;
根据所述对应关系,将各缓存块中的元素写入到各线程寄存器的待写入地址R0位置。
优选的,当所述矩阵的存储方式layout为行主序存储时,所述根据所述矩阵的存储方式layout和所述第一个元素的外部存储地址,获取第m个矩阵块中各元素的外部存储地址,从各元素的外部存储地址读取各元素,并写入对应的缓存块中,具体包括:
计算所述第m个矩阵块中的各行的外部起始存储地址row_addr和行大小row_size;
从第row行的外部起始存储地址row_addr读取大小为行大小row_size的数据,将读取得到的数据整体写入到预设缓存中block_buffer[row]位置;
其中,;所述block_buffer[row]位置为第个缓存块到第个缓存块之间的位置;为矩阵中一个元素的大小,为当前所读取的行,大于等于0且小于为第m个矩阵块的总行数,为矩阵的总列数,为第m个矩阵块的总列数。
优选的,所述第m个矩阵块的第一个元素的外部存储地址是根据矩阵的外部存储地址计算得到的,具体包括:
第个矩阵块的第一个元素的外部存储地址;其中,为矩阵中一个元素的大小,为矩阵的总列数,为第m个矩阵块的总列数,为第m个矩阵块的总行数。
优选的,当所述矩阵的存储方式layout为列主序存储时,所述根据所述矩阵的存储方式layout和所述第一个元素的外部存储地址,获取第m个矩阵块中各元素的外部存储地址,从各元素的外部存储地址读取各元素,并写入对应的缓存块中,具体包括:
依次计算所述第m个矩阵块中各元素的起始存储地址elem_addr[i],从元素的起始存储地址elem_addr[i]读取大小为的数据,将读取得到的数据写入预设缓存的第i个缓存块位置;
其中,;为矩阵中一个元素的大小,i代表当前所读取矩阵块中的第i个元素,为第m个矩阵块的总列数,为矩阵的总行数。
优选的,所述第m个矩阵块的第一个元素的外部存储地址是根据矩阵的外部存储地址计算得到的,具体包括:
第个矩阵块的第一个元素的外部存储地址;其中,为矩阵中一个元素的大小,为矩阵的总列数,为矩阵的总行数,为第m个矩阵块的总列数,为第m个矩阵块的总行数。
优选的,当需要将各线程中的元素组成第m个矩阵块写出到外部缓存中时,线程组整体执行单次矩阵块写出操作,单次矩阵块写出操作包括:
获取第m个矩阵块的第一个元素在外部存储中所需写入的外部存储地址、矩阵在外部存储中所需的存储方式layout以及待读取地址R0;
从各线程寄存器的待读取地址R0中读取各元素,根据矩阵在外部存储中所需的存储方式layout和所述第一个元素的外部存储地址,将各元素写入到外部存储的相应位置。
优选的,当所述矩阵在外部存储中所需的存储方式layout为行主序存储时,所述从各线程寄存器的待读取地址R0中读取各元素,根据矩阵在外部存储中所需的存储方式layout和所述第一个元素的外部存储地址,将各元素写入到外部存储的相应位置,具体包括:
从第i个线程寄存器的待读取地址R0位置读取大小为的数据,将读取得到的数据写入到外部存储的out_addr[i]位置;
其中,;为矩阵中一个元素的大小,i代表当前所读取第i个线程寄存器中的元素,为第m个矩阵块的总列数,为矩阵的总列数。
优选的,当所述矩阵在外部存储中所需的存储方式layout为列主序存储时,所述从各线程寄存器的待读取地址R0中读取各元素,根据矩阵在外部存储中所需的存储方式layout和所述第一个元素的外部存储地址,将各元素写入到外部存储的相应位置,具体包括:
从第i个线程寄存器的待读取地址R0位置读取大小为的数据,将读取得到的数据写入到外部存储的out_addr[i]位置;
其中,;为矩阵中一个元素的大小,i代表当前所读取第i个线程寄存器中的元素,为第m个矩阵块的总列数,为矩阵的总行数。
优选的,所述线程组中的多个线程以锁步的形式将线程组中的所有线程捆绑在一起,以使多个线程同步进行元素的读取。
第三方面,本发明还提供了一种矩阵读取写出装置,用于实现第一方面所述的矩阵读取写出方法,所述装置包括:
至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述处理器执行,用于执行第一方面所述的矩阵读取写出方法。
第四方面,本发明还提供了一种非易失性计算机存储介质,所述计算机存储介质存储有计算机可执行指令,该计算机可执行指令被一个或多个处理器执行,用于完成第一方面所述的矩阵读取写出方法。
本发明通过将线程组中的多个线程的矩阵写入转换为单次的矩阵块写入操作,从而大大缩减各线程矩阵读取中进行位置计算所需要的时间,提高矩阵块读取效率。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的一种现有技术中矩阵处理的示意图;
图2是本发明实施例提供的又一种现有技术中矩阵处理的示意图;
图3是本发明实施例提供的一种矩阵读取写出方法的流程示意图;
图4是本发明实施例提供的一种矩阵在线程寄存器中以行主序进行存储的示意图;
图5是本发明实施例提供的一种矩阵在线程寄存器中以列主序进行存储的示意图;
图6是本发明实施例提供的一种矩阵在外部存储中以行主序进行存储的示意图;
图7是本发明实施例提供的一种矩阵在外部存储中以列主序进行存储的示意图;
图8是本发明实施例提供的又一种矩阵读取写出方法的流程示意图;
图9是本发明实施例提供的再一种矩阵读取写出方法的流程示意图;
图10是本发明实施例提供的一种矩阵读取写出方法中各参数含义的示意图;
图11是本发明实施例提供的一种现有技术中的流水线架构示意图;
图12是本发明实施例提供的一种流水线架构示意图;
图13是本发明实施例提供的一种使用矩阵读取写出方法进行矩阵计算的示意图;
图14是本发明实施例提供的一种矩阵处理模块的架构示意图;
图15是本发明实施例提供的一种矩阵读取写出装置的架构示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明中术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”等的特征可以明示或者隐含地包括一个或者更多个该特征。在本申请的描述中,除非另有说明,“多个”的含义是两个或两个以上。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
本发明实施例提供了一种矩阵读取写出方法,预先建立预设缓存中的各缓存块与线程组中各线程之间的对应关系,其中,第i个缓存块对应第i个线程;当需要将矩阵中的第m个矩阵块读取到各线程中时,线程组整体执行单次矩阵块读取操作,如图3所示,单次矩阵块读取操作包括:
在步骤201中,获取第m个矩阵块的第一个元素的外部存储地址、矩阵的存储方式layout以及待写入地址R0;所述存储方式layout包括行主序存储、列主序存储和块线性存储中的一种或多种。行主序存储在实际使用中也被称作row major,列主序存储在实际使用中也被称作column major,块线性存储在实际使用中也被称作block-linear。其中,所述线程组整体执行单次矩阵读取操作可以是由线程组中的一个线程执行矩阵读取操作,也可以是为线程组添加额外的管理线程,由该管理线程执行矩阵读取操作。所述第一个元素的外部存储地址、矩阵的存储方式layout以及待写入地址R0均携带在相应指令中进行获取,如携带在矩阵块读取指令中,其中,所述矩阵块读取指令中还可能携带有第m个矩阵块的总列数,第m个矩阵块的总行数,矩阵的总行数,矩阵的总列数。其中,m为整数,m大于等于0且小于矩阵中矩阵块的总数量。在此需要说明的是,此处的第m个矩阵块仅仅为了从用户所需读取到线程中的多个矩阵块中突出表述某一个矩阵块而使用的,并非代表在相应排列顺序下的m个对象,在实际使用中,矩阵块的总列数和总行数由本领域技术人员根据需求以及线程组中线程数量的大小分析得到,对于一个矩阵而言,矩阵块的总列数和总行数可以有多种组合,在本实施例中不做限定。
在步骤202中,根据所述矩阵的存储方式layout和所述第一个元素的外部存储地址,获取第m个矩阵块中各元素的外部存储地址,从各元素的外部存储地址读取各元素,并写入对应的缓存块中;由于不同存储方式对应矩阵块中各元素在存储中的排列可能不同,故而先读取矩阵块中的元素到缓存块中。
在步骤203中,根据所述对应关系,将各缓存块中的元素写入到各线程寄存器的待写入地址R0位置。即把一个矩阵块中的各元素写入到同一个线程组中不同线程的线程寄存器的同一地址。
其中,每一个线程对应一个线程寄存器,线程组中各线程的线程寄存器具有相同的地址排列,即当第一个线程寄存器的地址为R1位置时,则线程组中其他线程的线程寄存器的地址同样为R1。
本实施例通过将线程组中的多个线程的矩阵写入转换为单次的矩阵块写入操作,从而大大缩减各线程矩阵读取中进行位置计算所需要的线程寄存器资源和处理器计算单元,提高矩阵块读取效率。
在实际使用场景下,当所述矩阵的存储方式layout为行主序存储时,所述根据所述矩阵的存储方式layout和所述第一个元素的外部存储地址,获取第m个矩阵块中各元素的外部存储地址,从各元素的外部存储地址读取各元素,并写入对应的缓存块中,具体包括:
计算所述第m个矩阵块中的各行的外部起始存储地址row_addr和行大小row_size。
从第row行的外部起始存储地址row_addr读取大小为行大小row_size的数据,将读取得到的数据整体写入到预设缓存中block_buffer[row]位置;
其中,;所述block_buffer[row]位置为第个缓存块到第个缓存块之间的位置(包括第个缓存块和第个缓存块);为矩阵中一个元素的大小,为当前所读取的行,大于等于0且小于为第m个矩阵块的总行数,为矩阵的总列数,为第m个矩阵块的总列数。
其中,所述第m个矩阵块的第一个元素的外部存储地址可以是由本领域技术人员根据需求分析得到的,也可由本领域技术人员预先按照分块的方式指定得到的,也可以是由矩阵块的排列计算得到的,即所述第m个矩阵块的第一个元素的外部存储地址是根据矩阵的外部存储地址计算得到的,具体包括:
第个矩阵块的第一个元素的外部存储地址;其中,为矩阵中一个元素的大小,为矩阵的总列数,为第m个矩阵块的总列数,为第m个矩阵块的总行数。在本实施例中,类似的表述代表a整除b所得的值,类似的表述代表a对b进行求余运算。
当所述矩阵的存储方式layout为列主序存储时,所述根据所述矩阵的存储方式layout和所述第一个元素的外部存储地址,获取第m个矩阵块中各元素的外部存储地址,从各元素的外部存储地址读取各元素,并写入对应的缓存块中,具体包括:
依次计算所述第m个矩阵块中各元素的起始存储地址elem_addr[i],从元素的起始存储地址elem_addr[i]读取大小为的数据,将读取得到的数据写入预设缓存的第i个缓存块位置。
其中,;为矩阵中一个元素的大小,i代表当前所读取矩阵块中的第i个元素,为第m个矩阵块的总列数,为矩阵的总行数。
其中,所述第m个矩阵块的第一个元素的外部存储地址可以是由本领域技术人员预先对矩阵划分矩阵块时指定得到的,也可以是由矩阵块的排列计算得到的,即所述第m个矩阵块的第一个元素的外部存储地址是根据矩阵的外部存储地址计算得到的,具体包括:
第个矩阵块的第一个元素的外部存储地址;其中,为矩阵中一个元素的大小,为矩阵的总列数,为矩阵的总行数,为第m个矩阵块的总列数,为第m个矩阵块的总行数。
在实际使用中,还可分别指定外部存储地址中矩阵的存储方式src_layout,以及在矩阵中的值在各线程寄存器中的排列方式dst_layout,在该实施方式下,所对应的矩阵读取方法可能存在四种组合,即外部存储地址中和线程寄存器中均为行主序;外部存储地址中和线程寄存器中均为列主序;外部存储地址中为行主序,线程寄存器中为列主序;外部存储地址中为列主序,线程寄存器中为行主序。
其中,在线程寄存器中,行主序形式存储如图4所示,其中,T0至T15分别代表对应的线程寄存器,矩阵中的各元素按照如图4中箭头所示方向分别存储到各线程寄存器中,即按照各行依次存储,将4×4矩阵中的第一行的各元素依次存储到线程寄存器T0至T3中,第二行的各元素依次存储到线程寄存器T4至T7中,依次类推;而在线程寄存器中,列主序形式存储如图5所示,其中,T0至T15分别代表对应的线程寄存器,矩阵中的各元素按照如图5中箭头所示方向分别存储到各线程寄存器中,即按照各行依次存储,将4×4矩阵中的第一列的各元素依次存储到线程寄存器T0至T3中,第二列的各元素依次存储到线程寄存器T4至T7中,依次类推。
在外部存储地址中,行主序形式存储如图6所示,以0位置作为矩阵的存储起始位置,则矩阵第一行的n-1个元素存储到外部存储地址的0至n-1地址位置,矩阵第二行的n-1个元素存储到外部存储地址的n至2n-1地址位置,依次类推;而在外部存储地址中,列主序形式存储如图7所示,以0位置作为矩阵的存储起始位置,则矩阵第一列的n-1个元素存储到外部存储地址的0至n-1地址位置,矩阵第二列的n-1个元素存储到外部存储地址的n至2n-1地址位置,依次类推。
在本实施例中仅对外部存储地址中和预设缓存中均为行主序,以及外部存储地址中为列主序,预设缓存中为行主序这两种情况进行了具体阐述,而在实际使用中,外部存储地址中和预设缓存中均为列主序的情况可直接按照地址顺序对应存储,外部存储地址中为行主序,预设缓存中为列主序的情况则可先按照行主序读取外部存储地址中的元素,再按照列主序的方式将元素写入预设缓存,其中按照列主序的方式存储元素的方法与下述矩阵块写入的实施方式基于同一构思。
所需读取的矩阵块的数量m还可根据在宽度方向需要继续读取的矩阵块的数目burst_x以及在高度方向需要继续读取的矩阵块的数目burst_y计算得到,此时,对应所使用的矩阵块读取指令可以是load_matrix.src_layout.dst_layout.height.width.src_type.dst_typedst, addr, stride, burst_x, burst_y;其中,src_type为外部存储地址中元素的存储类型,dst_type为预设缓存中元素的存储类型(也即线程寄存器中元素的存储类型)。dst为待写入地址,addr为第m个矩阵块的第一个元素的外部存储地址,即,当src_type为行主序时,stride为上述,当src_type为列主序时,stride为上述。
在实际使用中,所述方法还包括:当需要将各线程中的元素组成第m个矩阵块写出到外部缓存中时,线程组整体执行单次矩阵块写出操作,如图8所示,单次矩阵块写出操作包括:
在步骤301中,获取第m个矩阵块的第一个元素在外部存储中所需写入的外部存储地址、矩阵在外部存储中所需的存储方式layout以及待读取地址R0。
在步骤302中,从各线程寄存器的待读取地址R0中读取各元素,根据矩阵在外部存储中所需的存储方式layout和所述第一个元素的外部存储地址,将各元素写入到外部存储的相应位置。
在此需要说明的是,本实施例中所述的矩阵读取是指从外部存储中读取矩阵,将矩阵写入到线程的寄存器中,而矩阵写出则是指从线程的寄存器中读取矩阵的值,将矩阵的值写入到外部存储中。
其中,当所述矩阵在外部存储中所需的存储方式layout为行主序存储时,所述从各线程寄存器的待读取地址R0中读取各元素,根据矩阵在外部存储中所需的存储方式layout和所述第一个元素的外部存储地址,将各元素写入到外部存储的相应位置,具体包括:
从第i个线程寄存器的待读取地址R0位置读取大小为的数据,将读取得到的数据写入到外部存储的out_addr[i]位置。
其中,;为矩阵中一个元素的大小,i代表当前所读取第i个线程寄存器中的元素,为第m个矩阵块的总列数,为矩阵的总列数。
当所述矩阵在外部存储中所需的存储方式layout为列主序存储时,所述从各线程寄存器的待读取地址R0中读取各元素,根据矩阵在外部存储中所需的存储方式layout和所述第一个元素的外部存储地址,将各元素写入到外部存储的相应位置,具体包括:
从第i个线程寄存器的待读取地址R0位置读取大小为的数据,将读取得到的数据写入到外部存储的out_addr[i]位置。
其中,;为矩阵中一个元素的大小,i代表当前所读取第i个线程寄存器中的元素,为第m个矩阵块的总列数,为矩阵的总行数。
在实际使用中所使用的矩阵块写出指令可以是store_matrix.src_layout.dst_layout.height.width.src_type.dst_typedst, addr, stride, burst_x, burst_y;其中,dst为存储有矩阵的寄存器地址,addr为是需要将矩阵写出的外部存储地址,其他各参数的含义与矩阵块读取指令一致。
为了确保多个线程进行矩阵读取仅需执行单次矩阵块读取操作,所述线程组中的多个线程以锁步的形式将线程组中的所有线程捆绑在一起,以使多个线程同步进行元素的读取,具体的:
线程组内的所有线程是以锁步(lock step)的形式捆绑在一起执行的,即由线程组发送单条指令,实际硬件中,是指挥收取到一条矩阵元素读取指令,然后硬件为每个线程执行该指令,获取元素。线程组仍然发送一条指令,只是这条指令是线程组的指令。
还存在一种可选的实施方式为:所述矩阵块读取操作是由接收来自各线程的矩阵块读取指令控制实现的,如图9所示,具体包括:
在步骤401中,当初次接收到来自相应线程的第一矩阵块读取指令时,执行第一矩阵块读取操作,并将所述第一矩阵块读取指令中的参数存储到读指令表项中,在后续接收到第二矩阵块读取指令时,将所述第二矩阵块读取指令的参数与所述读指令表项中的参数相比对,以判断所述第二矩阵块读取指令是否与所述第一矩阵块读取指令相同,若相同,则丢弃所述第二矩阵块读取指令;若不相同,则认为是不同指令,执行第二矩阵块读取指令,并对应执行写入读指令表项的操作。
在步骤402中,在将各数据写入至各线程寄存器后,删除所述读指令表项中的对应矩阵块读取指令。
基于同一构思,所述矩阵块写出操作同样是由接收来自各线程的矩阵块写出指令控制实现的,具体包括:
当初次接收到来自相应线程的第一矩阵块写出指令时,执行第一矩阵块写出操作,并将所述第一矩阵块写出指令中的参数存储到写指令表项中,在后续接收到第二矩阵块写出指令时,将所述第二矩阵块写出指令的参数与所述指令表项中的参数相比对,以判断所述第二矩阵块写出指令是否与所述第一矩阵块写出指令相同,若相同,则丢弃所述第二矩阵块写出指令。
在将各数据写入至各线程寄存器后,删除所述指令表项中的对应矩阵块写出指令。
本发明基于上述实施例所描述的方法基础上,结合具体的应用场景,并借由相关场景下的技术表述来阐述本发明特性场景下的实现过程。
本实施例首先提供以下两种指令:
第一种:矩阵块读取指令,具体表现形式为:load_matrix.src_layout.dst_layout.height.width.src_type.dst_typedst, addr, stride, burst_x, burst_y。
第二种:矩阵块写出指令,具体表现形式为:
store_matrix.src_layout.dst_layout.height.width.src_type.dst_typedst,addr, stride, burst_x, burst_y。
在上述矩阵块读取指令和矩阵块写出指令中,Layout(包括src_layout和dst_layout)用于指示矩阵的存储方式,包括行主序(row major)和列主序(column major)两种。
height指示需要读取的矩阵块的高度,即矩阵块的总行数。
width指示需要读取的矩阵块的宽度,即矩阵块的总列数。
src_type用于指示矩阵中元素的存储类型,可以是int8,int16, fp16, fp32等。
dst_type用于指示需要存储在寄存器中的矩阵块的元素存储类型,也可以是int8,int16,fp16,fp32等。
dst指示需要用于存储的寄存器地址。
addr存储了所要读取的矩阵块的第一个元素的地址。
burst_x代表在宽度方向需要继续读取的矩阵块的数目,如图10所示时,burst_x=2。
burst_y代表在高度方向需要继续读取的矩阵块的数目,如图10所示时,burst_x=2。
如图10所示为存储方式为行主序的矩阵的示意图。对于行主序的矩阵,stride是源矩阵中一行的元素的数目;而对于列主序的矩阵而言,stride是源矩阵中一列的元素的数目。
下面以将行主序的矩阵读取到各线程寄存器中举例而言,其执行过程可表现为以下伪代码:
block_base = base_addr + offset;//block_base即上述实施例中的对应block_base[m];
Row_size = width * elem_size;
Block_buffer[4][4];
For ( row = 0; row<height; row ++){
row_addr = block_base + row * stride* elem_size;
Load( block_buffer[row], row_addr, row_size);//将row_addr位置开始,长度为row_size的数据写入到block_buffer[row]中。
}
等矩阵块内的所有行的数据都返回后,将整个矩阵块写入到该线程组的寄存器中,可表现为以下伪代码:
thread0.ri = block_buffer[0][0];//将各缓存块中的元素写入到线程寄存器的ri(即dst)位置。
Thread1.ri = block_buffer[0][1];
…
Thread3.ri = block_buffer[0][3];
Thread4.ri = block_buffer[1][0];
..
Thread7.ri = block_buffer[1][3];
…
Thread15.ri = block_buffer[3][3];
其中,
offset是当前索要读取的矩阵块相对于矩阵的首地址的地址偏移。
base_addr是存储整个矩阵的起始地址。
stride是整个矩阵的行宽。
elem_size是每个矩阵中元素的字节数目。
为了实现上述功能,并不占用现有各线程的资源,本实施例还相对现有技术从架构上进行了改进,如图11为现有技术中常见的计算核内的流水线架构。
本实施例在现有技术的基础上添加了矩阵处理模块(也称作Matrix AccessPipeline),如图12所示,用于执行上述load_matrix(也称作matrix_load)指令和store_matrix(也称作matrix_store)指令,matrix load 和matrix store 指令所需要的控制寄存器都来自于group register file,不需要使用thread register file,可以大大减少thread register file 的访问,使用上述load_matrix指令和store_matrix指令完成矩阵计算的过程如图13所示,通过使用matrix_load指令,将矩阵a和矩阵b中的元素对应读取到线程组中的各线程中,由各线程进行元素之间的运算,得到矩阵C中的各个元素,再通过matrix_store指令,将线程中已经计算得到的矩阵C中的各个元素写入到外部存储中,并使写入到外部存储中的各元素以矩阵的形式存储,从而得到完整的矩阵C,实现完整的矩阵运算过程。所述矩阵处理模块用于矩阵读取写出装置中,以实现上述实施例中所述的矩阵读取写出方法(即load_matrix指令和store_matrix指令)。
另外,Matrix Access Pipeline会根据指令中提供的信息,计算矩阵块中的每一行或者每一列的地址,发送到memory subsystem 中读取对应的数据,等矩阵块的所有数据都返回后,会根据指令定义的要求,可以实现format转换和transpose操作。按照指令需要的dst_layout写入到thread register file中。
所述矩阵处理模块(在图14中表现为矩阵访问流水线)在实际使用中可以如图14所示,包括指令操作数读取模块、循环控制模块(也被称作burst循环控制模块)、块请求循环控制模块(也被称作block请求循环控制模块)、数据返回打包模块、寄存器写控制模块,并以线程组寄存器作为预设缓存。
其中,指令操作数读取模块接受来自指令发射模块的指令,解析指令,并根据指令中操作数的来源从线程组寄存器或者线程寄存器中读取对应的操作数,主要的操作数在指令定义中有描述。
指令操作数读取完成之后,根据指令中burst_x和burst _y字段控制该指令是读取一个还是多个矩阵块,如果需要读取多个矩阵块,burst循环控制模块负责将指令拆分乘多个读取/写出一个矩阵块的指令,这样后续模块只需要处理单个矩阵块的load/store操作。
Block请求循环控制模块接受上游拆解之后的单block的matrix load store指令,需要进一步根据矩阵在memory buffer中的layout来判断是需要逐行处理或者逐列处理。逐行处理的地址计算公式在上面描述中。
对于matrix store指令,block请求循环控制模块会发送矩阵块的每一行或者每一列写出到外部存储系统中。
对于matrix load指令,则只需要发送矩阵块中每一行或者每一列的地址出去。矩阵块的所有请求都发送出去之后,需要等矩阵块对应的数据返回之后,打包写入到指令中指定的寄存器中。
寄存器写控制负责将打包后的矩阵数据写入到指定线程的地址中。每个线程的寄存器文件都会有对应的写端口,根据之前定义的矩阵块和线程的对应关系,将数据写入到对应线程的接口即可。
如图15所示,是本发明实施例的矩阵读取写出装置的架构示意图。本实施例的矩阵读取写出装置包括一个或多个处理器21以及存储器22。其中,图15中以一个处理器21为例。
处理器21和存储器22可以通过总线或者其他方式连接,图15中以通过总线连接为例。
存储器22作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序和非易失性计算机可执行程序,如上述实施例中的矩阵读取写出方法。处理器21通过运行存储在存储器22中的非易失性软件程序和指令,从而执行矩阵读取写出方法。
存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器22可选包括相对于处理器21远程设置的存储器,这些远程存储器可以通过网络连接至处理器21。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
所述程序指令/模块存储在所述存储器22中,当被所述一个或者多个处理器21执行时,执行上述实施例中的矩阵读取写出方法。
值得说明的是,上述装置和系统内的模块、单元之间的信息交互、执行过程等内容,由于与本发明的处理方法实施例基于同一构思,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。
本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取存储器(RAM,Random AccessMemory)、磁盘或光盘等。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种矩阵读取写出方法,其特征在于,预先建立预设缓存中的各缓存块与线程组中各线程之间的对应关系,其中,第i个缓存块对应第i个线程;当需要将矩阵中的第m个矩阵块读取到各线程中时,线程组整体执行单次矩阵块读取操作,所述单次矩阵块读取操作包括:
获取第m个矩阵块的第一个元素的外部存储地址、矩阵的存储方式layout以及待写入地址R0;
根据所述矩阵的存储方式layout和所述第一个元素的外部存储地址,获取第m个矩阵块中各元素的外部存储地址,从各元素的外部存储地址读取各元素,并写入对应的缓存块中;
根据所述对应关系,将各缓存块中的元素写入到各线程寄存器的待写入地址R0位置。
2.根据权利要求1所述的矩阵读取写出方法,其特征在于,当所述矩阵的存储方式layout为行主序存储时,所述根据所述矩阵的存储方式layout和所述第一个元素的外部存储地址,获取第m个矩阵块中各元素的外部存储地址,从各元素的外部存储地址读取各元素,并写入对应的缓存块中包括:
计算所述第m个矩阵块中的各行的外部起始存储地址row_addr和行大小row_size;
从第row行的外部起始存储地址row_addr读取大小为行大小row_size的数据,将读取得到的数据整体写入到预设缓存中block_buffer[row]位置;
其中,;所述block_buffer[row]位置为第个缓存块到第个缓存块之间的位置;为矩阵中一个元素的大小,为当前所读取的行,大于等于0且小于,为第m个矩阵块的总行数,为矩阵的总列数,为第m个矩阵块的总列数。
3.根据权利要求2所述的矩阵读取写出方法,其特征在于,所述第m个矩阵块的第一个元素的外部存储地址是根据矩阵的外部存储地址计算得到的,包括:
第个矩阵块的第一个元素的外部存储地址;其中,为矩阵中一个元素的大小,为矩阵的总列数,为第m个矩阵块的总列数,为第m个矩阵块的总行数。
4.根据权利要求1所述的矩阵读取写出方法,其特征在于,当所述矩阵的存储方式layout为列主序存储时,所述根据所述矩阵的存储方式layout和所述第一个元素的外部存储地址,获取第m个矩阵块中各元素的外部存储地址,从各元素的外部存储地址读取各元素,并写入对应的缓存块中,包括:
依次计算所述第m个矩阵块中各元素的起始存储地址elem_addr[i],从元素的起始存储地址elem_addr[i]读取大小为的数据,将读取得到的数据写入预设缓存的第i个缓存块位置;
其中,;为矩阵中一个元素的大小,i代表当前所读取矩阵块中的第i个元素,为第m个矩阵块的总列数,为矩阵的总行数。
5.根据权利要求4所述的矩阵读取写出方法,其特征在于,所述第m个矩阵块的第一个元素的外部存储地址是根据矩阵的外部存储地址计算得到的,包括:
第个矩阵块的第一个元素的外部存储地址;其中,为矩阵中一个元素的大小,为矩阵的总列数,为矩阵的总行数,为第m个矩阵块的总列数,为第m个矩阵块的总行数。
6.根据权利要求1所述的矩阵读取写出方法,其特征在于,当需要将各线程中的元素组成第m个矩阵块写出到外部缓存中时,线程组整体执行单次矩阵块写出操作,所述单次矩阵块写出操作包括:
获取第m个矩阵块的第一个元素在外部存储中所需写入的外部存储地址、矩阵在外部存储中所需的存储方式layout以及待读取地址R0;
从各线程寄存器的待读取地址R0中读取各元素,根据矩阵在外部存储中所需的存储方式layout和所述第一个元素的外部存储地址,将各元素写入到外部存储的相应位置。
7.根据权利要求6所述的矩阵读取写出方法,其特征在于,当所述矩阵在外部存储中所需的存储方式layout为行主序存储时,所述从各线程寄存器的待读取地址R0中读取各元素,根据矩阵在外部存储中所需的存储方式layout和所述第一个元素的外部存储地址,将各元素写入到外部存储的相应位置,包括:
从第i个线程寄存器的待读取地址R0位置读取大小为的数据,将读取得到的数据写入到外部存储的out_addr[i]位置;
其中,;为矩阵中一个元素的大小,i代表当前所读取第i个线程寄存器中的元素,为第m个矩阵块的总列数,为矩阵的总列数。
8.根据权利要求6所述的矩阵读取写出方法,其特征在于,当所述矩阵在外部存储中所需的存储方式layout为列主序存储时,所述从各线程寄存器的待读取地址R0中读取各元素,根据矩阵在外部存储中所需的存储方式layout和所述第一个元素的外部存储地址,将各元素写入到外部存储的相应位置,包括:
从第i个线程寄存器的待读取地址R0位置读取大小为的数据,将读取得到的数据写入到外部存储的out_addr[i]位置;
其中,;为矩阵中一个元素的大小,i代表当前所读取第i个线程寄存器中的元素,为第m个矩阵块的总列数,为矩阵的总行数。
9.根据权利要求1至8中任一项所述的矩阵读取写出方法,其特征在于,所述线程组中的多个线程以锁步的形式将线程组中的所有线程捆绑在一起,以使多个线程同步进行元素的读取。
10.一种矩阵读取写出装置,其特征在于,包括:
至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述处理器执行,用于执行权利要求1至9中任一项所述的矩阵读取写出方法。
Priority Applications (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| CN202411116529.XA CN118626762B (zh) | 2024-08-15 | 2024-08-15 | 一种矩阵读取写出方法和装置 |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| CN202411116529.XA CN118626762B (zh) | 2024-08-15 | 2024-08-15 | 一种矩阵读取写出方法和装置 |
Publications (2)
| Publication Number | Publication Date |
|---|---|
| CN118626762A true CN118626762A (zh) | 2024-09-10 |
| CN118626762B CN118626762B (zh) | 2024-12-03 |
Family
ID=92609051
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| CN202411116529.XA Active CN118626762B (zh) | 2024-08-15 | 2024-08-15 | 一种矩阵读取写出方法和装置 |
Country Status (1)
| Country | Link |
|---|---|
| CN (1) | CN118626762B (zh) |
Citations (10)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| KR20070108827A (ko) * | 2006-05-08 | 2007-11-13 | 엔비디아 코포레이션 | 감소된 대역폭 요건들을 갖는 행렬 곱셈 |
| WO2013097223A1 (zh) * | 2011-12-31 | 2013-07-04 | 中国科学院自动化研究所 | 多粒度并行存储系统与存储器 |
| US20190042195A1 (en) * | 2017-11-21 | 2019-02-07 | Intel IP Corporation | Scalable memory-optimized hardware for matrix-solve |
| US20190295631A1 (en) * | 2016-05-18 | 2019-09-26 | Sitaram Yadavalli | Method and apparatus for storing and accessing matrices and arrays by columns and rows in a processing unit |
| EP3757821A1 (en) * | 2019-06-26 | 2020-12-30 | Beijing Baidu Netcom Science and Technology Co., Ltd. | Apparatus and method for transforming matrix, and dataprocessing system |
| CN112506567A (zh) * | 2020-11-27 | 2021-03-16 | 海光信息技术股份有限公司 | 数据读取方法和数据读取电路 |
| US20210334648A1 (en) * | 2020-04-28 | 2021-10-28 | Advanced Micro Devices, Inc. | Statically Generated Compiled Representations for Processing Data in Neural Networks |
| CN114327244A (zh) * | 2020-09-30 | 2022-04-12 | 华为技术有限公司 | 数据迁移的方法、装置、处理器和计算设备 |
| CN114491402A (zh) * | 2022-01-20 | 2022-05-13 | 北京科技大学 | 一种稀疏矩阵向量乘访存优化的计算方法 |
| CN116150055A (zh) * | 2022-12-09 | 2023-05-23 | 中国科学院空天信息创新研究院 | 基于片上缓存的数据访问方法、装置及转置方法和装置 |
-
2024
- 2024-08-15 CN CN202411116529.XA patent/CN118626762B/zh active Active
Patent Citations (10)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| KR20070108827A (ko) * | 2006-05-08 | 2007-11-13 | 엔비디아 코포레이션 | 감소된 대역폭 요건들을 갖는 행렬 곱셈 |
| WO2013097223A1 (zh) * | 2011-12-31 | 2013-07-04 | 中国科学院自动化研究所 | 多粒度并行存储系统与存储器 |
| US20190295631A1 (en) * | 2016-05-18 | 2019-09-26 | Sitaram Yadavalli | Method and apparatus for storing and accessing matrices and arrays by columns and rows in a processing unit |
| US20190042195A1 (en) * | 2017-11-21 | 2019-02-07 | Intel IP Corporation | Scalable memory-optimized hardware for matrix-solve |
| EP3757821A1 (en) * | 2019-06-26 | 2020-12-30 | Beijing Baidu Netcom Science and Technology Co., Ltd. | Apparatus and method for transforming matrix, and dataprocessing system |
| US20210334648A1 (en) * | 2020-04-28 | 2021-10-28 | Advanced Micro Devices, Inc. | Statically Generated Compiled Representations for Processing Data in Neural Networks |
| CN114327244A (zh) * | 2020-09-30 | 2022-04-12 | 华为技术有限公司 | 数据迁移的方法、装置、处理器和计算设备 |
| CN112506567A (zh) * | 2020-11-27 | 2021-03-16 | 海光信息技术股份有限公司 | 数据读取方法和数据读取电路 |
| CN114491402A (zh) * | 2022-01-20 | 2022-05-13 | 北京科技大学 | 一种稀疏矩阵向量乘访存优化的计算方法 |
| CN116150055A (zh) * | 2022-12-09 | 2023-05-23 | 中国科学院空天信息创新研究院 | 基于片上缓存的数据访问方法、装置及转置方法和装置 |
Also Published As
| Publication number | Publication date |
|---|---|
| CN118626762B (zh) | 2024-12-03 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| US10346507B2 (en) | Symmetric block sparse matrix-vector multiplication | |
| KR102123633B1 (ko) | 행렬 연산 장치 및 방법 | |
| US7836116B1 (en) | Fast fourier transforms and related transforms using cooperative thread arrays | |
| US7640284B1 (en) | Bit reversal methods for a parallel processor | |
| CN115640052B (zh) | 用于图形处理器中多核多流水线并行执行优化方法 | |
| US6804771B1 (en) | Processor with register file accessible by row column to achieve data array transposition | |
| WO2024169293A1 (zh) | 计算核、加速器、计算方法、装置、设备、非易失性可读存储介质及系统 | |
| CN116795542A (zh) | 一种基于GPU的后量子密码Kyber并行加速方法 | |
| CN118278474A (zh) | 一种基于多核处理器的三维卷积并行计算方法、装置和设备 | |
| CN118939317A (zh) | 基于Atlas800服务器平台的单精度矩阵乘法计算方法 | |
| EP3447690A1 (en) | Maxout layer operation apparatus and method | |
| CN118519768A (zh) | 向共享缓存进行数据溢出的方法、装置、设备和存储介质 | |
| CN117891774A (zh) | 面向向量加速器的算子设计优化方法、装置、设备及介质 | |
| WO2022068328A1 (zh) | 数据迁移的方法、装置、处理器和计算设备 | |
| CN110515872B (zh) | 直接内存存取方法、装置、专用计算芯片及异构计算系统 | |
| CN118626762A (zh) | 一种矩阵读取写出方法和装置 | |
| CN118760472B (zh) | 处理器、芯片产品、计算机设备及操作数获取方法 | |
| JPH0798663A (ja) | 非同期i/o制御方式 | |
| CN119718422A (zh) | 规约计算方法、引擎、计算机设备、存储介质及程序产品 | |
| Guo et al. | Fused DSConv: Optimizing sparse CNN inference for execution on edge devices | |
| CN116804915A (zh) | 基于存储器的数据交互方法、处理器、设备以及介质 | |
| JP6881579B2 (ja) | データロードプログラム、データロード方法およびデータロード装置 | |
| CN114860169A (zh) | 一种片上sram阵列存储装置及ai神经网络图像数据存储方法 | |
| CN116185497B (zh) | 命令解析方法、装置、计算机设备和存储介质 | |
| CN118860369B (zh) | 代码并行化方法、装置、计算机设备、可读存储介质和程序产品 |
Legal Events
| Date | Code | Title | Description |
|---|---|---|---|
| PB01 | Publication | ||
| PB01 | Publication | ||
| SE01 | Entry into force of request for substantive examination | ||
| SE01 | Entry into force of request for substantive examination | ||
| GR01 | Patent grant | ||
| GR01 | Patent grant |