CN117742715A - 访存越界检测方法、装置及存储介质 - Google Patents

访存越界检测方法、装置及存储介质 Download PDF

Info

Publication number
CN117742715A
CN117742715A CN202211123972.0A CN202211123972A CN117742715A CN 117742715 A CN117742715 A CN 117742715A CN 202211123972 A CN202211123972 A CN 202211123972A CN 117742715 A CN117742715 A CN 117742715A
Authority
CN
China
Prior art keywords
access
code
operand information
array
memory
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.)
Pending
Application number
CN202211123972.0A
Other languages
English (en)
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.)
Cambricon Technologies Corp Ltd
Original Assignee
Cambricon Technologies Corp 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 Cambricon Technologies Corp Ltd filed Critical Cambricon Technologies Corp Ltd
Priority to CN202211123972.0A priority Critical patent/CN117742715A/zh
Publication of CN117742715A publication Critical patent/CN117742715A/zh
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

本申请实施例提供一种访存越界检测方法、装置及存储介质,根据程序代码中的访存操作的操作数信息以及程序代码中声明的全局数组,生成访存越界检查代码;将访存越界检查代码插入访存操作的代码之前,生成程序代码的目标代码,其中访存越界检查代码用于在执行访存操作的代码前执行以进行访存越界检查。在编译期针对访存操作生成访存越界检查代码并插桩到访存操作的代码之前,可以在执行访存操作前先执行访存越界检查代码进行访存越界检查,不占用额外存储空间,以较低的运行时开销实现检查程序中的访存越界行为。

Description

