CN117785759B - 数据存储方法、数据读取方法、电子设备和存储介质 - Google Patents

数据存储方法、数据读取方法、电子设备和存储介质 Download PDF

Info

Publication number
CN117785759B
CN117785759B CN202410218124.0A CN202410218124A CN117785759B CN 117785759 B CN117785759 B CN 117785759B CN 202410218124 A CN202410218124 A CN 202410218124A CN 117785759 B CN117785759 B CN 117785759B
Authority
CN
China
Prior art keywords
memory block
bank
sequence number
logical
dimension
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.)
Active
Application number
CN202410218124.0A
Other languages
English (en)
Other versions
CN117785759A (zh
Inventor
请求不公布姓名
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shanghai Bi Ren Technology Co ltd
Beijing Bilin Technology Development Co ltd
Original Assignee
Shanghai Bi Ren Technology Co ltd
Beijing Bilin Technology Development Co ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Shanghai Bi Ren Technology Co ltd, Beijing Bilin Technology Development Co ltd filed Critical Shanghai Bi Ren Technology Co ltd
Priority to CN202410218124.0A priority Critical patent/CN117785759B/zh
Publication of CN117785759A publication Critical patent/CN117785759A/zh
Application granted granted Critical
Publication of CN117785759B publication Critical patent/CN117785759B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Abstract

一种数据存储方法、数据读取方法、电子设备和存储介质。该数据存储方法和数据读取方法包括:获取包括多个元素的张量的维度信息和用于存储张量的多个内存块的参数信息;根据维度信息和参数信息确定数据交换粒度值M;根据维度信息和参数信息确定多个元素将要存储到多个内存块中时,每个元素对应的内存块的逻辑内存块序号;根据数据交换粒度值M和逻辑内存块序号计算每个元素对应的内存块的物理内存块序号。该数据存储方法还包括根据物理内存块序号将多个元素存储到多个内存块中。该数据读取方法还包括根据物理内存块序号从多个内存块中读取多个元素。该数据存储方法和数据读取方法可以避免发生内存块冲突,提升人工智能芯片的数据存储和读取性能。

Description

数据存储方法、数据读取方法、电子设备和存储介质
技术领域
本公开的实施例涉及一种数据存储方法、数据读取方法、电子设备和存储介质,尤其涉及人工智能芯片领域的大规模数据存储和读取。
背景技术
高带宽内存(High Bandwidth Memory,HBM)是一种先进的内存技术,通常用于高性能计算、图形处理器和其他需要大规模数据并行处理的领域。HBM内存具有很高的带宽和低能耗,因此在大规模数据处理和高性能计算任务中具有很好的性能表现。在存取数据时,可以先将数据按照读写顺序摆放好在HBM中,然后再将数据存放进缓冲区(buffer)中。目前的数据存储主要采用分体存储方式,即采用多个内存块(bank)并行存取数据,内存块是指缓冲区或内存中可以同时访问的同等大小的块。
然而,当两个或更多线程在同一时钟周期内尝试访问同一个内存块的不同地址时,硬件可能无法并行处理这些请求,就会发生bank冲突。bank冲突会增加内存访问的延迟,降低读写效率,从而严重影响系统性能。bank冲突在需要大量数据存储和读取的人工智能领域尤其明显。
发明内容
本公开至少一实施例提供一种数据存储方法,所述数据存储方法包括:获取包括多个元素的张量的维度信息和用于存储所述张量的多个内存块的参数信息;根据所述维度信息和所述参数信息确定数据交换粒度值M;根据所述维度信息和所述参数信息确定所述多个元素将要存储到所述多个内存块中时,每个元素对应的内存块的逻辑内存块序号logical_bank_id;根据所述数据交换粒度值M和所述逻辑内存块序号logical_bank_id计算每个元素对应的内存块的物理内存块序号physical_bank_id;根据所述物理内存块序号physical_bank_id将所述多个元素存储到所述多个内存块中。
本公开至少一实施例还提供一种数据读取方法,所述数据读取方法包括:获取包括多个元素的张量的维度信息和用于存储所述张量的多个内存块的参数信息;根据所述维度信息和所述参数信息确定数据交换粒度值M;根据所述维度信息和所述参数信息确定所述多个元素将要存储到所述多个内存块中时,每个元素对应的内存块的逻辑内存块序号logical_bank_id;根据所述数据交换粒度值M和所述逻辑内存块序号logical_bank_id计算每个元素对应的内存块的物理内存块序号physical_bank_id;根据所述物理内存块序号physical_bank_id从所述多个内存块中读取所述多个元素。
例如,在本公开至少一实施例提供的方法中,所述维度信息包括所述张量的多个维度的大小和元素长度,所述参数信息包括内存块数量和内存块宽度。
例如,本公开至少一实施例提供的方法还包括:根据所述维度信息确定每个元素的元素序号element_id。
例如,在本公开至少一实施例提供的方法中,所述根据所述数据交换粒度值M和所述逻辑内存块序号logical_bank_id计算每个元素对应的内存块的物理内存块序号physical_bank_id,包括:响应于所述数据交换粒度值M等于0,令每个元素对应的内存块的物理内存块序号physical_bank_id等于逻辑内存块序号logical_bank_id;响应于所述数据交换粒度值M不等于0,根据所述数据交换粒度值M、所述元素序号element_id和所述逻辑内存块序号logical_bank_id计算每个元素对应的内存块的物理内存块序号physical_bank_id。
例如,在本公开至少一实施例提供的方法中,根据所述数据交换粒度值M、所述元素序号element_id和所述逻辑内存块序号logical_bank_id计算每个元素对应的内存块的物理内存块序号physical_bank_id,包括:根据所述数据交换粒度值M确定每个元素的所述元素序号element_id中的第一地址位;根据所述第一地址位和所述逻辑内存块序号logical_bank_id计算每个元素的所述物理内存块序号physical_bank_id。
例如,在本公开至少一实施例提供的方法中,所述根据所述第一地址位和所述逻辑内存块序号logical_bank_id计算每个元素的所述物理内存块序号physical_bank_id,包括:根据所述逻辑内存块序号logical_bank_id计算得到逻辑内存块组序号logical_bank_group_id;根据所述数据交换粒度值M确定所述逻辑内存块组序号logical_bank_group_id中需要变换的第二地址位;对所述第一地址位和所述第二地址位进行异或操作以计算得到所述物理内存块序号physical_bank_id。
例如,在本公开至少一实施例提供的方法中,所述根据所述维度信息和所述参数信息确定数据交换粒度值M,包括:根据所述张量的第一维度的大小与所述内存块数量计算中间值J,其中,所述中间值J表示每J行的数据交换模式不同;根据所述中间值J计算得到所述数据交换粒度值M。
例如,在本公开至少一实施例提供的方法中,,其中,C是所述第一维度的大小,X是所述内存块数量,/>表示向下取整。
例如,在本公开至少一实施例提供的方法中,所述根据所述中间值J计算得到所述数据交换粒度值M,包括:根据公式J= pow(2, M)*K计算得到所述数据交换粒度值M,其中,K是奇数,pow(2, M)表示2的M次方。
例如,在本公开至少一实施例提供的方法中,所述根据所述中间值J计算得到所述数据交换粒度值M,包括:根据公式J= pow(2, M1)*K计算得到M1;根据公式Y= pow(2, M_max)计算得到M_max;根据公式M = min(M1, M_max)计算得到所述数据交换粒度值M,其中,K是奇数,Y是内存块的一行地址上存储的元素数量,pow(2, M1)表示2的M1次方。
例如,本公开至少一实施例提供的方法还包括:根据所述多个维度中的第一维度的大小确定每个元素的第一维度序号。
例如,在本公开至少一实施例提供的方法中,所述根据所述维度信息和所述参数信息确定所述多个元素将要存储到所述多个内存块中时,每个元素对应的内存块的逻辑内存块序号logical_bank_id,包括:根据所述多个元素的元素序号element_id、所述第一维度序号和所述内存块数量确定每个元素对应的内存块的逻辑内存块序号logical_bank_id。
例如,在本公开至少一实施例提供的方法中,所述多个维度包括所述张量的批次、宽度、高度和通道,所述第一维度为所述通道。
例如,本公开至少一实施例提供的方法还包括:确定在需要对所述张量的第一维度和其他维度进行转置的情况下,根据所述物理内存块序号physical_bank_id将所述多个元素存储到所述多个内存块中。
例如,本公开至少一实施例提供的方法还包括:确定在需要对所述张量的第一维度和其他维度进行转置的情况下,根据所述物理内存块序号physical_bank_id从所述多个内存块中读取所述多个元素。
本公开至少一实施例还提供一种电子设备,所述电子设备包括:至少一个存储器,非瞬时性地存储有计算机可执行指令;至少一个处理器,配置为运行所述计算机可执行指令,其中,所述计算机可执行指令被所述处理器运行时实现本公开任一实施例所述的方法。
本公开至少一实施例还提供一种非瞬时性计算机可读存储介质,其中,所述非瞬时性计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令被至少一个处理器执行时实现本公开任一实施例所述的方法。
附图说明
为了更清楚地说明本公开实施例的技术方案,下面将对实施例的附图作简单地介绍,显而易见地,下面描述中的附图仅仅涉及本公开的一些实施例,而非对本公开的限制。
图1为一种使用重排序算子存储数据的示意图;
图2为本公开至少一实施例提供的数据存储方法的流程图;
图3为本公开至少一实施例提供的数据读取方法的流程图;
图4为本公开至少一实施例提供的对张量的多个元素进行编号的示意图;
图5A为一种示例性线性摆放方式的示意图;
图5B为本公开至少一实施例提供的一种示例性分散摆放方式的示意图;
图6A为另一种示例性线性摆放方式的示意图;
图6B为本公开至少一实施例提供的另一种示例性分散摆放方式的示意图;
图7为本公开至少一实施例提供的非瞬时性计算机可读存储介质的示意图;以及
图8为本公开至少一实施例提供的一种电子装置的示意框图。
具体实施方式
为了使得本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例的附图,对本公开实施例的技术方案进行清楚、完整地描述。显然,所描述的实施例是本公开的一部分实施例,而不是全部的实施例。基于所描述的本公开的实施例,本领域普通技术人员在无需创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
除非另外定义,本公开使用的技术术语或者科学术语应当为本公开所属领域内具有一般技能的人士所理解的通常意义。本公开中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。应当理解,本公开的方法实施方式中记载的各个步骤可以按照不同的顺序执行,和/或并行执行。此外,方法实施方式可以包括附加的步骤和/或省略执行示出的步骤。本公开的范围在此方面不受限制。
下面通过几个具体的实施例对本公开进行说明。为了保持本公开实施例的以下说明清楚且简明,可省略已知功能和已知部(元)件的详细说明。当本公开实施例的任一部(元)件在一个以上的附图中出现时,该部(元)件在每个附图中由相同或类似的参考标号表示。
张量(Tensor)作为一种存储数字集合的基本数据结构已经在当前的神经网络、机器学习系统中被广泛使用。例如在神经网络中,可以将待处理数据表示为张量,然后代入数学公式中进行计算。数学公式可以被可视化表示为计算图,计算图中具有多个算子(Operator,缩写为Op)用于表示不同的数学运算,多个算子之间可以由线连接,线可以表示各个算子计算之间的依赖关系。
在一些情况下,例如当涉及到不同内存布局格式转换时,或者是将数据从CPU内存传输到GPU等设备上进行计算时,需要考虑数据在内存中的存储顺序与目标设备要求的访问顺序是否一致。例如,可以使用重排序(reorder)算子来重新组织数据在内存中的布局,确保其满足新的维度顺序或者符合特定硬件的数据存取对齐要求,从而提高计算效率和避免不必要的数据复制。图1为一种使用重排序算子存储数据的示意图。如图1所示,对于按照以元素为粒度线性排布的张量(图1中的线性张量),首先需要使用重排序算子将张量中的元素重新排序,例如按照指定的顺序将张量中的元素重新排列为以块(block)为粒度的数据(图1中的块线性张量),每个块包括32c8p个元素,然后再将重新排列后的张量中的以块为粒度的数据按照线性平铺的方式存储到缓冲区的不同内存块(bank)中。然而,使用reorder算子不能完全避免bank冲突,而且效率较低。
本公开至少一实施例提供了一种数据存储方法、数据读取方法、电子设备和非瞬时性计算机可读存储介质,可以根据张量和内存块的特性来设计数据布局,通过将张量中多个元素的逻辑内存块序号logical_bank_id映射为物理内存块序号physical_bank_id,硬件可以自动调整张量数据在内存中的布局,从而不需要依赖重排序(recorder)算子也能有效避免bank冲突,节省了计算资源,提升了人工智能芯片的数据存储和读取性能。
下面结合附图对本公开的实施例进行详细说明,但是本公开并不限于这些具体的实施例。
图2为本公开至少一实施例提供的数据存储方法的流程图。如图2所示,该数据存储方法包括如下步骤S210~S250。
步骤S210:获取包括多个元素的张量的维度信息和用于存储张量的多个内存块的参数信息。
步骤S220:根据维度信息和参数信息确定数据交换粒度值M。
步骤S230:根据维度信息和参数信息确定多个元素将要存储到多个内存块中时,每个元素对应的内存块的逻辑内存块序号logical_bank_id。
步骤S240:根据数据交换粒度值M和逻辑内存块序号logical_bank_id计算每个元素对应的内存块的物理内存块序号physical_bank_id。
步骤S250:根据物理内存块序号physical_bank_id将多个元素存储到多个内存块中。
图3为本公开至少一实施例提供的数据读取方法的流程图。如图3所示,该数据读取方法包括如下步骤S310~S350。
步骤S310:获取包括多个元素的张量的维度信息和用于存储张量的多个内存块的参数信息。
步骤S320:根据维度信息和参数信息确定数据交换粒度值M。
步骤S330:根据维度信息和参数信息确定多个元素将要存储到多个内存块中时,每个元素对应的内存块的逻辑内存块序号logical_bank_id。
步骤S340:根据数据交换粒度值M和逻辑内存块序号logical_bank_id计算每个元素对应的内存块的物理内存块序号physical_bank_id。
步骤S350:根据物理内存块序号physical_bank_id从多个内存块中读取多个元素。
本公开的实施例对张量中的数据的类型不作限制,张量中的多个元素数据可以是图像数据、自然语言数据等等,这些数据可以采用具有不同的维度和维度大小的张量表示,例如一维张量(例如向量)、二维张量(例如矩阵)、三维张量、四维张量或更高维度的张量等。例如,可以用不同维度大小的四维张量表示Q个数据。在一个示例中,Q=48,则可以用四个维度N、C、H、W的大小分别为2、3、2、4的张量A来表示这48个数据,也可以用四个维度N、C、H、W的大小分别为1、3、4、4的张量B来表示这48个数据。例如,张量A和B的四个维度N、C、H、W可以分别对应图片的批次、通道、高度和宽度。
在本公开的一些实施例中,张量的维度信息包括张量的多个维度的大小。张量的多个维度大小可以用于为张量的多个元素进行编号,每个元素的编号包括元素序号element_id和第一维度序号channel_id。
例如,在本公开的一些实施例中,可以根据多个维度中的第一维度的大小确定每个元素的第一维度序号。例如,张量B的四个维度N、C、H、W的大小分别为1、3、4、4,可以将维度C选作第一维度,将维度C单独编号作为第一维度序号channel_id。C=3,所以第一维度序号channel_id的取值范围为0~2。
例如,在本公开的一些实施例中,可以根据张量的维度信息确定张量中每个元素的元素序号element_id。例如,张量B的四个维度N、C、H、W的大小分别为1、3、4、4,可以将三个维度N、H、W放在一起编号作为元素序号element_id。N×H×W=16,所以元素序号element_id的取值范围为0~15。
例如,张量B的每个元素可以表示为pi cj,其中pi表示元素序号element_id,cj表示第一维度序号channel_id。图4为本公开至少一实施例提供的对张量的多个元素进行编号的示意图。如图4所示,张量B包括3个通道(例如,第一维度)C0、C1和C2,每个通道中的元素的第一维度序号channel_id相同。图4示出了张量B的通道C0、C1、C2中的多个元素的元素序号element_id和第一维度序号channel_id,也即,张量B的48个元素可以分别表示为p0c0、p0c1、p0c2、p1c0、p1c1、p1c2、p2c0、p2c1、p2c2、p3c0、p3c1、p3c2、p4c0、p4c1、p4c2、p5c0、p5c1、p5c2、p6c0、p6c1、p6c2、p7c0、p7c1、p7c2、p8c0、p8c1、p8c2、p9c0、p9c1、p9c2、p10c0、p10c1、p10c2、p11c0、p11c1、p11c2、p12c0、p12c1、p12c2、p13c0、p13c1、p13c2、p14c0、p14c1、p14c2、p15c0、p15c1、p15c2。
在本公开的一些实施例中,张量的维度信息还包括元素长度,内存的参数信息包括内存块数量和内存块宽度,由此可以确定出每个内存块的一行地址上能存储的元素数量,进而确定多个元素将要存储到多个内存块中时,每个元素对应的内存块的逻辑内存块序号logical_bank_id,也即,执行步骤S230或步骤S330。
例如,在一个示例中,张量B的元素长度element_bit_width为16比特(bit),内存块数量BANK_NUM为32个,内存块宽度BANK_WIDTH为128 bits,则由此可以确定每个内存块的一行地址上能存储的元素数量channel_per_bank= BANK_WIDTH / element_bit_width= 128 / 16 = 8。
张量中的数据通常是以平铺的方式写入内存中的地址,例如按照张量的预设维度顺序写入内存中的地址,或者按照上述编号顺序线性地写入内存中的地址。在步骤S230或步骤S330,确定多个元素将要存储到多个内存块中时,每个元素对应的内存块的逻辑内存块序号logical_bank_id,这里,“将要存储”并不是真正的存储操作,而是假设在不使用reorder算子时,多个元素将要按照线性摆放方式存储到内存中。
例如,在本公开的一些实施例中,在步骤S210或步骤S310后,即在获取了张量的维度信息和多个内存块的参数信息后,可以根据维度信息和参数信息确定多个元素将要存储到多个内存块中时,每个元素对应的内存块的逻辑内存块序号logical_bank_id,其一具体示例可以包括:根据多个元素的元素序号element_id、第一维度序号和内存块数量确定每个元素对应的内存块的逻辑内存块序号logical_bank_id。
例如,可以根据公式(1)来确定每个元素对应的内存块的逻辑内存块序号logical_bank_id:
logical_bank_id = (element_id * (C / channel_per_bank) + (channel_id/ channel_per_bank)) % BANK_NUM 公式(1)
其中,element_id为元素的元素序号,C为第一维度的大小,channel_per_bank为一个内存块的一行地址上能存储的元素数量,channel_id为元素的第一维度序号,BANK_NUM为内存块数量,%表示取模运算符,用于计算两个数相除后的余数。
例如,在一个示例中,张量D包括4个维度N、C、H、W,其中C是第一维度,并且N=1,H=4,W=8,C=64,元素长度element_bit_width为16bits,内存块数量BANK_NUM为32个,内存块宽度BANK_WIDTH为128 bits,每个内存块的一行地址上能存储的元素数量channel_per_bank= BANK_WIDTH / element_bit_width = 128 / 16 = 8。则对于张量D的元素p0c0,其元素序号element_id等于0,第一维度序号channel_id等于0,根据公式(1)可以计算得到张量D的元素p0c0将要存储到的内存块对应的逻辑内存块序号logical_bank_id=(0*(64/8)+(0/8))%32=0;对于张量D的元素p2c1,其元素序号element_id等于2,第一维度序号channel_id等于1,根据公式(1)可以计算得到张量D的元素p2c1将要存储到的内存块对应的逻辑内存块序号logical_bank_id=(2*(64/8)+(1/8))%32=16。
例如,在本公开的一些实施例中,在获取了张量的维度信息和多个内存块的参数信息后,还可以根据其他方式确定每个元素对应的内存块的逻辑内存块序号logical_bank_id。例如,可以根据按照预设维度顺序或编号顺序将多个元素写入内存中的线性摆放方式来确定每个元素对应的内存块的逻辑内存块序号logical_bank_id。
图5A为一种示例性线性摆放方式的示意图。如图5A所示,一个内存条包括多个内存块,例如内存块bank0~bank31;每个内存块包括多行和多列用于存储数据的存储单元,每个内存块的宽度BANK_WIDTH为128 bits,每个内存块的一行地址可以存储张量D的元素个数为channel_per_bank,即,channel_per_bank= BANK_WIDTH / element_bit_width =128 / 16 = 8。
例如,在不使用reorder算子的情况下,张量D将会按照C、H、W、N的维度顺序线性地写入bank0~bankN中,例如,将C单独编号为第一维度序号channel_id,将H、W、N一起编号为元素序号element_id,则可以根据图5A确定张量D的多个元素p0c0、p0c1、p0c2、p0c3、p0c4、p0c5、p0c6、p0c7将要写入bank0的第一行地址中,也即,张量D的多个元素p0c0、p0c1、p0c2、p0c3、p0c4、p0c5、p0c6、p0c7对应的内存块的逻辑内存块序号logical_bank_id均为0。为了便于描述,图5A中用“0_0”表示包括张量D的8个元素p0c0、p0c1、p0c2、p0c3、p0c4、p0c5、p0c6、p0c7的元素组,用“0_8”表示包括张量D的8个元素p0c8、p0c9、p0c10、p0c11、p0c12、p0c13、p0c14、p0c15的元素组,用“4_16”表示包括张量D的8个元素p4c16、p4c17、p4c18、p4c19、p4c20、p4c21、p4c22、p4c23的元素组,以此类推。
例如,可以根据图5A确定张量D的多个元素0_8将要写入bank1的第一行地址中,也即,张量D的多个元素p0c8、p0c9、p0c10、p0c11、p0c12、p0c13、p0c14、p0c15对应的内存块的逻辑内存块序号logical_bank_id均为1;确定张量D的多个元素0_16将要写入bank2的第一行地址中,也即,张量D的多个元素p0c16、p0c17、p0c18、p0c19、p0c20、p0c21、p0c22、p0c23对应的内存块的逻辑内存块序号logical_bank_id均为2,以此类推,直到写满32个bank的第一行地址后,张量D的多个元素的数据会继续写入bank的第二行地址中。例如,可以根据图5A确定张量D的多个元素4_16将要写入bank2的第二行地址中,也即,张量D的多个元素p4c16、p4c17、p4c18、p4c19、p4c20、p4c21、p4c22、p4c23对应的内存块的逻辑内存块序号logical_bank_id均为2。
例如,在确定需要对张量D的第一维度C和其他维度N*H*W进行转置的情况下,可以一次存取X个第一维度C(例如,通道)乘以Y个其他维度的元素,这里,X为内存块的数量,Y是内存块的一行地址上存储的元素数量。例如,在一个示例中,内存块数量BANK_NUM为32,内存块的一行地址上能存储的元素数量channel_per_bank为8,则在确定需要对张量D进行转置的情况下,可以一次存取32(c)×8(p)个元素。需要说明的是,在不需要对张量进行转置(非转置)的情况下,需要读取的数据是32(p)×8(c)。在确定需要对张量D的第一维度C和其他维度N*H*W进行转置的情况下,例如,可以一次存取元素组0_0、0_8、0_16、0_24、1_0、1_8、1_16、1_24、2_0、2_8、2_16、2_24、3_0、3_8、3_16、3_24、4_0、4_8、4_16、4_24、5_0、5_8、5_16、5_24、6_0、6_8、6_16、6_24、7_0、7_8、7_16、7_24、8_0、8_8、8_16、8_24中的多个元素。如果这些元素按照图5A所示的顺序排列在多个内存块中,则会发生bank冲突。为了更直观地展示,图5A用多种不同形状填充的填充块分别表示每次存取的元素,也即,相同形状填充的填充块表示一次存取的元素。如图5A中的纯色填充块所示,在尝试一次存取上述32×8个元素时,同一时间需要访问每个内存块(bank0-bank3、bank8-bank11、bank16-bank19、bank24-bank27)中的第一行地址和第二行地址,所以会发生bank冲突。例如,在本公开的一些实施例中,在步骤S220或步骤S320,可以根据张量的维度信息和内存块的参数信息确定数据交换粒度值M。例如,在一个示例中,可以将张量的第一维度大小与内存块的数量对齐来确定数据交互粒度值M。例如,如图5A所示,张量D的第一维度C的大小是64,内存块数量为32,2M=64/32=2,则可以确定数据交互粒度值M为1。
在确定数据交互粒度值M后,可以执行步骤S240,即根据数据交换粒度值M和逻辑内存块序号logical_bank_id计算每个元素对应的内存块的物理内存块序号physical_bank_id。
例如,按照图5A所示的摆放方式,在尝试一次存取32×8个元素时,需要分两次存取完第一维度C的所有元素(例如,第一次存取图5A中的纯色填充块,第二次存取图5A中的点状填充块),只要将这两种填充块中的某一行数据互相交换地址,例如将两种填充块中的第二行数据的内存块序号交换,就可以得到将元素真正存储到内存块中的物理内存块序号physical_bank_id。然后,执行步骤S250,就可以按照该物理内存块序号physical_bank_id将同一个内存块中的元素分散摆放到不同的内存块中,从而避免bank冲突。下面结合图5B详细说明上述过程。
图5B为本公开至少一实施例提供的一种示例性分散摆放方式的示意图。图5B采用了与图5A相同的填充块来表示一次存取的元素。
如图5A和图5B所示,图5A中的第一个纯色填充块包括元素组0_0、0_8、0_16、0_24、4_0、4_8、4_16、4_24,其中,纯色填充块的第一行的元素组0_0、0_8、0_16、0_24分别对应的内存块的逻辑内存块序号logical_bank_id为0、1、2、3,第二行的元素4_0、4_8、4_16、4_24分别对应的内存块的逻辑内存块序号也是logical_bank_id为0、1、2、3;图5A中的第一个点状填充块包括元素0_32、0_40、0_48、0_56、4_32、4_40、4_48、4_56,其中,点状填充块的第一行的元素0_32、0_40、0_48、0_56分别对应的内存块的逻辑内存块序号logical_bank_id为4、5、6、7,第二行的元素4_32、4_40、4_48、4_56分别对应的内存块的逻辑内存块序号也是logical_bank_id为4、5、6、7。
在一个示例中,如图5B所示,可以交换这两种填充块中的第二行元素对应的内存块的序号,从而使得第一个纯色填充块中第二行的元素4_0、4_8、4_16、4_24分别被摆放到bank4、bank5、bank6和bank7中,使得第一个点状填充块中第二行的元素4_32、4_40、4_48、4_56分别被摆放到bank0、bank1、bank2和bank3中;类似地,交换第二个纯色填充块和第二个点状填充块中的第二行元素对应的内存块的序号,从而使得第二个纯色填充块中第二行的元素5_0、5_8、5_16、5_24分别被摆放到bank12、bank13、bank14和bank15中,使得第二个点状填充块中第二行的元素5_32、5_40、5_48、5_56分别被摆放到bank8、bank9、bank10和bank11中;以此类推,按照图5B所示的摆放方式将张量D的所有元素分散存储到不同的内存块中,从而避免bank冲突,提高bank的利用率。
也即,在需要对张量D的第一维度C和其他维度N*H*W进行转置的情况下,如果想一次存取元素组0_0、0_8、0_16、0_24、1_0、1_8、1_16、1_24、2_0、2_8、2_16、2_24、3_0、3_8、3_16、3_24、4_0、4_8、4_16、4_24、5_0、5_8、5_16、5_24、6_0、6_8、6_16、6_24、7_0、7_8、7_16、7_24、8_0、8_8、8_16、8_24中的多个元素,按照图5B所示的方式排布元素,则可以分别从bank0~31中一次存取这些元素,不会发生bank冲突。
例如,在另一个示例中,也可以交换两个填充块中的第一行元素对应的内存块的序号,保持第二行元素对应的内存块的序号不变,本公开的实施例对选取哪一行的元素进行内存块序号变换不作限制。
例如,在本公开实施例的至少一个示例中,步骤S220或步骤S320,即根据维度信息和参数信息确定数据交换粒度值M,其一具体示例可以包括:根据张量的第一维度的大小与内存块数量计算中间值J,其中,中间值J表示每J行的数据交换模式不同;根据中间值J计算得到数据交换粒度值M。
例如,在获取了张量的第一维度C的大小和内存块的数量后,可以计算中间值J,从而确定需要进行数据交换的行及其数据交换模式。这里,数据交换模式可以是填充块的组合模式,例如从一行的n个不同填充块中不重复地选出m个填充块作为一组进行数据交换,则有组合模式除以2种数据交换模式。例如,当n=4,m=2时,有6种组合模式,所以数据交换模式有3种。
图6A为另一种示例性线性摆放方式的示意图。图6B为本公开至少一实施例提供的另一种示例性分散摆放方式的示意图。图6B采用了与图6A相同的填充块来表示一次存取的元素。
例如,在该示例中,张量E包括4个维度N、C、H、W,其中C是第一维度,并且N=1,H=4,W=8,C=128,元素长度为16bits,图6A和图6B所示的内存块数量BANK_NUM为32个,内存块宽度BANK_WIDTH为128 bits,每个内存块的一行地址上能存储的元素数量channel_per_bank=BANK_WIDTH / element_bit_width = 128 / 16 = 8。在确定需要对张量E的第一维度C和其他维度N*H*W进行转置的情况下,可以一次存取32×8个元素,例如一次存取元素组0_0、0_8、0_16、0_24、1_0、1_8、1_16、1_24、2_0、2_8、2_16、2_24、3_0、3_8、3_16、3_24、4_0、4_8、4_16、4_24、5_0、5_8、5_16、5_24、6_0、6_8、6_16、6_24、7_0、7_8、7_16、7_24、8_0、8_8、8_16、8_24中的多个元素,如图6A的第一点状填充块和第二点状填充块所示。可以看到,在尝试一次存取上述32×8个元素时,同一时间需要访问bank0-bank3和bank16-bank19的第一行地址、第二行地址、第三行地址和第四行地址,会发生更多次bank冲突,因此需要根据上述步骤S210~S250将同一个内存块中的元素分散摆放到不同的内存块中。
为避免同一时间访问bank0-bank3和bank16-bank19的第一行地址、第二行地址、第三行地址和第四行地址,可以根据张量E的第一维度的大小与内存块数量(BANK_NUM=32)计算中间值J,张量E的C=128,内存块数量BANK_NUM=32,所以中间值J=128/32=4,由此可以确定同一个内存块中每四行中有三行需要进行数据交换,且这三行的数据交换模式(也即,有3种数据交换模式)不同。
如图6A和图6B所示,保持第一行元素对应的内存块的序号不变,也即,使第一行元素的物理内存块序号physical_bank_id等于逻辑内存块序号logical_bank_id,例如,令图6B中的元素组0_0、0_8、0_16、0_24中的多个元素的物理内存块序号physical_bank_id分别等于0、1、2、3。将除第一行之外的剩下三行(第二行、第三行、第四行)选作需要进行数据交换的行,且第二行、第三行、第四行的数据交换模式不同。
例如,将图6A中第二行的点状填充块和方格填充块进行数据交换,将图6A中第二行的横线填充块与斜线填充块进行数据交换,得到如图6B的第二行所示的分散摆放方式。
例如,将图6A中第三行的点状填充块和横线填充块进行数据交换,将图6A中第三行的方格填充块与斜线填充块进行数据交换,得到如图6B的第三行所示的分散摆放方式。
例如,将图6A中第四行的点状填充块和斜线填充块进行数据交换,将图6A中第四行的方格填充块与横线填充块进行数据交换,得到如图6B的第四行所示的分散摆放方式。
例如,本公开实施例的至少一个示例中,中间值J可以根据公式(2)计算得到:
公式(2)
其中,C是第一维度的大小,X是内存块数量,表示向下取整。
需要说明的是,公式(2)仅是计算中间值J的一个示例,并不作为对本公开实施例的限制,本领域技术人员还可以根据实际情况采用其他公式计算中间值J。
例如,在本公开实施例的至少一个示例中,根据中间值J计算得到数据交换粒度值M,其一具体示例可以包括:根据公式(3)计算得到数据交换粒度值M。公式(3)如下:
J= pow(2, M)*K 公式(3)
其中,K是奇数,pow(2, M)表示2的M次方。
例如,在图6A和图6B所示的示例中,J=4,可以根据公式(3)计算得到数据交换粒度值M为2。
例如,当张量的第一维度过大时,还可以根据内存块的一行地址上存储的元素数量限制数据交换粒度值M。例如,在本公开的至少一个示例中,根据中间值J计算得到数据交换粒度值M,其一具体示例可以包括:根据公式(4)-(6)计算得到数据交换粒度值M。公式(4)-(6)如下:
J= pow(2, M1)*K 公式(4)
Y= pow(2, M_max) 公式(5)
M = min(M1, M_max) 公式(6)
其中,K是奇数,Y是内存块的一行地址上存储的元素数量,pow(2, M1)表示2的M1次方。
例如,在本公开实施例的至少一个示例中,步骤S240或步骤S340,即根据数据交换粒度值M和逻辑内存块序号logical_bank_id计算每个元素对应的内存块的物理内存块序号physical_bank_id,其一具体示例可以包括:响应于数据交换粒度值M等于0,令每个元素对应的内存块的物理内存块序号physical_bank_id等于逻辑内存块序号logical_bank_id;响应于数据交换粒度值M不等于0,根据数据交换粒度值M、元素序号element_id和逻辑内存块序号logical_bank_id计算每个元素对应的内存块的物理内存块序号physical_bank_id。
在一些情况中,例如当张量的第一维度较小或内存块数量较多时,张量中的多个元素即使按照线性摆放方式存放在多个内存块中,也不会发生bank冲突,这种情况则无需进行数据交换。例如,张量F包括4个维度N、C、H、W,其中C是第一维度,并且N=1,H=4,W=8,C=32,内存块数据量为32,则可以确定数据交换粒度值M=0,这种情况下可以直接令每个元素对应的内存块的物理内存块序号physical_bank_id等于逻辑内存块序号logical_bank_id,因为张量F的多个元素即使按照线性摆放方式存储在多个内存块中,也可以一次读取出来,不会发生bank冲突。
前文介绍了数据交换粒度值M不等于0时,可以根据数据交换粒度M和中间值J对部分行的元素进行数据交换。在本公开的一些实施例中,还可以根据数据交换粒度值M、元素序号element_id和逻辑内存块序号logical_bank_id计算每个元素对应的内存块的物理内存块序号physical_bank_id,其一具体示例可以包括:根据数据交换粒度值M确定每个元素的元素序号element_id中的第一地址位;根据第一地址位和逻辑内存块序号logical_bank_id计算每个元素的物理内存块序号physical_bank_id。
例如,可以根据哈希公式physical_bank_id [M-1:0] = logical_bank_id [M-1:0] ^ element_id [M_max-1:M_max-M]计算每个元素的物理内存块序号physical_bank_id,其中,^表示异或操作,[M_max-1:M_max-M]表示element_id的第一地址位包括从第M_max-M位到第M_max-1位。
例如,在本公开实施例的至少一个示例中,根据第一地址位和逻辑内存块序号logical_bank_id计算每个元素的物理内存块序号physical_bank_id,其一具体示例可以包括:根据逻辑内存块序号logical_bank_id计算得到逻辑内存块组序号logical_bank_group_id;根据数据交换粒度值M确定逻辑内存块组序号logical_bank_group_id中需要变换的第二地址位;对第一地址位和第二地址位进行异或操作以计算得到物理内存块序号physical_bank_id。
例如,在该示例中,可以将多个元素分组(例如,用0_0表示包括元素序号为0的8个通道元素的元素组),将多个内存块分组(例如,每4个内存块为一组),通过每个元素组对应的逻辑内存块序号logical_bank_id所属的逻辑内存块组序号logical_bank_group_id来计算得每个元素组的物理内存块序号physical_bank_id。
例如,可以根据公式(7)计算得到逻辑内存块组序号logical_bank_group_id:
logical_bank_group_id = logical_bank_id / (BANK_NUM / channel_per_bank) 公式(7)
其中,BANK_NUM / channel_per_bank表示每个内存块组中的内存块的数量。这里,逻辑内存块组序号logical_bank_group_id为整数,当logical_bank_id / (BANK_NUM/ channel_per_bank)计算得到的数值为非整数时,可以通过向下取整得到逻辑内存块组序号logical_bank_group_id。
需要说明的是,在本公开的实施例中,“/”表示除法运算符。在一些实施例中,当a/b的结果不为整数时,可以将对a/b向下取整后得到的整数结果用作后续计算。
例如,可以根据数据交换粒度值M确定逻辑内存块组序号logical_bank_group_id中需要变换的第二地址位为[M-1:0],即,逻辑内存块组序号logical_bank_group_id中需要变换的第二地址位包括从第0位到第M -1位。
例如,首先令physical_bank_group_id = logical_bank_group_id,然后根据公式(8)对第一地址位和第二地址位进行异或操作以计算得到物理内存块组序号physical_bank_group_id ,然后根据公式(9)计算得到物理内存块序号physical_bank_id。公式(8)和公式(9)如下。
physical_bank_group_id[M-1:0] = logical_bank_group_id[M-1:0] ^element_id[M_max-1:M_max-M] 公式(8)
physical_bank_id=physical_bank_group_id*(BANK_NUM/channel_per_bank) +logical_bank_id % (BANK_NUM / channel_per_bank) 公式(9)
其中,^表示异或操作,%表示取模运算符,用于计算两个数相除后的余数。
本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。
下面结合图5A和图5B详细介绍根据上述示例的数据存储方法的各个步骤计算元素的物理内存块序号physical_bank_id。
例如,首先在步骤S210获取包括多个元素的张量D的维度信息和用于存储张量D的多个内存块的参数信息:张量D包括4个维度N、C、H、W,其中C是第一维度,并且N=1,H=4,W=8,C=64,元素长度为16bits,内存块数量BANK_NUM为32个,内存块宽度BANK_WIDTH为128bits,每个内存块的一行地址上能存储的元素数量channel_per_bank= BANK_WIDTH /element_bit_width = 128 / 16 = 8。
然后,在步骤S220,根据维度信息和参数信息确定数据交换粒度值M。例如,根据公式(2)和公式(4)~(6)计算数据交换粒度值M。
即,根据公式(2),
根据公式(4),2= pow(2, M1)*K,得M1=1,K=1;
根据公式(5),8= pow(2, M_max),得M_max=3;
根据公式(6),M = min(M1, M_max)=min(1, 3),得M=1。
例如,在步骤S230,根据维度信息和参数信息确定多个元素将要存储到多个内存块中时,每个元素对应的内存块的逻辑内存块序号logical_bank_id。
例如,对于图5A中的元素组0_24,其元素序号element_id为0(二进制表示为b'0000),第一维度序号channel_id为24,根据公式(1)计算元素组0_24对应的内存块的逻辑内存块序号logical_bank_id。即,
logical_bank_id =
(element_id * (C / channel_per_bank) + (channel_id / channel_per_bank)) % BANK_NUM=
( 0 * (64 / 8) + (24 / 8)) % 32 = 3。
例如,根据公式(7)计算得到元素组0_24对应的内存块的逻辑内存块组序号logical_bank_group_id。即,logical_bank_group_id = logical_bank_id / (BANK_NUM/ channel_per_bank) = 3 / (32 / 8) = 0。
由此可知,元素组0_24对应的内存块的逻辑内存块组序号logical_bank_group_id的二进制表示为b'0000。
然后,根据公式(8)计算得到元素组0_24的物理内存块组序号physical_bank_group_id。即,
physical_bank_group_id[M-1:0] =
logical_bank_group_id[M-1:0] ^ element_id[M_max-1:M_max-M]=
logical_bank_group_id[0:0] ^ element_id[2:2] =
0 ^ 0 = 0,
将logical_bank_group_id (b'0000)的最后一位[0:0]变为0,从而得到元素组0_24的物理内存块组序号physical_bank_group_id为b'0000,其十进制表示为0。
然后,根据公式(9)计算得到元素组0_24的物理内存块序号physical_bank_id。即,
physical_bank_id=
physical_bank_group_id*(BANK_NUM/channel_per_bank) + logical_bank_id% (BANK_NUM / channel_per_bank)=
0 * (32 / 8) + 3 % (32 / 8) = 3。
经过上述步骤可以确定元素组0_24的物理内存块序号为3,然后,在步骤S250,将元素组0_24中的多个元素p0c24、p0c25、p0c26、p0c27、p0c28、p0c29、p0c30、p0c31存储到内存块bank3中,如图5B所示。
例如,对于图5A中的元素组4_16,其元素序号element_id为4(二进制表示为b'0100),第一维度序号channel_id为16,根据公式(1)计算元素组4_16对应的内存块的逻辑内存块序号logical_bank_id。即,
logical_bank_id =
(element_id * (C / channel_per_bank) + (channel_id / channel_per_bank)) % BANK_NUM=
( 4 * (64 / 8) + (16 / 8)) % 32 = 2,
如图5A所示,元素组4_16对应内存块bank2。
例如,根据公式(7)计算得到元素组4_16对应的内存块的逻辑内存块组序号logical_bank_group_id。即,logical_bank_group_id = logical_bank_id / (BANK_NUM/ channel_per_bank) = 2 / (32 / 8) = 0。
由此可知,元素组4_16对应的内存块的逻辑内存块组序号logical_bank_group_id=0的二进制表示为b'0000。
然后,根据公式(8)计算得到元素组4_16的物理内存块组序号physical_bank_group_id。即,
physical_bank_group_id[M-1:0] =
logical_bank_group_id[M-1:0] ^ element_id[M_max-1:M_max-M]=
logical_bank_group_id[0:0] ^ element_id[2:2] =
0 ^ 1 = 1,
将logical_bank_group_id (b'0000)的最后一位[0:0]变为1,从而得到元素组4_16的物理内存块组序号physical_bank_group_id为b'0001,其十进制表示为1。
然后,根据公式(9)计算得到元素组4_16的物理内存块序号physical_bank_id。即,
physical_bank_id=
physical_bank_group_id*(BANK_NUM/channel_per_bank) + logical_bank_id% (BANK_NUM / channel_per_bank)=
1 * (32 / 8) +2 % (32 / 8) = 6。
经过上述步骤可以确定元素组4_16的物理内存块序号为6,然后,在步骤S250,将元素组4_16中的多个元素p4c16、p4c17、p4c18、p4c19、p4c20、p4c21、p4c22、p4c23存储到内存块bank6中,如图5B所示。
例如,对于图5A中的元素组21_8,其元素序号element_id为21(二进制表示为b'0001 0101),第一维度序号channel_id为8,根据公式(1)计算元素组21_8对应的内存块的逻辑内存块序号logical_bank_id。即,
logical_bank_id =
(element_id * (C / channel_per_bank) + (channel_id / channel_per_bank)) % BANK_NUM=
( 21 * (64 / 8) + (8 / 8)) % 32 = 9,
如图5A所示,元素组21_8对应内存块bank9。
例如,根据公式(7)计算得到元素组21_8对应的内存块的逻辑内存块组序号logical_bank_group_id。即,logical_bank_group_id = logical_bank_id / (BANK_NUM/ channel_per_bank) = 9 / (32 / 8) = 2。
由此可知,元素组21_8对应的内存块的逻辑内存块组序号logical_bank_group_id=2的二进制表示为b'0010。
然后,根据公式(8)计算得到元素组21_8的物理内存块组序号physical_bank_group_id。即,
physical_bank_group_id[M-1:0] =
logical_bank_group_id[M-1:0] ^ element_id[M_max-1:M_max-M]=
logical_bank_group_id[0:0] ^ element_id[2:2] =
0 ^ 1 = 1,
将logical_bank_group_id (b'0010)的最后一位[0:0]变为1,从而得到元素组21_8的物理内存块组序号physical_bank_group_id为b'0011,其十进制表示为3。
然后,根据公式(9)计算得到元素组21_8的物理内存块序号physical_bank_id。即,
physical_bank_id=
physical_bank_group_id*(BANK_NUM/channel_per_bank) + logical_bank_id% (BANK_NUM / channel_per_bank)=
3 * (32 / 8) +9 % (32 / 8) = 13。
经过上述步骤可以确定元素组21_8的物理内存块序号为13,然后,在步骤S250,将元素组21_8中的多个元素p21c8、p21c9、p21c10、p21c11、p21c12、p21c13、p21c14、p21c15存储到内存块bank13中,如图5B所示。
以上结合图5A和图5B给出了计算张量D中元素组0_24、4_16、21_8的物理内存块序号physical_bank_id的详细过程,以此类推,可以计算张量D的所有元素的物理内存块序号physical_bank_id,此处不再赘述。
下面再结合图6A和图6B给出计算张量E的元素组0_24、4_16、21_8的物理内存块序号physical_bank_id的示例过程。
例如,首先在步骤S210获取包括多个元素的张量E的维度信息和用于存储张量E的多个内存块的参数信息:张量E包括4个维度N、C、H、W,其中C是第一维度,并且N=1,H=4,W=8,C=128,元素长度为16bits,内存块数量BANK_NUM为32个,内存块宽度BANK_WIDTH为128bits,每个内存块的一行地址上能存储的元素数量channel_per_bank= BANK_WIDTH /element_bit_width = 128 / 16 = 8。
然后,在步骤S220,根据维度信息和参数信息确定数据交换粒度值M。例如,根据公式(2)和公式(4)~(6)计算数据交换粒度值M。
即,根据公式(2),得
根据公式(4),4= pow(2, M1)*K,得M1=2,K=1;
根据公式(5),8= pow(2, M_max),得M_max=3;
根据公式(6),M = min(M1, M_max)=min(2, 3),得M=2。
例如,在步骤S230,根据维度信息和参数信息确定多个元素将要存储到多个内存块中时,每个元素对应的内存块的逻辑内存块序号logical_bank_id。
例如,对于图6A中的元素组0_24,其元素序号element_id为0(二进制表示为b'0000),第一维度序号channel_id为24,根据公式(1)计算元素组0_24对应的内存块的逻辑内存块序号logical_bank_id。即,
logical_bank_id =
(element_id * (C / channel_per_bank) + (channel_id / channel_per_bank)) % BANK_NUM=
( 0 * (128 / 8) + (24 / 8)) % 32 = 3。
例如,根据公式(7)计算得到元素组0_24对应的内存块的逻辑内存块组序号logical_bank_group_id。即,logical_bank_group_id = logical_bank_id / (BANK_NUM/ channel_per_bank) = 3 / (32 / 8) = 0。
由此可知,元素组0_24对应的内存块的逻辑内存块组序号logical_bank_group_id的二进制表示为b'0000。
然后,根据公式(8)计算得到元素组0_24的物理内存块组序号physical_bank_group_id。即,
physical_bank_group_id[M-1:0] =
logical_bank_group_id[M-1:0] ^ element_id[M_max-1:M_max-M]=
logical_bank_group_id[1:0] ^ element_id[2:1] =
b'00 ^ b'00 = b'00,
将logical_bank_group_id (b'0000)的最后2位[1:0]变为00,从而得到元素组0_24的物理内存块组序号physical_bank_group_id为b'0000,其十进制表示为0。
然后,根据公式(9)计算得到元素组0_24的物理内存块序号physical_bank_id。即,
physical_bank_id=
physical_bank_group_id*(BANK_NUM/channel_per_bank) + logical_bank_id% (BANK_NUM / channel_per_bank)=
0 * (32 / 8) + 3 % (32 / 8) = 3。
经过上述步骤可以确定元素组0_24的物理内存块序号为3,然后,在步骤S250,将元素组0_24中的多个元素p0c24、p0c25、p0c26、p0c27、p0c28、p0c29、p0c30、p0c31存储到内存块bank3中,如图6B所示。
例如,对于图6A中的元素组4_16,其元素序号element_id为4(二进制表示为b'0100),第一维度序号channel_id为16,根据公式(1)计算元素组4_16对应的内存块的逻辑内存块序号logical_bank_id。即,
logical_bank_id =
(element_id * (C / channel_per_bank) + (channel_id / channel_per_bank)) % BANK_NUM=
( 4 * (128 / 8) + (16 / 8)) % 32 = 2,
如图6A所示,元素组4_16对应内存块bank2。
例如,根据公式(7)计算得到元素组4_16对应的内存块的逻辑内存块组序号logical_bank_group_id。即,logical_bank_group_id = logical_bank_id / (BANK_NUM/ channel_per_bank) = 2 / (32 / 8) = 0。
由此可知,元素组4_16对应的内存块的逻辑内存块组序号logical_bank_group_id=0的二进制表示为b'0000。
然后,根据公式(8)计算得到元素组4_16的物理内存块组序号physical_bank_group_id。即,
physical_bank_group_id[M-1:0] =
logical_bank_group_id[M-1:0] ^ element_id[M_max-1:M_max-M]=
logical_bank_group_id[1:0] ^ element_id[2:1] =
b'00 ^ b'10 = b'10,
将logical_bank_group_id (b'0000)的最后2位[1:0]变为10,从而得到元素组4_16的物理内存块组序号physical_bank_group_id为b'0010,其十进制表示为2。
然后,根据公式(9)计算得到元素组4_16的物理内存块序号physical_bank_id。即,
physical_bank_id=
physical_bank_group_id*(BANK_NUM/channel_per_bank) + logical_bank_id% (BANK_NUM / channel_per_bank)=
2 * (32 / 8) +2 % (32 / 8) = 10。
经过上述步骤可以确定元素组4_16的物理内存块序号为10,然后,在步骤S250,将元素组4_16中的多个元素p4c16、p4c17、p4c18、p4c19、p4c20、p4c21、p4c22、p4c23存储到内存块bank10中,如图6B所示。
例如,对于图6A中的元素组21_8,其元素序号element_id为21(二进制表示为b'0001 0101),第一维度序号channel_id为8,根据公式(1)计算元素组21_8对应的内存块的逻辑内存块序号logical_bank_id。即,logical_bank_id = (element_id * (C /channel_per_bank) + (channel_id / channel_per_bank)) % BANK_NUM=( 21 * (128 /8) + (8 / 8)) % 32 = 17,如图6A所示,元素组21_8对应内存块bank17。
例如,根据公式(7)计算得到元素组21_8对应的内存块的逻辑内存块组序号logical_bank_group_id。即,logical_bank_group_id = logical_bank_id / (BANK_NUM/ channel_per_bank) = 17 / (32 / 8) = 4。
由此可知,元素组21_8对应的内存块的逻辑内存块组序号logical_bank_group_id=4的二进制表示为b'0100。
然后,根据公式(8)计算得到元素组21_8的物理内存块组序号physical_bank_group_id。即,
physical_bank_group_id[M-1:0] =
logical_bank_group_id[M-1:0] ^ element_id[M_max-1:M_max-M]=
logical_bank_group_id[1:0] ^ element_id[2:1] =
b'00 ^ b'10 = b'10,
将logical_bank_group_id (b'0100)的最后2位[1:0]变为10,从而得到元素组21_8的物理内存块组序号physical_bank_group_id为b'0110,其十进制表示为6。
然后,根据公式(9)计算得到元素组21_8的物理内存块序号physical_bank_id。即,
physical_bank_id=
physical_bank_group_id*(BANK_NUM/channel_per_bank) + logical_bank_id% (BANK_NUM / channel_per_bank)=
6 * (32 / 8) +17% (32 / 8) = 25。
经过上述步骤可以确定元素组21_8的物理内存块序号为25,然后,在步骤S250,将元素组21_8中的多个元素p21c8、p21c9、p21c10、p21c11、p21c12、p21c13、p21c14、p21c15存储到内存块bank25中,如图6B所示。
以此类推,可以计算张量E的所有元素的物理内存块序号physical_bank_id,此处不再赘述。
上述实施例的数据存储方法可以用于需要对张量的第一维度和除了第一维度之外的其他维度进行转置的情况下,也即,在需要对张量的第一维度和其他维度进行转置时,计算张量的所有元素对应的内存块的物理内存块序号physical_bank_id,根据每个元素对应的内存块的物理内存块序号physical_bank_id,硬件可以自动调整张量中的元素在内存中的布局,从而不需要依赖recorder算子也能有效避免bank冲突,节省了计算资源。
也即,在将张量的元素线性连续的存入缓冲区时,硬件可以自动根据给定的哈希公式(包括但不限于上述公式(7)~(9))调整元素存放的内存块序号。从缓冲区中读取数据时也可以根据同样的哈希公式取数。
本公开至少一实施例还提供了一种数据读取方法。图3中的数据读取方法的步骤S310~步骤S340与图2中的数据存储方法的步骤S210~S240相同,关于数据读取方法的步骤S310~步骤S340的详细说明可以参考上述实施例中关于数据存储方法的步骤S210~S240的相关描述,重复之处不再赘述。
在计算得到张量的所有元素对应的内存块的物理内存块序号physical_bank_id后,可以执行步骤S350,即根据每个元素对应的内存块的物理内存块序号physical_bank_id从对应的内存块中读取多个元素。
上述实施例的数据读取方法同样可以用于需要对张量的第一维度和除了第一维度之外的其他维度进行转置的情况下,可以实现与上述数据存储方法相同的技术效果,此处不再赘述。
本公开的至少一实施例还提供了一种电子设备,包括至少一个存储器和至少一个处理器,存储器非瞬时性地存储有计算机可执行指令,处理器配置为运行计算机可执行指令,其中,计算机可执行指令被处理器运行时实现如上述任一实施例的数据存储方法和数据读取方法。该电子设备的技术效果与上述数据存储方法和数据读取方法的技术效果相同,此处不再赘述。
本公开的至少一实施例还提供了一种非瞬时性计算机可读存储介质。图7为本公开至少一实施例提供的非瞬时性计算机可读存储介质的示意图。例如,如图7所示,在存储介质700上可以非暂时性地存储一个或多个计算机可执行指令701。例如,当计算机可执行指令701由至少一个处理器执行时可以执行根据上文所述的数据存储方法和数据读取方法中的一个或多个步骤。该非暂时性存储介质的技术效果与上述数据存储方法和数据读取方法的技术效果相同,此处不再赘述。
例如,上述非瞬时可读存储介质实现为存储器,例如易失性存储器和/或非易失性存储器。上述实施例中存储器可以为易失性存储器,例如可以包括随机存取存储器(RAM)和/或高速缓存等。非易失性存储器例如可以包括只读存储器(ROM)、硬盘、可擦除可编程只读存储器(EPROM)、便携式紧致盘只读存储器(CD-ROM)、USB存储器、闪存等。存储器中还可以存储各种应用程序(代码、指令)和数据以及应用程序使用和/或产生的各种数据等。
本公开的一些实施例还提供了一种电子装置,该电子装置可执行上述任一实施例的数据存储方法和数据读取方法。
图8为本公开至少一实施例提供的一种电子装置的示意框图。本公开实施例中的电子装置可以包括但不限于诸如移动电话、笔记本电脑、数字广播接收器、PDA(个人数字助理)、PAD(平板电脑)、PMP(便携式多媒体播放器)、车载终端(例如车载导航终端)等等的移动终端以及诸如数字TV、台式计算机等等的固定终端。图8示出的电子装置1000仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
例如,如图8所示,在一些示例中,电子装置1000包括处理装置(例如中央处理器、图形处理器等)1001,其可以根据存储在只读存储器(ROM)1002中的程序或者从存储装置1008加载到随机访问存储器(RAM)1003中的程序而执行各种适当的动作和处理。在RAM1003中,还存储有计算机系统操作所需的各种程序和数据。处理器1001、ROM 1002以及RAM1003通过总线1004被此相连。输入/输出(I/O)接口1005也连接至总线1004。
例如,以下部件可以连接至I/O接口1005:包括例如触摸屏、触摸板、键盘、鼠标、摄像头、麦克风、加速度计、陀螺仪等的输入装置1006;包括诸如液晶显示器(LCD)、扬声器、振动器等的输出装置1007;包括例如磁带、硬盘等的存储装置1008;例如还可以包括诸如LAN卡、调制解调器等的网络接口卡的通信装置1009。通信装置1009可以允许电子装置1000与其他设备进行无线或有线通信以交换数据,经由诸如因特网的网络执行通信处理。驱动器1010也根据需要连接至I/O接口1005。可拆卸存储介质1011,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器1010上,以便于从其上读出的计算机程序根据需要被安装入存储装置1008。虽然图8示出了包括各种装置的电子装置1000,但是应理解的是,并不要求实施或包括所有示出的装置,可以替代地实施或包括更多或更少的装置。
例如,该电子装置1000还可以进一步包括外设接口(图中未示出)等。该外设接口可以为各种类型的接口,例如为USB接口、闪电(lighting)接口等。该通信装置1009可以通过无线通信来与网络和其他设备进行通信,该网络例如为因特网、内部网和/或诸如蜂窝电话网络之类的无线网络、无线局域网(LAN)和/或城域网(MAN)。无线通信可以使用多种通信标准、协议和技术中的任何一种,包括但不局限于全球移动通信系统(GSM)、增强型数据GSM环境(EDGE)、宽带码分多址(W-CDMA)、码分多址(CDMA)、时分多址(TDMA)、蓝牙、Wi-Fi(例如基于IEEE 802. 11a、IEEE 802. 11b、IEEE 802. 11g和/或IEEE 802. 11n标准)、基于因特网协议的语音传输(VoIP)、Wi-MAX,用于电子邮件、即时消息传递和/或短消息服务(SMS)的协议,或任何其他合适的通信协议。
例如,电子装置1000可以为手机、平板电脑、笔记本电脑、电子书、游戏机、电视机、数码相框、导航仪等任何设备,也可以为任意的数据处理装置及硬件的组合,本公开的实施例对此不作限制。
虽然上文中已经用一般性说明及具体实施方式,对本公开作了详尽的描述,但在本公开实施例基础上,可以对之作一些修改或改进,这对本领域技术人员而言是显而易见的。因此,在不偏离本公开精神的基础上所做的这些修改或改进,均属于本公开要求保护的范围。
对于本公开,还有以下几点需要说明:
(1)本公开实施例附图只涉及到与本公开实施例涉及到的结构,其他结构可参考通常设计。
(2)为了清晰起见,在用于描述本公开的实施例的附图中,层或区域的厚度被放大或缩小,即这些附图并非按照实际的比例绘制。
(3)在不冲突的情况下,本公开的实施例及实施例中的特征可以相互组合以得到新的实施例。
以上所述,仅为本公开的具体实施方式,但本公开的保护范围并不局限于此,本公开的保护范围应以所述权利要求的保护范围为准。

Claims (14)

1.一种数据存储方法,包括:
获取包括多个元素的张量的维度信息和用于存储所述张量的多个内存块的内存块数量和内存块宽度,其中,所述维度信息包括所述张量的多个维度的大小和元素长度;
根据所述维度信息确定每个元素的元素序号;
根据所述多个维度中的第一维度的大小确定每个元素的第一维度序号;
根据所述多个元素的所述元素序号、所述第一维度序号和所述内存块数量确定每个元素对应的内存块的逻辑内存块序号;
根据所述张量的第一维度的大小与所述内存块数量计算中间值J,所述中间值J表示每J行的数据交换模式不同,其中,J=⌊ (C + X - 1)/ X ⌋,C是所述第一维度的大小,X是所述内存块数量,⌊ ⌋表示向下取整;
根据所述中间值J计算得到数据交换粒度值M;
响应于所述数据交换粒度值M等于0,令每个元素对应的内存块的物理内存块序号等于逻辑内存块序号;
响应于所述数据交换粒度值M不等于0,根据所述数据交换粒度值M确定每个元素的所述元素序号中的第一地址位,根据所述第一地址位和所述逻辑内存块序号计算每个元素的所述物理内存块序号;
根据所述物理内存块序号将所述多个元素存储到所述多个内存块中。
2.根据权利要求1所述的方法,其中,所述根据所述第一地址位和所述逻辑内存块序号计算每个元素的所述物理内存块序号,包括:
根据所述逻辑内存块序号计算得到逻辑内存块组序号;
根据所述数据交换粒度值M确定所述逻辑内存块组序号中需要变换的第二地址位;
对所述第一地址位和所述第二地址位进行异或操作以计算得到所述物理内存块序号。
3.根据权利要求1所述的方法,其中,所述根据所述中间值J计算得到数据交换粒度值M,包括:
根据公式J= pow(2, M)*K计算得到所述数据交换粒度值M,其中,K是奇数,pow(2, M)表示2的M次方。
4.根据权利要求1所述的方法,其中,所述根据所述中间值J计算得到数据交换粒度值M,包括:
根据公式J= pow(2, M1)*K计算得到M1;
根据公式Y= pow(2, M_max)计算得到M_max;
根据公式M = min(M1, M_max)计算得到所述数据交换粒度值M,
其中,K是奇数,Y是内存块的一行地址上存储的元素数量,pow(2, M1)表示2的M1次方。
5.根据权利要求1所述的方法,其中,所述多个维度包括所述张量的批次、宽度、高度和通道,所述第一维度为所述通道。
6.根据权利要求1所述的方法,还包括:
确定在需要对所述张量的所述第一维度和其他维度进行转置的情况下,根据所述物理内存块序号将所述多个元素存储到所述多个内存块中。
7.一种数据读取方法,包括:
获取包括多个元素的张量的维度信息和用于存储所述张量的多个内存块的内存块数量和内存块宽度,其中,所述维度信息包括所述张量的多个维度的大小和元素长度;
根据所述维度信息确定每个元素的元素序号;
根据所述多个维度中的第一维度的大小确定每个元素的第一维度序号;
根据所述多个元素的所述元素序号、所述第一维度序号和所述内存块数量确定每个元素对应的内存块的逻辑内存块序号;
根据所述张量的第一维度的大小与所述内存块数量计算中间值J,所述中间值J表示每J行的数据交换模式不同,其中,J=⌊ (C + X - 1)/ X ⌋,C是所述第一维度的大小,X是所述内存块数量,⌊ ⌋表示向下取整;
根据所述中间值J计算得到数据交换粒度值M;
响应于所述数据交换粒度值M等于0,令每个元素对应的内存块的物理内存块序号等于逻辑内存块序号;
响应于所述数据交换粒度值M不等于0,根据所述数据交换粒度值M确定每个元素的所述元素序号中的第一地址位,根据所述第一地址位和所述逻辑内存块序号计算每个元素的所述物理内存块序号;
根据所述物理内存块序号从所述多个内存块中读取所述多个元素。
8.根据权利要求7所述的方法,其中,所述根据所述第一地址位和所述逻辑内存块序号计算每个元素的所述物理内存块序号,包括:
根据所述逻辑内存块序号计算得到逻辑内存块组序号;
根据所述数据交换粒度值M确定所述逻辑内存块组序号中需要变换的第二地址位;
对所述第一地址位和所述第二地址位进行异或操作以计算得到所述物理内存块序号。
9.根据权利要求7所述的方法,其中,所述根据所述中间值J计算得到数据交换粒度值M,包括:
根据公式J= pow(2, M)*K计算得到所述数据交换粒度值M,其中,K是奇数,pow(2, M)表示2的M次方。
10.根据权利要求7所述的方法,其中,所述根据所述中间值J计算得到数据交换粒度值M,包括:
根据公式J= pow(2, M1)*K计算得到M1;
根据公式Y= pow(2, M_max)计算得到M_max;
根据公式M = min(M1, M_max)计算得到所述数据交换粒度值M,
其中,K是奇数,Y是内存块的一行地址上存储的元素数量,pow(2, M1)表示2的M1次方。
11.根据权利要求7所述的方法,其中,所述多个维度包括所述张量的批次、宽度、高度和通道,所述第一维度为所述通道。
12.根据权利要求7所述的方法,还包括:
确定在需要对所述张量的所述第一维度和其他维度进行转置的情况下,根据所述物理内存块序号从所述多个内存块中读取所述多个元素。
13.一种电子设备,包括:
至少一个存储器,非瞬时性地存储有计算机可执行指令;
至少一个处理器,配置为运行所述计算机可执行指令,
其中,所述计算机可执行指令被所述处理器运行时实现根据权利要求1-6任一项所述的数据存储方法或权利要求7-12任一项所述的数据读取方法。
14.一种非瞬时性计算机可读存储介质,其中,所述非瞬时性计算机可读存储介质存储有计算机可执行指令,
所述计算机可执行指令被至少一个处理器执行时实现根据权利要求1-6任一项所述的数据存储方法或权利要求7-12任一项所述的数据读取方法。
CN202410218124.0A 2024-02-28 2024-02-28 数据存储方法、数据读取方法、电子设备和存储介质 Active CN117785759B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202410218124.0A CN117785759B (zh) 2024-02-28 2024-02-28 数据存储方法、数据读取方法、电子设备和存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202410218124.0A CN117785759B (zh) 2024-02-28 2024-02-28 数据存储方法、数据读取方法、电子设备和存储介质

Publications (2)

Publication Number Publication Date
CN117785759A CN117785759A (zh) 2024-03-29
CN117785759B true CN117785759B (zh) 2024-04-23

Family

ID=90383783

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202410218124.0A Active CN117785759B (zh) 2024-02-28 2024-02-28 数据存储方法、数据读取方法、电子设备和存储介质

Country Status (1)

Country Link
CN (1) CN117785759B (zh)

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109815162A (zh) * 2019-01-28 2019-05-28 Oppo广东移动通信有限公司 内存管理方法、装置、移动终端及存储介质
CN110597616A (zh) * 2018-06-13 2019-12-20 华为技术有限公司 一种神经网络的内存分配方法及装置
CN112783640A (zh) * 2019-11-11 2021-05-11 上海肇观电子科技有限公司 预先分配内存的方法与设备、电路、电子设备及介质
WO2022134873A1 (zh) * 2020-12-25 2022-06-30 中科寒武纪科技股份有限公司 数据处理装置、数据处理方法及相关产品
CN115080240A (zh) * 2022-06-29 2022-09-20 美的集团(上海)有限公司 语音处理模型的部署方法、电子设备及存储介质
CN116893904A (zh) * 2023-09-11 2023-10-17 腾讯科技(深圳)有限公司 神经网络模型的内存管理方法、装置、设备、介质及产品
WO2024012492A1 (zh) * 2022-07-15 2024-01-18 北京有竹居网络技术有限公司 人工智能芯片、灵活地访问数据的方法、设备和介质

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110597616A (zh) * 2018-06-13 2019-12-20 华为技术有限公司 一种神经网络的内存分配方法及装置
CN109815162A (zh) * 2019-01-28 2019-05-28 Oppo广东移动通信有限公司 内存管理方法、装置、移动终端及存储介质
CN112783640A (zh) * 2019-11-11 2021-05-11 上海肇观电子科技有限公司 预先分配内存的方法与设备、电路、电子设备及介质
WO2022134873A1 (zh) * 2020-12-25 2022-06-30 中科寒武纪科技股份有限公司 数据处理装置、数据处理方法及相关产品
CN115080240A (zh) * 2022-06-29 2022-09-20 美的集团(上海)有限公司 语音处理模型的部署方法、电子设备及存储介质
WO2024012492A1 (zh) * 2022-07-15 2024-01-18 北京有竹居网络技术有限公司 人工智能芯片、灵活地访问数据的方法、设备和介质
CN116893904A (zh) * 2023-09-11 2023-10-17 腾讯科技(深圳)有限公司 神经网络模型的内存管理方法、装置、设备、介质及产品

Also Published As

Publication number Publication date
CN117785759A (zh) 2024-03-29

Similar Documents

Publication Publication Date Title
CN106056529B (zh) 一种对用于图片识别的卷积神经网络训练的方法与设备
US10388042B2 (en) Efficient display of data points in a user interface
US20120221788A1 (en) Multi-dimensional array manipulation
US20140354666A1 (en) Vertex parameter data compression
CN111079917B (zh) 张量数据分块存取的方法及装置
US11714651B2 (en) Method and tensor traversal engine for strided memory access during execution of neural networks
CN111158874A (zh) 数据处理方法和装置、电子设备及存储介质
JP2022508028A (ja) 3次元画像処理におけるデータの読み書き方法とシステム、記憶媒体及び端末
CN112929300B (zh) 一种数据处理装置、方法、基站和存储介质
WO2024027039A1 (zh) 数据处理方法、装置、设备和可读存储介质
CN112668708A (zh) 一种提高数据利用率的卷积运算装置
CN110968585A (zh) 面向列的存储方法、装置、设备及计算机可读存储介质
US20140176215A1 (en) Method of implementing clock skew and integrated circuit adopting the same
CN114546206B (zh) 异形屏显示方法、装置、计算机设备和存储介质
CN104537003A (zh) 一种Hbase数据库的通用高性能数据写入方法
CN108537729A (zh) 图像无级缩放方法、计算机装置及计算机可读存储介质
US8935486B2 (en) Memory access for digital signal processing
CN117785759B (zh) 数据存储方法、数据读取方法、电子设备和存储介质
CN116578245B (zh) 存储器访问电路及存储器访问方法、集成电路和电子设备
CN116051345A (zh) 图像数据处理方法、装置、计算机设备及可读存储介质
CN111626938B (zh) 图像插值方法、图像插值装置、终端设备及存储介质
US10152766B2 (en) Image processor, method, and chipset for increasing intergration and performance of image processing
KR101688435B1 (ko) 블록 구조를 이용한 적분 영상 생성 장치 및 그 방법
CN115344506B (zh) 内存地址的映射方法、内存访问方法和装置、芯片、设备
CN117851742B (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