访存越界检测方法、装置及存储介质
技术领域
本申请实施例涉及编译技术和人工智能技术领域,尤其涉及一种访存越界检测方法、装置及存储介质。
背景技术
在面向流式计算的硬件中,每一流式计算指令通常需要从存储单元中读取输入数据进行某种处理(例如相加、卷积等)后,再将输出数据写回存储单元,该存储单元可以由程序员显式管理,每一流式计算指令处理的数据的起始地址以及长度也可以由程序员显式指定。当程序员为流式计算指令指定的地址非法,或者数据量超过实际需要处理的规模,此种非法情况被称之为访存越界,指令的访存越界通常会触发硬件中断或者存储踩踏。
针对可能存在的访存越界问题,可以对代码进行访存越界的检查。现有技术中检查访存越界的常用方法是利用shadow memory(影子内存)或者redzone(红区)记录程序实际的访存行为,这种在运行时对程序进行越界检查的方式均会带来存储空间的占用,且应用场景有局限、可能影响程序的执行效率。例如,基于redzone的方法需要在程序员申请的存储空间前后预留空间,其并不适用于片上存储空间有限的情况;再如,shadow memory的方法需要在片外DDR(双倍速率同步动态随机存储器)上预留足够的shadow memory空间,若硬件缓存容量较小而且访存延迟较大,在程序执行过程中频繁访问shadow memory空间会严重影响实时核函数(Kernel)的执行时间,极易触发超时中断。
发明内容
本申请实施例提供一种访存越界检测方法、装置及存储介质,以降低访存越界检测的成本,具有较高的灵活性和兼容性。
第一方面,本申请实施例提供一种访存越界检测方法,包括:
获取程序代码中声明的全局数组;
获取所述程序代码中的访存操作的操作数信息;
根据所述操作数信息以及所述全局数组,生成访存越界检查代码;
将所述访存越界检查代码插入所述访存操作的代码之前,生成程序代码的目标代码,其中所述访存越界检查代码用于在执行所述访存操作的代码前执行以进行访存越界检查。
第二方面,本申请实施例提供一种访存越界检测装置,包括:
全局数组获取模块,用于获取程序代码中声明的全局数组;
操作数信息获取模块,用于获取所述程序代码中的访存操作的操作数信息;
生成模块,用于根据所述操作数信息以及所述全局数组,生成访存越界检查代码;
插桩模块,用于将所述访存越界检查代码插入所述访存操作的代码之前,生成程序代码的目标代码,其中所述访存越界检查代码用于在执行所述访存操作的代码前执行以进行访存越界检查。
第三方面,本申请实施例提供一种访存越界检测装置,包括:至少一个处理器及存储器;
所述存储器存储计算机执行指令;
所述至少一个处理器执行所述存储器存储的计算机执行指令,使得所述至少一个处理器执行如第一方面所述的方法。
第四方面,本申请实施例提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,所述计算机程序被至少一个处理器执行时,实现如第一方面所述的方法。
本申请实施例提供的访存越界检测方法、装置及存储介质,通过获取程序代码中声明的全局数组;获取程序代码中的访存操作的操作数信息;根据操作数信息以及全局数组,生成访存越界检查代码;将访存越界检查代码插入访存操作的代码之前,生成程序代码的目标代码,其中访存越界检查代码用于在执行访存操作的代码前执行以进行访存越界检查。在编译期针对访存操作生成访存越界检查代码并插桩到访存操作的代码之前,可以在执行访存操作前先执行访存越界检查代码进行访存越界检查,不占用额外存储空间,以较低的运行时开销实现检查程序中的访存越界行为。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。
图1为本申请实施例中处理资源示意图;
图2为本申请一个实施例提供的访存越界检测方法的流程图;
图3为本申请另一个实施例提供的访存越界检测方法的流程图;
图4为本申请一个实施例提供的访存越界检测装置的结构示意图;
图5为本申请另一个实施例提供的访存越界检测装置的结构示意图;
图6是示出根据本申请实施例的板卡的结构图;
图7是示出根据本申请实施例的组合处理装置的结构图;
图8是示出根据本申请实施例的单核计算装置的内部结构示意图;
图9是示出根据本申请实施例的多核计算装置的内部结构示意图;
图10是示出根据本申请实施例的处理器核的内部结构示意图。
通过上述附图,已示出本公开明确的实施例,后文中将有更详细的描述。这些附图和文字描述并不是为了通过任何方式限制本公开构思的范围,而是通过参考特定实施例为本领域技术人员说明本公开的概念。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。
为了清楚理解本申请的技术方案,首先对现有技术的方案进行详细介绍。
在面向流式计算的硬件中,每一流式计算指令通常需要从存储单元中读取输入数据进行某种处理(例如相加、卷积等)后,再将输出数据写回存储单元,该存储单元可以由程序员显式管理,其中存储单元可以采用片上高速暂存存储器(Scratchpad Memory,SPM)。每一流式计算指令处理的数据的起始地址以及长度也可以由程序员显式指定,当程序员为流式计算指令指定的地址非法,或者数据量超过实际需要处理的规模,这种指令的非法现象被称之为访存越界,访存越界通常会触发硬件中断或者存储踩踏。以下面的代码为例:
_nram_float A[128];
_nram_float B[128];
_nram_float C[128];
_bang_add1(C,A,B,128);
_bang_add2(C,A,B,256);
_bang_add3(C+128,A,B,128);
在上面的例子中,第一个向量加法_bang_add1的向量地址和长度都是合法;第二个向量加法_bang_add2的向量长度超出了预先定义数组的总大小,是非法的;第三个向量加法_bang_add3的目的地址超过了预先定义数组的地址范围,是非法的。
针对可能存在的访存越界问题,可以对代码进行访存越界的检查。现有技术中检查访存越界的常用方法是利用shadow memory(影子内存)或者redzone(红区)记录程序实际的访存行为,其中redzone方法需要在原始程序中静态声明或者动态分配的存储空间前后预留一定的空间,当程序在执行期间访存到预留的存储空间时,就说明应用程序中出现了越界访问;基于redzone的方法需要在程序员申请的存储空间前后预留空间,其并不适用于片上存储空间有限的情况。shadow memory方法将系统的存储空间分为程序空间和shadow memory空间,并在程序空间和shadow memory之间建立一一对应关系,shadowmemory用于记录程序空间的状态信息,并随着程序的执行实时更新,总体上的思路是记录内存的分配和释放,并在访问内存的操作中插入检测代码。shadow memory的方法需要在片外DDR(双倍速率同步动态随机存储器)上预留足够的shadow memory空间,若硬件缓存容量较小而且访存延迟较大,在程序执行过程中频繁访问shadow memory空间会严重影响实时核函数(Kernel)的执行时间,极易触发超时中断。总之,上述方法在运行时对程序进行越界检查的方式均会带来存储空间的占用,且应用场景有局限、可能影响程序的执行效率。
为了解决上述技术问题,本申请实施例中提供一种访存越界检测方法,通过获取程序代码中声明的全局数组;获取程序代码中的访存操作的操作数信息;根据操作数信息以及全局数组,生成访存越界检查代码;将访存越界检查代码插入访存操作的代码之前,生成程序代码的目标代码,其中访存越界检查代码用于在执行访存操作的代码前执行以进行访存越界检查。在编译期针对访存操作生成访存越界检查代码并将访存越界代码插桩到访存操作的代码之前,可以在执行访存操作前先执行访存越界检查代码进行访存越界检查,不占用额外存储空间,以较低的运行时开销实现检查程序中的访存越界行为。
本申请提供一种指令融合方法应用于如图1所示的应用场景中,包括编译器和面向流式计算的硬件处理器,将程序代码输入编译器,编译器获取程序代码中声明的全局数组,并根据程序代码中的访存操作的操作数信息及全局数组,生成访存越界检查代码,将访存越界检查代码插入程序代码中生成程序代码的目标代码,其中,该目标代码可以是中间表示代码,也可以是二进制的硬件可执行代码,当该目标代码为中间表示代码时,编译器可以进一步将该中间表示代码转换为硬件可执行代码,并将硬件可执行代码传输给面向流式计算的硬件处理器。当该目标代码为硬件可执行代码时,编译器可以将该硬件可执行代码直接传输给面向流式计算的硬件处理器。在面向流式计算硬件的处理器中执行目标代码,实现在每次执行访存操作前先执行访存越界检查代码进行访存越界检查。
其中,编译器可以运行在CPU上,而面向流式计算硬件处理器可以是XPU,XPU可以是IPU(Intelligence Processing Unit,智能处理单元)或GPU(Graphics ProcessingUnit,图形处理单元)等流式硬件。
下面以具体地实施例对本申请的技术方案以及本申请的技术方案如何解决上述技术问题进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例中不再赘述。下面将结合附图,对本申请的实施例进行描述。
图2为本申请一个实施例提供的访存越界检测方法的流程图,本实施例的执行主体为编译器或者具有编译功能的其他电子设备。如图2所示,本实施例提供的访存越界检测方法包括以下步骤:
S201、获取程序代码中声明的全局数组。
在本实施例中,编译器可以对程序代码进行分析和收集静态声明,提取静态声明中的全局数组。其中,静态声明可以用于声明程序代码中的变量/常量所属的存储空间,以及该变量/常量的数据类型、数据大小以及起始地址等信息;本实施例中,静态声明中的变量/常量可以为向量或矩阵等张量数据。其中变量/常量所属的存储空间可以指向一全局数组,该全局数组可用于记录该存储空间的起始地址和长度(该长度可以用于指示数据大小)。
本申请中以如下示例的程序代码为例:
_nram_float A1[128];
_nram_float A2[256];
_wram_float B[128];
_sram_float C[256];
_ldram_float D[128];
_gdram_float E[256];
_bang_add(dst_add,src_add,src_add,size_add);
_memcpy(dst_memcpy,dst_add,size_memcpy,NRAM2LDRAM);
其中,前六行代码为程序代码的静态声明,可以从中提取到全局数组:<A1,128*sizeof(float)>、<A2,256*sizeof(float)>、<B,128*sizeof(float)>、<C,256*sizeof(float)>、<D,128*sizeof(float)>、<E,256*sizeof(float)>。
需要说明的是,数组集合只存在于编译期,不增加运行时的存储开销。
S202、获取所述程序代码中的访存操作的操作数信息。
在本实施例中,程序代码中的指令会涉及到访存操作,访存操作指涉及数据访存运算的操作,包括单纯的访存指令,如load、store、memcpy等指令,也可以包括运算指令,如add、conv、pooling等指令,编译器可以获取访存操作的操作数信息,具体可包括操作数的起始地址和操作数长度。例如上述示例的程序代码中,运算指令_bang_add(dst_add,src_add,src_add,size_add)共涉及三个操作数,两个源操作数src_add,src_add,一个目的操作数dst_add,操作数的大小为size_add,也即该指令涉及到三个操作数信息,三个操作数信息分别为<dst_add,size_add>、<src_add,size_add>、<src_add,size_add>。本实施例中对访存操作中涉及的每个操作数都需要检查是否越界;由于访存操作涉及的操作数可以为一个以上,当操作数为多个时,需要分别获得到每个操作数对应的操作数信息。
S203、根据所述操作数信息以及所述全局数组,生成访存越界检查代码。
在本实施例中,编译器可以根据访存操作的操作数信息以及全局数组,生成访存越界检查代码,访存越界检查代码用于判断访存操作中涉及的操作数是否存在非法情形,具体用于判断访存操作中的指定的存储空间是否为非法,和/或访存操作的操作数的地址及长度是否超出全局数组对应的地址空间范围。
可选地,访存越界检查代码可以包括比较操作代码,以将访存操作的操作数信息与全局数组中对应的存储空间范围进行比较,若访存操作的操作数信息对应的存储空间未落入全局数组对应的存储空间范围,则确定访存越界。当然访存越界检查代码也可包括一些其他相关操作的代码,此处不做限定,此外,可选的,可预先配置访存越界检查代码的模板,基于模板来生成访存越界检查代码。
S204、将所述访存越界检查代码插入所述访存操作的代码之前,生成程序代码的目标代码,其中所述访存越界检查代码用于在执行所述访存操作的代码前执行以进行访存越界检查。
在本实施例中,编译器在编译期通过插桩的方式将每一访存操作对应的访存越界检查代码插入所述访存操作的代码之前,生成程序代码的目标代码。
之后,编译器可以将目标代码传输给面向流式计算的硬件处理器,在面向流式计算的硬件处理器中执行目标代码,目标代码在执行时,在执行访存操作前先执行所插桩的访存越界检查代码,在确定访存操作未越界时再继续执行访存操作,从而有效的实现对面向流式计算的硬件处理器的访存越界检查。
进一步的,在执行程序代码的目标代码的运行过程中,若确定存在访存越界,则报错后直接退出程序的执行。
本实施例提供的访存越界检测方法,通过获取程序代码中声明的全局数组;获取程序代码中的访存操作的操作数信息;根据操作数信息以及全局数组,生成访存越界检查代码;将访存越界检查代码插入访存操作的代码之前,生成程序代码的目标代码,其中访存越界检查代码用于在执行访存操作的代码前执行以进行访存越界检查。在编译期针对访存操作生成访存越界检查代码并插桩到访存操作的代码之前,可以在执行访存操作前先执行访存越界检查代码进行访存越界检查,不占用额外存储空间,以较低的运行时开销实现检查程序中的访存越界行为。
在上述实施例的基础上,本申请实施例的存储空间可以是根据硬件处理器的存储空间确定的,因而在获取程序代码中声明的全局数组后,可以将全局数组按照不同的存储空间划分为不同的数组集合,每一个数组集合对应一个存储空间。
举例来讲,硬件处理器的存储空间可包括NRAM(Neural-RAM,神经元随机存取存储器)、WRAM(Weight-RAM,权重存储单元)、SRAM(Static Random-Access Memory,静态随机存取存储器)、LDRAM(Local-DRAM,私有动态随机存取存储器)、GDRAM(Global-DRAM,共享动态随机存取存储器)等,因此可将全局数组按照存储空间划分为NRAM数组集合、WRAM数组集合、SRAM数组集合、LDRAM数组集合、GDRAM数组集合等。需要说明的是,此处仅用以示例说明,并不用于限定本申请实施例中存储空间的具体划分,在其他实施例中,存储空间的数量及表示还可以是其他合理的情形。
以上述示例中的程序代码为例,从静态声明中提取到全局数组:<A1,128*sizeof(float)>、<A2,256*sizeof(float)>、<B,128*sizeof(float)>、<C,256*sizeof(float)>、<D,128*sizeof(float)>、<E,256*sizeof(float)>。
进一步的,可将全局数组按照不同的存储空间划分为不同的数组集合,可得到如下5个数据集合:
NRAM_BUF_SET={<A1,128*sizeof(float)>,<A2,256*sizeof(float)>};
WRAM_BUF_SET={<B,128*sizeof(float)>};
SRAM_BUF_SET={<C,256*sizeof(float)>};
LDRAM_BUF_SET={<D,128*sizeof(float)>};
GDRAM_BUF_SET={<E,256*sizeof(float)>}。
需要说明的是,各数组集合只存在于编译期,不增加运行时的存储开销,且数组集合数量不限定5个,与硬件实际的存储层级相关。
在上述实施例的基础上,在根据所述操作数信息以及所述目标存储空间对应的数组集合,生成所述访存越界检查代码时,具体可包括:
根据所述操作数信息以及所述目标存储空间对应的数组集合,生成将所述操作数信息对应的存储空间与所述目标存储空间对应的数组集合中各数组对应的存储空间范围比较的代码,确定为所述访存越界检查代码。其中,目标存储空间是指该操作数信息对应的操作数指向的存储空间。
在本实施例中,为了缩小访存越界检查时的比较范围,避免将访存操作的操作数信息与全局数组中所有数组均进行比较,可仅将访存操作的每个操作数的操作数信息与其所属的目标存储空间对应的数组集合中的数组进行比较,也即,根据该操作数的操作数信息可确定操作数对应的存储空间,根据操作数信息对应的存储空间以及该操作数的目标存储空间对应的数组集合,生成将操作数信息对应的存储空间与目标存储空间对应的数组集合中各数组对应的存储空间范围比较的代码。若访存操作的操作数信息未落入目标存储空间对应的数组集合中任意一个数组对应的存储空间范围,则确定访存越界。
例如上述示例中硬件要求_bang_add(dst_add,src_add,src_add,size_add)中dst_add,src_add,src_add的操作数必须位于NRAM空间,即三个操作数的目标存储空间均为NRAM,因此对于dst_add,src_add,src_add的任一操作数,只需将其操作数信息与NRAM空间对应的数组集合的数组进行比较,基于此生成比较操作代码,得到访存越界检查代码,通过有针对性的比较,无需与全局数组中的其他数组集合进行比较,减少了比较次数,提高了代码生成的效率以及代码的执行效率。
更具体的,访存操作中每个操作数的操作数信息包括操作数的起始地址(本实施例中记为第一起始地址)和操作数长度(用于指示操作数的数据大小),则在根据所述操作数信息以及所述目标存储空间对应的数组集合,生成将所述操作数信息对应的存储空间与所述目标存储空间对应的数组集合中各数组对应的存储空间范围比较的代码时,具体可包括:
针对全局数组中目标存储空间对应的数组集合中包括的每一数组,生成比较操作代码和赋值操作代码,其中所述比较操作代码用于将所述第一起始地址和该数组的第二起始地址比较、以及将所述第一起始地址和所述操作数长度之和与该数组的第二起始地址和第二长度之和比较,所述赋值操作代码用于根据比较结果对表征越界的变量赋值。
其中,目标存储空间对应的数组集合可以包括至少一个数组,每个数组包括第二起始地址和第二长度,通过第二起始地址和第二长度可以确定该数组的地址范围。在本实施例中,将操作数信息对应的存储空间与目标存储空间对应的数组集合中的任一数组对应的存储空间范围比较的代码包括比较操作代码和赋值操作代码。
其中,比较操作代码是将操作数信息的第一起始地址和该数组的第二起始地址比较,用于判断操作数信息的第一起始地址是否大于或等于该数组的第二起始地址;以及将操作数信息的结束地址和该数组的结束地址比较,其中操作数信息的结束地址为操作数信息的第一起始地址和操作数长度之和,而该数组的结束地址为该数组的第二起始地址和第二长度之和,也即将第一起始地址和操作数长度之和与该数组的第二起始地址和第二长度之和比较,用于判断第一起始地址和操作数长度之和是否小于或等于该数组的第二起始地址和第二长度之和。若第一起始地址大于或等于该数组的第二起始地址、且第一起始地址和操作数长度之和小于或等于该数组的第二起始地址和第二长度之和,则说明操作数信息对应的存储空间落入该数组对应的存储空间范围。
当确定操作数信息对应的存储空间未落入目标存储空间对应的数组集合中的任一数组对应的存储空间范围内,则说明访存操作出现越界。本实施例中,通过赋值代码来记录操作数信息对应的存储空间是否未落入目标存储空间对应的数组集合中的任一数组对应的存储空间范围内,具体的,在每进行一次比较后根据比较结果对表征越界的变量赋值,可设定该变量的初始值为false(或0),若操作数信息对应的存储空间未落入当前比较的数组对应的存储空间范围,则保持变量值不变;若操作数信息对应的存储空间未落入当前比较的数组对应的存储空间范围,则将变量的值修改为true(或1),当完成与目标存储空间对应的数组集合中的所有数组的比较后,变量的值仍为false(或0),则说明操作数信息对应的存储空间未落入目标存储空间对应的数组集合中的任一数组对应的存储空间范围内,确定访存操作出现越界。
在上述实施例的基础上,访存越界检查代码还可包括判断操作代码,判断操作代码用于根据表征越界的变量的值,确定执行访存操作、或输出访存越界的通知信息。也即,当完成与目标存储空间对应的数组集合中的所有数组的比较后,若通过判断操作代码判断变量的值为true(或1),则确定访存操作未越界,可继续执行访存操作;若通过判断操作代码判断变量的值为false(或0),则确定访存操作出现越界,输出访存越界的通知信息。
以上述示例所示的程序代码为例,对于指令_bang_add(dst_add,src_add,src_add,size_add)中dst_add这一操作数,编译器可生成如下的访存越界检查代码:
其中,由于硬件要求_bang_add(dst_add,src_add,src_add,size_add)中涉及dst_add,src_add,src_add的三个操作数必须位于NRAM空间,因此对于dst_add这一操作数的访存越界检查,只需将其操作数信息与NRAM空间对应的数组集合的数组进行比较,而NRAM空间对应的数组集合为:
NRAM_BUF_SET={<A1,128*sizeof(float)>,<A2,256*sizeof(float)>};其中,该数据集合中包括两个数组:第一个数组<A1,128*sizeof(float)>和第二个数组<A2,256*sizeof(float)>。
因此,需要将dst_add的操作数信息对应的存储空间范围与目标存储空间NRAM空间对应的数组集合中的两个数组对应的存储空间范围进行比较。其中第一个if语句为将操作数信息对应的存储空间范围与第一个数组对应的存储空间范围进行比较,第二个if语句为将操作数信息对应的存储空间范围与第二个数组对应的存储空间范围进行比较。其中flag为表征越界的变量,若操作数信息对应的存储空间未落入当前比较的数组对应的存储空间范围,则保持变量值不变;若操作数信息对应的存储空间未落入当前比较的数组对应的存储空间范围,则将变量的值修改为true(或1)。第三个if语句为判断操作代码,若flag的值为false(或0),则!flag的值为true(或1),则确定访存操作出现越界,输出访存越界的通知信息,可直接结束程序;若flag的值为true(或1),则!flag的值为false(或0),确定不输出访存越界的通知信息,也即访存操作未越界。
需要说明的是,上述示例中仅示出了_bang_add(dst_add,src_add,src_add,size_add)中dst_add这一操作数对应的访存越界检查代码,类似的,对于bang-add中的其他两个操作数src-add也应按照类似的方式生成访存越界检查代码,此处不再一一示例。
由上述访存越界检查代码可见,访存越界检查代码都是标量指令,插入到程序代码中的访存越界代码不会涉及额外的存储访问,而且标指令执行速度较快,从而保证了较低的越界检查开销。
作为一种可选地实施例,上述实施例中访存越界检查代码的插桩可以是以基本块(basic block)为粒度进行的,也即将当前基本块中的访存操作对应的访存越界检查代码,插入当前基本块中的访存操作的代码之前。由于基本块内不存在分支(例如if、else),因此对于同一个操作数信息只需要生成一个生成访存越界检查代码,仅进行一次访存越界检查即可,不需要重复处理,以降低运行时开销。
为了实现在当前基本块中同一个操作数只进行一次访存越界检查代码的生成和插桩,本实施例可以提供一个操作数信息集合,操作数信息集合是已完成插桩访存越界检查代码的历史操作数信息的集合,其中包括当前基本块中已完成插桩访存越界检查代码的历史操作数信息。在每次完成该操作数的访存越界检查代码插桩之后,可以将操作数对应的操作数信息加入操作数信息集合中,也即表征在当前基本块中该操作数信息已经进行访存越界检查代码的生成和插桩。
进一步的,如图3所示,上述方法还包括:
S301、将所述操作数信息与操作数信息集合进行匹配;
S302、若所述操作数信息与所述操作数信息集合中任意历史操作数信息均不重复,则根据所述操作数信息以及所述全局数组,生成访存越界检查代码。
在本实施例中,在每次需要生成访存越界检查代码时,可将当前的操作数信息与操作数信息集合进行匹配,判断当前的操作数信息是否与操作数信息集合中的历史操作数信息重复,若出现重复,则说明当前的操作数信息已经进行过访存越界检查代码的生成和插桩,无需再次进行访存越界检查代码的生成和插桩;若操作数信息与操作数信息集合中任意历史操作数信息均不重复,则说明当前的操作数信息未进行过访存越界检查代码的生成和插桩,可继续根据操作数信息以及全局数组,生成访存越界检查代码以及将访存越界检查代码插入访存操作的代码之前。
以上述示例所示的程序代码为例,在对于dst_add的这一操作数的访存越界检查代码完成插桩后,编译器会将dst_add对应的操作数信息<dst_add,size_add>放入操作数信息集合中。
需要注意的是,在进行操作数信息的重复性检查时,需要在操作数的地址和长度信息均一致时,才能认定为同一操作数信息,通过查找历史信息来避免重复操作,如地址或长度中的任一不相同,都需要生成和插桩新的访存越界检查代码。例如上述示例中虽然指令_memcpy的操作数dst_add与指令_bang_add的目的操作数是同一个地址,但是二者对应的操作数长度size不同,因此在处理_memcpy的源操作数时,仍然需要重新对_memcpy的源操作数dst_add生成访存越界检查代码并插桩。而指令_bang_add的两个源操作数均为src_add,因此,在完成其中一个源操作数src_add的越界检查代码的生成与插桩之后,无需对另一个源操作数src_add进行重复地越界检查代码生成和插桩。
可选的,操作数信息集合包括不同存储空间对应的操作数信息集合,该操作数信息集合的划分可与上文中对于全局数组中数组集合的划分保持一致。例如,在本申请实施例中可针对NRAM、WRAM、SRAM、LDRAM、GDRAM分别配置对应的操作数信息集合:
NRAM_OPERAND_SET;
WRAM_OPERAND_SET;
SRAM_OPERAND_SET;
LDRAM_OPERAND_SET;
GDRAM_OPERAND_SET。
需要说明的是,操作数信息集合只存在于编译期,不增加运行时的存储开销,且操作数信息集合数量不限定5个,与硬件实际的存储层级相关。在硬件具有其他存储层级的情况下,该操作数信息集合的数量还可以是其他可能的数量,如两个或三个等,此处不做具体限定。
进一步的,在将操作数信息与操作数信息集合进行匹配时,可将操作数信息与操作数信息所属的目标存储空间对应的操作数信息集合进行匹配,而无需将操作数信息与全部操作数信息集合进行匹配,缩小匹配范围。在每次完成一个操作数对应的访存越界检查代码的插桩之后,可以将该操作数对应的操作数信息加入所述目标存储空间对应的操作数信息集合。
以上述示例所示的程序代码为例,完成对_bang_add和_memcpy中操作数的越界检查代码的插桩后,五个操作数信息集合的情况如下:
NRAM_OPERAND_SET={<dst_add,size_add>,<src_add,size_add>,
<dst_add,size_memcpy>}
LDRAM_OPERAND_SET={<dst_memcpy,size_memcpy>}
WRAM_OPERAND_SET=SRAM_OPERAND_SET=GDRAM_OPERAND_SET={}。
此外,在完成当前基本块中所有访存操作的访存越界检查代码插桩后,对所述操作数信息集合进行清空,以便不影响对下一基本块的处理。
在另一可选实施例中,访存越界检查代码的插桩也可不以基本块为粒度进行,即可以在程序代码中的每个访存操作之前都插入访存越界检查代码,该访存越界代码可以包括访存操作的所有操作数相关的越界检查代码。而为了降低运行时开销,避免重复插桩,在将访存越界检查代码插入程序代码之后,可通过编译器公共子表达式删除优化,删除重复的操作数信息对应的访存越界检查代码。其中编译器公共子表达式删除优化是一个普遍应用于编译器的经典优化技术,可通过该技术优化访存越界检查代码,避免重复插桩。
图4为本申请一个实施例提供的访存越界检测装置的结构示意图,如图4所示,本实施例提供的访存越界检测装置可以为编译器或者具有编译功能的其他电子设备,则本实施例提供的访存越界检测装置40包括:全局数组获取模块41、操作数信息获取模块42、生成模块43、插桩模块44。
其中,全局数组获取模块41,用于获取程序代码中声明的全局数组;
操作数信息获取模块42,用于获取所述程序代码中的访存操作的操作数信息;
生成模块43,用于根据所述操作数信息以及所述全局数组,生成访存越界检查代码;
插桩模块44,用于将所述访存越界检查代码插入所述访存操作的代码之前,生成程序代码的目标代码,其中所述访存越界检查代码用于在执行所述访存操作的代码前执行以进行访存越界检查。
在本申请的一个或多个实施例中,将所述全局数组划分为多个不同的数组集合,每一个数组集合对应一个存储空间。
在本申请的一个或多个实施例中,所述生成模块43在根据所述操作数信息以及所述全局数组,生成访存越界检查代码时,用于:
确定所述操作数信息所属的目标存储空间;
根据所述操作数信息以及所述目标存储空间对应的数组集合,生成所述访存越界检查代码。
在本申请的一个或多个实施例中,所述生成模块43在根据所述操作数信息以及所述目标存储空间对应的数组集合,生成所述访存越界检查代码时,用于:
根据所述操作数信息以及所述目标存储空间对应的数组集合,生成将所述操作数信息对应的存储空间与所述目标存储空间对应的数组集合中各数组对应的存储空间范围比较的代码,确定为所述访存越界检查代码。
在本申请的一个或多个实施例中,所述操作数信息包括第一起始地址和操作数长度,所述生成模块43在根据所述操作数信息以及所述目标存储空间对应的数组集合,生成将所述操作数信息对应的存储空间与所述目标存储空间对应的数组集合中各数组对应的存储空间范围比较的代码时,用于:
针对所述目标存储空间对应的数组集合中的任一数组,生成比较操作代码和赋值操作代码,其中所述比较操作代码用于将所述第一起始地址和该数组的第二起始地址比较、以及将所述第一起始地址和所述操作数长度之和与该数组的第二起始地址和第二长度之和比较,所述赋值操作代码用于根据比较结果对表征越界的变量赋值。
在本申请的一个或多个实施例中,所述生成模块43还用于:
生成判断操作代码,其中所述判断操作代码用于根据表征越界的变量的值,确定执行访存操作、或输出访存越界的通知信息。
在本申请的一个或多个实施例中,所述插桩模块44在将所述访存越界检查代码插入所述访存操作的代码之前时,用于:
以基本块的粒度,将当前基本块中的访存操作对应的访存越界检查代码,插入当前基本块中的访存操作的代码之前。
在本申请的一个或多个实施例中,所述生成模块43在根据所述操作数信息以及所述全局数组,生成访存越界检查代码时,用于:
将所述操作数信息与操作数信息集合进行匹配,其中所述操作数信息集合中包括所述访存操作的代码所在的当前基本块中已完成插桩访存越界检查代码的历史操作数信息;
若所述操作数信息与所述操作数信息集合中任意历史操作数信息均不重复,则根据所述操作数信息以及所述全局数组,生成访存越界检查代码;
所述插桩模块44在将所述访存越界检查代码插入所述访存操作的代码之前后,还用于:
将所述操作数信息加入所述操作数信息集合。
在本申请的一个或多个实施例中,所述操作数信息集合包括不同存储空间对应的操作数信息集合;
所述生成模块43在将所述操作数信息与操作数信息集合进行匹配时,用于:
将所述操作数信息与所述操作数信息所属的目标存储空间对应的操作数信息集合进行匹配;
所述插桩模块44在将所述操作数信息加入所述操作数信息集合时,用于:
将所述操作数信息加入所述目标存储空间对应的操作数信息集合。
在本申请的一个或多个实施例中,所述插桩模块44还用于:
在完成当前基本块中所有访存操作的访存越界检查代码插桩后,对所述操作数信息集合进行清空。
在本申请的一个或多个实施例中,所述插桩模块44在将所述访存越界检查代码插入所述访存操作的代码之前后,还用于:
通过编译器公共子表达式删除优化,删除重复的操作数信息对应的访存越界检查代码。
本实施例提供的访存越界检测装置可以执行图2及图3所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。
图5为本申请另一个实施例提供的访存越界检测装置的结构示意图,如图5所示,本申请实施例提供的访存越界检测装置50,包括:至少一个处理器51及存储器52;
存储器52存储计算机执行指令;
至少一个处理器51执行存储器52存储的计算机执行指令,使得至少一个处理器执行图2及图3任意一个实施例提供的访存越界检测方法。
在一种可能的实现方式中,还公开了一种计算机可读存储介质,计算机可读存储介质中存储有计算机程序,计算机程序被至少一个处理器执行时,实现图2及图3任意一个实施例提供的访存越界检测方法。
在一种可能的实现方式中,上述的面向流式计算的硬件处理器可以是图8或9所示的处理器结构,进一步地该处理器可以集成于板卡中,其中面向流式计算硬件处理器可以是IPU或GPU等,本申请不做限定。
在一种可能的实现方式中,还公开了一种板卡,板卡可为设备端的板卡。图6示出本申请实施例的一种板卡60的结构示意图。如图6所示,板卡60包括芯片601,其是一种系统级芯片(System on Chip,SoC),或称片上系统,集成有一个或多个组合处理装置,组合处理装置是一种人工智能运算单元,用以支持各类深度学习和机器学习算法,满足计算机视觉、语音、自然语言处理、数据挖掘等领域复杂场景下的智能处理需求。特别是深度学习技术大量应用在云端智能领域,云端智能应用的一个显著特点是输入数据量大,对平台的存储能力和计算能力有很高的要求,此实施例的板卡60适用在云端智能应用,具有庞大的片外存储、片上存储和强大的计算能力。
芯片601通过对外接口装置602与外部设备603相连接。外部设备603例如是服务器、计算机、摄像头、显示器、鼠标、键盘、网卡或wifi接口等。待处理的数据可以由外部设备603通过对外接口装置602传递至芯片601。芯片601的计算结果可以经由对外接口装置602传送回外部设备603。根据不同的应用场景,对外接口装置602可以具有不同的接口形式,例如PCIe接口等。
板卡60还包括用于存储数据的存储器件604,其包括一个或多个存储单元605。存储器件604通过总线与控制器件606和芯片601进行连接和数据传输。板卡60中的控制器件606配置用于对芯片601的状态进行调控。为此,在一个应用场景中,控制器件606可以包括单片机(Micro Controller Unit,MCU)。
在一种可能的实现方式中,还提供了一种组合处理装置,图7是示出此实施例的芯片601中的组合处理装置的结构图。如图7中所示,组合处理装置70包括计算装置701、接口装置702、处理装置703和存储装置704。
计算装置701配置成执行用户指定的操作,主要实现为单核智能处理器或者多核智能处理器,用以执行深度学习或机器学习的计算,其可以通过接口装置702与处理装置703进行交互,以共同完成用户指定的操作。
接口装置702用于在计算装置701与处理装置703间传输数据和控制指令。例如,计算装置701可以经由接口装置702从处理装置703中获取输入数据,写入计算装置701片上的存储装置。进一步,计算装置701可以经由接口装置702从处理装置703中获取控制指令,写入计算装置701片上的控制缓存中。替代地或可选地,接口装置702也可以读取计算装置701的存储装置中的数据并传输给处理装置703。
处理装置703作为通用的处理装置,执行包括但不限于数据搬运、对计算装置701的开启和/或停止等基本控制。根据实现方式的不同,处理装置703可以是中央处理器(central processing unit,CPU)、图形处理器(graphics processing unit,GPU)或其他通用和/或专用处理器中的一种或多种类型的处理器,这些处理器包括但不限于数字信号处理器(digital signal processor,DSP)、专用集成电路(application specificintegrated circuit,ASIC)、现场可编程门阵列(field-programmable gate array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等,并且其数目可以根据实际需要来确定。如前,仅就本申请的计算装置701而言,其可以视为具有单核结构或者同构多核结构。然而,当将计算装置701和处理装置703整合共同考虑时,二者视为形成异构多核结构。
存储装置704用以存储待处理的数据,其可以是DRAM704,为DDR内存,大小通常为16G或更大,用于保存计算装置701和/或处理装置703的数据。
图8示出了计算装置701为单核的内部结构示意图。单核计算装置801用以处理计算机视觉、语音、自然语言、数据挖掘等输入数据,单核计算装置801包括三大模块:控制模块81、运算模块82及存储模块83。
控制模块81用以协调并控制运算模块82和存储模块83的工作,以完成深度学习的任务,其包括取指单元(instruction fetch unit,IFU)811及指令译码单元(instructiondecode unit,IDU)812。取指单元811用以获取来自处理装置1203的指令,指令译码单元812则将获取的指令进行译码,并将译码结果作为控制信息发送给运算模块82和存储模块83。
运算模块82包括向量运算单元821及矩阵运算单元822。向量运算单元821用以执行向量运算,可支持向量乘、加、非线性变换等复杂运算;矩阵运算单元822负责深度学习算法的核心计算,即矩阵乘及卷积。
存储模块83用来存储或搬运相关数据,包括神经元存储单元(neuron RAM,NRAM)831、参数存储单元(weight RAM,WRAM)832、直接内存访问模块(direct memory access,DMA)833。NRAM 831用以存储输入神经元、输出神经元和计算后的中间结果;WRAM 832则用以存储深度学习网络的卷积核,即权值;DMA 833通过总线84连接DRAM 704,负责单核计算装置801与DRAM 704间的数据搬运。
图9示出了计算装置701为多核的内部结构示意图。多核计算装置901采用分层结构设计,多核计算装置901作为一个片上系统,其包括至少一个集群(cluster),每个集群又包括多个处理器核,换言之,多核计算装置901是以片上系统-集群-处理器核的层次所构成的。
以片上系统的层级来看,如图9所示,多核计算装置901包括外部存储控制器901、外设通信模块902、片上互联模块903、同步模块904以及多个集群905。
外部存储控制器901可以有多个,在图中示例性地展示2个,其用以响应处理器核发出的访问请求,访问外部存储设备,例如图7中的DRAM 704,从而自片外读取数据或是将数据写入。外设通信模块902用以通过接口装置702接收来自处理装置703的控制信号,启动计算装置701执行任务。片上互联模块903将外部存储控制器901、外设通信模块902及多个集群905连接起来,用以在各个模块间传输数据和控制信号。同步模块904是一种全局同步屏障控制器(global barrier controller,GBC),用以协调各集群的工作进度,确保信息的同步。多个集群905是多核计算装置901的计算核心,在图中示例性地展示4个,4个集群905形成如图1中的4个象限。随着硬件的发展,本申请的多核计算装置901还可以包括8个、16个、64个、甚至更多的集群905。集群905用以高效地执行深度学习算法。
以集群的层级来看,如图9所示,每个集群905包括多个处理器核(IPU core)906及一个存储核(MEM core)907。示例性的,每个集群905包括4个处理器核和1个存储器,存储器可以为DRAM704。每个处理器核相当于图1中的一个运算单元,每个存储器相当于图1中的一个存储单元。
处理器核906在图中示例性地展示4个,本申请不限制处理器核906的数量。其内部架构如图10所示。每个处理器核906类似于图8的单核计算装置801,同样包括三大模块:控制模块1001、运算模块1002及存储模块1003。控制模块1001、运算模块1002及存储模块1003的功用及结构大致与控制模块81、运算模块82及存储模块83相同,控制模块1001包括取指单元10011和指令译码单元10012。运算模块1002包括向量运算单元10021和矩阵运算单元10022。不再赘述。需特别说明的是,存储模块1003包括输入/输出直接内存访问模块(input/output direct memory access,IODMA)10033、搬运直接内存访问模块(movedirect memory access,MVDMA)10034。IODMA 10033通过广播总线909控制NRAM 10031/WRAM 10032与DRAM 704的访存;MVDMA 10034则用以控制NRAM 10031/WRAM 10032与存储单元(SRAM)908的访存。
回到图7,存储核907主要用以存储和通信,即存储处理器核906间的共享数据或中间结果、以及执行集群905与DRAM 704之间的通信、集群905间彼此的通信、处理器核906间彼此的通信等。在其他实施例中,存储核907具有标量运算的能力,用以执行标量运算。
存储核907包括SRAM 908、广播总线909、集群直接内存访问模块(cluster directmemory access,CDMA)910及全局直接内存访问模块(global direct memory access,GDMA)911。SRAM 908承担高性能数据中转站的角色,在同一个集群905内不同处理器核906之间所复用的数据不需要通过处理器核906各自向DRAM 704获得,而是经SRAM 908在处理器核906间中转,存储核907只需要将复用的数据从SRAM 908迅速分发给多个处理器核906即可,以提高核间通讯效率,亦大大减少片上片外的输入/输出访问。
广播总线909、CDMA 910及GDMA 911则分别用来执行处理器核906间的通信、集群905间的通信和集群905与DRAM 704的数据传输。以下将分别说明。
广播总线909用以完成集群905内各处理器核906间的高速通信,此实施例的广播总线909支持核间通信方式包括单播、多播与广播。单播是指点对点(例如单一处理器核至单一处理器核)的数据传输,多播是将一份数据从SRAM 908传输到特定几个处理器核906的通信方式,而广播则是将一份数据从SRAM 908传输到所有处理器核906的通信方式,属于多播的一种特例。
CDMA 910用以控制在同一个计算装置701内不同集群905间的SRAM908的访存。
GDMA 911与外部存储控制器901协同,用以控制集群905的SRAM 908到DRAM 704的访存,或是将数据自DRAM 704读取至SRAM 908中。从前述可知,DRAM 704与NRAM 10031或WRAM 10032间的通信可以经由2个渠道来实现。第一个渠道是通过IODAM 10033直接联系DRAM 704与NRAM 10031或WRAM 10032;第二个渠道是先经由GDMA 911使得数据在DRAM 704与SRAM 908间传输,再经过MVDMA 10034使得数据在SRAM908与NRAM 10031或WRAM 10032间传输。虽然表面上看来第二个渠道需要更多的元件参与,数据流较长,但实际上在部分实施例中,第二个渠道的带宽远大于第一个渠道,因此DRAM 704与NRAM 10031或WRAM 10032间的通信通过第二个渠道可能更有效率。本申请的实施例可根据本身硬件条件选择数据传输渠道。
在其他实施例中,GDMA 911的功能和IODMA 10033的功能可以整合在同一部件中。本申请为了方便描述,将GDMA 911和IODMA 10033视为不同部件,对于本领域技术人员来说,只要其实现的功能以及达到的技术效果与本申请类似,即属于本申请的保护范围。进一步地,GDMA 911的功能、IODMA 10033的功能、CDMA 910的功能、MVDMA 10034的功能亦可以由同一部件来实现。
依据以下条款可更好地理解前述内容(The foregoing may be betterunderstood in view of the following clauses):
条款1、一种访存越界检测方法,包括:
获取程序代码中声明的全局数组;
获取所述程序代码中的访存操作的操作数信息;
根据所述操作数信息以及所述全局数组,生成访存越界检查代码;
将所述访存越界检查代码插入所述访存操作的代码之前,生成程序代码的目标代码,其中所述访存越界检查代码用于在执行所述访存操作的代码前执行以进行访存越界检查。
条款2、根据条款1所述的方法,所述全局数组包括多个不同的数组集合,每一个数组集合对应一个存储空间。
条款3、根据条款2所述的方法,所述根据所述操作数信息以及所述全局数组,生成访存越界检查代码,包括:
确定所述操作数信息所属的目标存储空间;
根据所述操作数信息以及所述目标存储空间对应的数组集合,生成所述访存越界检查代码。
条款4、根据条款2所述的方法,所述根据所述操作数信息以及所述目标存储空间对应的数组集合,生成所述访存越界检查代码,包括:
根据所述操作数信息以及所述目标存储空间对应的数组集合,生成将所述操作数信息对应的存储空间与所述目标存储空间对应的数组集合中各数组对应的存储空间范围比较的代码,确定为所述访存越界检查代码。
条款5、根据条款4所述的方法,所述操作数信息包括第一起始地址和操作数长度,所述根据所述操作数信息以及所述目标存储空间对应的数组集合,生成将所述操作数信息对应的存储空间与所述目标存储空间对应的数组集合中各数组对应的存储空间范围比较的代码,包括:
针对所述目标存储空间对应的数组集合中的任一数组,生成比较操作代码和赋值操作代码,其中所述比较操作代码用于将所述第一起始地址和该数组的第二起始地址比较、以及将所述第一起始地址和所述操作数长度之和与该数组的第二起始地址和第二长度之和比较,所述赋值操作代码用于根据比较结果对表征越界的变量赋值。
条款6、根据条款5所述的方法,所述方法还包括:
生成判断操作代码,其中所述判断操作代码用于根据表征越界的变量的值,确定执行访存操作、或输出访存越界的通知信息。
条款7、根据条款1-6任一项所述的方法,所述将所述访存越界检查代码插入所述访存操作的代码之前,包括:
以基本块的粒度,将当前基本块中的访存操作对应的访存越界检查代码,插入当前基本块中的访存操作的代码之前。
条款8、根据条款7所述的方法,所述根据所述操作数信息以及所述全局数组,生成访存越界检查代码,包括:
将所述操作数信息与操作数信息集合进行匹配,其中所述操作数信息集合中包括所述访存操作的代码所在的当前基本块中已完成插桩访存越界检查代码的历史操作数信息;
若所述操作数信息与所述操作数信息集合中任意历史操作数信息均不重复,则根据所述操作数信息以及所述全局数组,生成访存越界检查代码;
所述将所述访存越界检查代码插入所述访存操作的代码之前后,还包括:
将所述操作数信息加入所述操作数信息集合。
条款9、根据条款8所述的方法,所述操作数信息集合包括不同存储空间对应的操作数信息集合;
所述将所述操作数信息与操作数信息集合进行匹配,包括:
将所述操作数信息与所述操作数信息所属的目标存储空间对应的操作数信息集合进行匹配;
所述将所述操作数信息加入所述操作数信息集合,包括:
将所述操作数信息加入所述目标存储空间对应的操作数信息集合。
条款10、根据条款8所述的方法,还包括:
在完成当前基本块中所有访存操作的访存越界检查代码插桩后,对所述操作数信息集合进行清空。
条款11、根据条款1-7任一项所述的方法,所述将所述访存越界检查代码插入所述访存操作的代码之前后,还包括:
通过编译器公共子表达式删除优化,删除重复的操作数信息对应的访存越界检查代码。
条款12、一种访存越界检测装置,包括:
全局数组获取模块,用于获取程序代码中声明的全局数组;
操作数信息获取模块,用于获取所述程序代码中的访存操作的操作数信息;
生成模块,用于根据所述操作数信息以及所述全局数组,生成访存越界检查代码;
插桩模块,用于将所述访存越界检查代码插入所述访存操作的代码之前,生成程序代码的目标代码,其中所述访存越界检查代码用于在执行所述访存操作的代码前执行以进行访存越界检查。
条款13、一种访存越界检测装置,包括:至少一个处理器及存储器;
所述存储器存储计算机执行指令;
所述至少一个处理器执行所述存储器存储的计算机执行指令,使得所述至少一个处理器执行如条款1-11任一项所述的方法。
条款14、一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,所述计算机程序被至少一个处理器执行时,实现如条款1-11任一项所述的方法。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于可选实施例,所涉及的动作和模块并不一定是本申请所必须的。
进一步需要说明的是,虽然流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,流程图中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
应该理解,上述的装置实施例仅是示意性的,本申请的装置还可通过其它的方式实现。例如,上述实施例中单元/模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。例如,多个单元、模块或组件可以结合,或者可以集成到另一个系统,或一些特征可以忽略或不执行。
另外,若无特别说明,在本申请各个实施例中的各功能单元/模块可以集成在一个单元/模块中,也可以是各个单元/模块单独物理存在,也可以两个或两个以上单元/模块集成在一起。上述集成的单元/模块既可以采用硬件的形式实现,也可以采用软件程序模块的形式实现。
集成的单元/模块如果以硬件的形式实现时,该硬件可以是数字电路,模拟电路等等。硬件结构的物理实现包括但不局限于晶体管,忆阻器等等。若无特别说明,人工智能处理器可以是任何适当的硬件处理器,比如CPU、GPU、FPGA、DSP和ASIC等等。若无特别说明,存储单元可以是任何适当的磁存储介质或者磁光存储介质,比如,阻变式存储器RRAM(Resistive Random Access Memory)、动态随机存取存储器DRAM(Dynamic Random AccessMemory)、静态随机存取存储器SRAM(Static Random-Access Memory)、增强动态随机存取存储器EDRAM(Enhanced Dynamic Random Access Memory)、高带宽内存HBM(High-Bandwidth Memory)、混合存储立方HMC(Hybrid Memory Cube)等等。
集成的单元/模块如果以软件程序模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储器中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储器中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本申请各个实施例方法的全部或部分步骤。而前述的存储器包括:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。上述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。

Claims (14)

1.一种访存越界检测方法,其特征在于,包括:
获取程序代码中声明的全局数组;
获取所述程序代码中的访存操作的操作数信息;
根据所述操作数信息以及所述全局数组,生成访存越界检查代码;
将所述访存越界检查代码插入所述访存操作的代码之前,生成程序代码的目标代码,其中所述访存越界检查代码用于在执行所述访存操作的代码前执行以进行访存越界检查。
2.根据权利要求1所述的方法,其特征在于,还包括:
将所述全局数组划分为多个不同的数组集合,每一个数组集合对应一个存储空间。
3.根据权利要求2所述的方法,其特征在于,所述根据所述操作数信息以及所述全局数组,生成访存越界检查代码,包括:
确定所述操作数信息所属的目标存储空间;
根据所述操作数信息以及所述目标存储空间对应的数组集合,生成所述访存越界检查代码。
4.根据权利要求2所述的方法,其特征在于,所述根据所述操作数信息以及所述目标存储空间对应的数组集合,生成所述访存越界检查代码,包括:
根据所述操作数信息以及所述目标存储空间对应的数组集合,生成将所述操作数信息对应的存储空间与所述目标存储空间对应的数组集合中各数组对应的存储空间范围比较的代码,确定为所述访存越界检查代码。
5.根据权利要求4所述的方法,其特征在于,所述操作数信息包括第一起始地址和操作数长度,所述根据所述操作数信息以及所述目标存储空间对应的数组集合,生成将所述操作数信息对应的存储空间与所述目标存储空间对应的数组集合中各数组对应的存储空间范围比较的代码,包括:
针对所述目标存储空间对应的数组集合中的任一数组,生成比较操作代码和赋值操作代码,其中所述比较操作代码用于将所述第一起始地址和该数组的第二起始地址比较、以及将所述第一起始地址和所述操作数长度之和与该数组的第二起始地址和第二长度之和比较,所述赋值操作代码用于根据比较结果对表征越界的变量赋值。
6.根据权利要求5所述的方法,其特征在于,所述方法还包括:
生成判断操作代码,其中所述判断操作代码用于根据表征越界的变量的值,确定执行访存操作、或输出访存越界的通知信息。
7.根据权利要求1-6任一项所述的方法,其特征在于,所述将所述访存越界检查代码插入所述访存操作的代码之前,包括:
以基本块的粒度,将当前基本块中的访存操作对应的访存越界检查代码,插入当前基本块中的访存操作的代码之前。
8.根据权利要求7所述的方法,其特征在于,所述根据所述操作数信息以及所述全局数组,生成访存越界检查代码,包括:
将所述操作数信息与操作数信息集合进行匹配,其中所述操作数信息集合中包括所述访存操作的代码所在的当前基本块中已完成插桩访存越界检查代码的历史操作数信息;
若所述操作数信息与所述操作数信息集合中任意历史操作数信息均不重复,则根据所述操作数信息以及所述全局数组,生成访存越界检查代码;
所述将所述访存越界检查代码插入所述访存操作的代码之前后,还包括:
将所述操作数信息加入所述操作数信息集合。
9.根据权利要求8所述的方法,其特征在于,所述操作数信息集合包括不同存储空间对应的操作数信息集合;
所述将所述操作数信息与操作数信息集合进行匹配,包括:
将所述操作数信息与所述操作数信息所属的目标存储空间对应的操作数信息集合进行匹配;
所述将所述操作数信息加入所述操作数信息集合,包括:
将所述操作数信息加入所述目标存储空间对应的操作数信息集合。
10.根据权利要求8所述的方法,其特征在于,还包括:
在完成当前基本块中所有访存操作的访存越界检查代码插桩后,对所述操作数信息集合进行清空。
11.根据权利要求1-6任一项所述的方法,其特征在于,所述将所述访存越界检查代码插入所述访存操作的代码之前后,还包括:
通过编译器公共子表达式删除优化,删除重复的操作数信息对应的访存越界检查代码。
12.一种访存越界检测装置,其特征在于,包括:
全局数组获取模块,用于获取程序代码中声明的全局数组;
操作数信息获取模块,用于获取所述程序代码中的访存操作的操作数信息;
生成模块,用于根据所述操作数信息以及所述全局数组,生成访存越界检查代码;
插桩模块,用于将所述访存越界检查代码插入所述访存操作的代码之前,生成程序代码的目标代码,其中所述访存越界检查代码用于在执行所述访存操作的代码前执行以进行访存越界检查。
13.一种访存越界检测装置,其特征在于,包括:至少一个处理器及存储器;
所述存储器存储计算机执行指令;
所述至少一个处理器执行所述存储器存储的计算机执行指令,使得所述至少一个处理器执行如权利要求1-11任一项所述的方法。
14.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机程序,所述计算机程序被至少一个处理器执行时,实现如权利要求1-11任一项所述的方法。
CN202211123972.0A 2022-09-15 2022-09-15 访存越界检测方法、装置及存储介质 Pending CN117742715A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211123972.0A CN117742715A (zh) 2022-09-15 2022-09-15 访存越界检测方法、装置及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211123972.0A CN117742715A (zh) 2022-09-15 2022-09-15 访存越界检测方法、装置及存储介质

Publications (1)

Publication Number Publication Date
CN117742715A true CN117742715A (zh) 2024-03-22

Family

ID=90281799

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211123972.0A Pending CN117742715A (zh) 2022-09-15 2022-09-15 访存越界检测方法、装置及存储介质

Country Status (1)

Country Link
CN (1) CN117742715A (zh)

Similar Documents

Publication Publication Date Title
CN106991011B (zh) 基于cpu多线程与gpu多粒度并行及协同优化的方法
Hsieh et al. Transparent offloading and mapping (TOM) enabling programmer-transparent near-data processing in GPU systems
US8364739B2 (en) Sparse matrix-vector multiplication on graphics processor units
WO2020083050A1 (zh) 一种数据流处理方法及相关设备
CN111433758A (zh) 可编程运算与控制芯片、设计方法及其装置
CN105556503B (zh) 动态的存储器控制方法及其系统
EP3726382A1 (en) Deep learning thread communication
CN112799726A (zh) 数据处理装置、方法及相关产品
US20210334234A1 (en) Distributed graphics processor unit architecture
RU2643499C2 (ru) Управление памятью
CN113590508B (zh) 动态可重构的内存地址映射方法及装置
CN112465133B (zh) 控制流多核并行方法、计算机设备和存储介质
CN114035916A (zh) 计算图的编译、调度方法及相关产品
CN112130901A (zh) 基于risc-v的协处理器、数据处理方法及存储介质
WO2022253075A1 (zh) 一种编译方法及相关装置
US10684834B2 (en) Method and apparatus for detecting inter-instruction data dependency
WO2024149112A1 (zh) 卷积算子的编译方法及相关产品
CN117742715A (zh) 访存越界检测方法、装置及存储介质
WO2019080091A1 (zh) 代码处理方法和设备
CN115794604B (zh) 数据生成方法、装置、设备、介质及程序产品
CN102982009A (zh) 一种用于众核处理器的函数处理方法及系统
CN113742266B (zh) 集成电路装置、电子设备、板卡和计算方法
WO2023045478A1 (zh) 图任务调度方法、执行端设备、存储介质及程序产品
CN113791996B (zh) 集成电路装置、电子设备、板卡和计算方法
CN112035394B (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