应用程序容错处理方法、装置及存储介质与流程
未命名
07-14
阅读:70
评论:0

1.本技术涉及计算机技术领域,尤其涉及一种应用程序容错处理方法、装置及存储介质。
背景技术:
2.随着半导体工艺节点不断向前推进,处理器(例如中央处理器(central processing unit,cpu)、图形处理器(graphics processing unit,gpu)、神经网络处理器(neural-network processing unit,npu)等)的晶体管密度在不断增加,但其可靠性却在逐渐降低。例如,大型的计算集群或数据中心通常通过处理器执行大量的计算任务,而处理器在执行计算任务的过程中,有时会发生瞬时错误(transient error),从而导致计算错误(例如计算结果错误、用于完成计算任务的应用程序崩溃等)。
3.在计算正确性至关重要的领域(例如科学计算、金融计算、数据库服务等领域),在具备有效的计算错误检测机制的情况下,通常通过重运行机制来修复计算错误。重运行机制假设计算错误是处理器部件偶然发生的瞬时错误造成的,重新运行一次出错的计算任务就能够极大概率得到正确的结果。
4.目前的重运行机制通常基于检查点(checkpoint)或者基于编译阶段确定的幂等区域(idempotent region)。其中,基于检查点的重运行机制,虽然适用于大多数计算场景,但是建立检查点和从检查点恢复计算任务通常涉及大量的内存复制操作,性能较差;而基于编译阶段确定的幂等区域的重运行机制,则依赖于编译器对应用程序的幂等性分析,无法在运行时调整,局限性较大。
技术实现要素:
5.有鉴于此,提出了一种应用程序容错处理方法、装置及存储介质。
6.第一方面,本技术的实施例提供了一种应用程序容错处理方法,所述方法包括:运行应用程序,所述应用程序用于完成预设的计算任务;在所述应用程序运行过程中,标记并跟踪抽象函数及所述抽象函数的接口参数,所述抽象函数用于指示所述应用程序中的预设级别的功能模块,所述抽象函数的接口参数包括输入参数及输出参数,所述输入参数为存储所述功能模块的输入数据的内存区域,所述输出参数为存储所述功能模块的输出数据的内存区域;在检测到所述应用程序出现计算错误的情况下,从所述抽象函数中,确定发生所述计算错误的目标抽象函数;根据所述目标抽象函数的接口参数,判断所述目标抽象函数是否具有幂等性;在所述目标抽象函数具有幂等性的情况下,重新运行所述目标抽象函数,以修复所述计算错误。
7.本技术的实施例,能够在应用程序运行过程中,根据预设级别,标记并跟踪抽象函数及其接口参数,并在检测到计算错误的情况下,确定发生计算错误的目标抽象函数,然后根据目标抽象函数的接口参数,判断目标抽象函数的幂等性,在目标抽象函数具有幂等性的情况下,重新运行目标抽象函数,以修复计算错误,从而不仅能够实现动态的、应用程序
运行时的幂等性分析,使得应用程序的幂等性分析不再依赖于特殊设计的编译器或硬件,而且能够支持可调整的容错粒度,提高了本技术实施例的应用程序容错处理方法的通用性及容错性能。
8.根据第一方面,在所述应用程序容错处理方法的第一种可能的实现方式中,所述接口参数具有版本号,所述版本号用于指示所述接口参数的数据存放状态,所述标记并跟踪抽象函数及所述抽象函数的接口参数,包括:在所述应用程序运行过程中,根据所述预设级别,识别所述应用程序中的功能模块,将识别出的功能模块标记为抽象函数;确定所述抽象函数的接口参数及所述接口参数的版本号;根据所述抽象函数的接口参数及所述接口参数的版本号,更新参数全局版本表及参数局部版本表,其中,所述参数全局版本表用于记录所述应用程序的所有抽象函数的接口参数的最新版本号,所述参数局部版本表用于记录所述应用程序的各个抽象函数运行时的接口参数的版本号。
9.本技术的实施例,能够在应用程序运行过程中,根据预设级别,识别应用程序中的功能模块,并将识别出的功能模块标记为抽象函数,然后确定抽象函数的接口参数及其版本号,并根据抽象函数的接口参数及其版本号,更新参数全局版本表及参数局部版本表,从而可以在应用程序运行过程中,标记抽象函数及其接口参数,并通过简单的数据结构(参数全局版本表pgvmap及参数局部版本表plvmap)来跟踪抽象函数的接口参数(输入参数及输出参数)指示的内存区的版本变化(即读写历史),实现对抽象函数及其接口参数的标记及跟踪,复杂度低,开销小,能够提高标记及跟踪抽象函数及其接口参数时的处理效率。
10.根据第一方面的第一种可能的实现方式,在所述应用程序容错处理方法的第二种可能的实现方式中,所述根据所述抽象函数的接口参数及所述接口参数的版本号,更新参数全局版本表及参数局部版本表,包括:将所述抽象函数的标识符及所述抽象函数的接口参数的标识符及版本号,加入参数局部版本表中。
11.本技术的实施例,更新参数局部版本表时,能够将抽象函数的标识符及抽象函数的接口参数的标识符及版本号,加入参数局部版本表中,从而能够实现参数局部版本表的动态更新及维护,提高参数局部版本表的准确性。
12.根据第一方面的第一种可能的实现方式或者第一方面的第二种可能的实现方式,在所述应用程序容错处理方法的第三种可能的实现方式中,所述根据所述抽象函数的接口参数及所述接口参数的版本号,更新参数全局版本表及参数局部版本表,包括:在参数全局版本表中存在所述抽象函数的接口参数的情况下,更新所述参数全局版本表中所述抽象函数的接口参数的版本号;或在所述参数全局版本表中不存在所述抽象函数的接口参数的情况下,将所述抽象函数的接口参数的标识符及版本号,加入所述参数全局版本表中。
13.本技术的实施例,更新参数全局版本表时,在参数全局版本表中存在抽象函数的接口参数的情况下,更新参数全局版本表中抽象函数的接口参数的版本号;在参数全局版本表中不存在抽象函数的接口参数的情况下,将抽象函数的接口参数的标识符及版本号,加入参数全局版本表中,从而能够实现参数全局版本表的动态更新及维护,提高参数全局版本表的准确性。
14.根据第一方面的第一种可能的实现方式至第一方面的第三种可能的实现方式中的任意一种,在所述应用程序容错处理方法的第四种可能的实现方式中,所述根据所述抽象函数的接口参数及所述接口参数的版本号,更新参数全局版本表及参数局部版本表,包
括:在所述接口参数被所述应用程序的抽象函数之外的其他操作修改的情况下,更新所述参数全局版本表中所述接口参数的版本号;将所述参数局部版本表中,版本号低于所述参数全局版本表中的版本号的所述接口参数,标记为无效。
15.本技术的实施例,在抽象函数的接口参数被应用程序的抽象函数之外的其他操作修改的情况下,更新参数全局版本表中该接口参数的版本号,并将参数局部版本表中,版本号低于参数全局版本表中的版本号的该接口参数标记为无效,从而能够跟踪抽象函数之外的其他操作对抽象函数的接口参数的修改,提高参数全局版本表及参数局部版本表的准确性。
16.根据第一方面的第一种可能的实现方式至第一方面的第四种可能的实现方式中的任意一种,在所述应用程序容错处理方法的第五种可能的实现方式中,所述根据所述目标抽象函数的接口参数,判断所述目标抽象函数是否具有幂等性,包括:判断所述参数局部版本表中所述目标抽象函数的接口参数的标识符中,是否存在相同的标识符;在不存在相同的标识符的情况下,确定所述目标抽象函数具有幂等性。
17.本技术的实施例,通过判断参数局部版本表中目标抽象函数的接口参数的标识符中是否存在相同的标识符,并在不存在相同的标识符的情况下,确定目标抽象函数具有幂等性,实现了基于参数局部版本表的运行时幂等性分析,简单快速,从而能够提高处理效率。
18.根据第一方面的第一种可能的实现方式至第一方面的第五种可能的实现方式中的任意一种,在所述应用程序容错处理方法的第六种可能的实现方式中,所述方法还包括:在所述目标抽象函数不具有幂等性的情况下,在所述抽象函数中,搜索重运行集合,所述重运行集合用于指示为修复所述计算错误所必须重新运行的最小抽象函数的集合;在所述重运行集合搜索成功的情况下,运行所述重运行集合,以修复所述计算错误。
19.本技术的实施例,在目标抽象函数不具有幂等性的情况下,在抽象函数中搜索重运行集合,并在重运行集合搜索成功的情况下,运行重运行集合来修复计算错误,从而能够通过包括多个抽象函数的重运行集合来修复计算错误。
20.根据第一方面的第六种可能的实现方式,在所述应用程序容错处理方法的第七种可能的实现方式中,所述在所述抽象函数中,搜索重运行集合,包括:根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合。
21.本技术的实施例,能够根据参数局部版本表及参数全局版本表,从抽象函数中搜索重运行集合。由于参数局部版本表及参数全局版本表为简单的数据结构,根据参数局部版本表及参数全局版本表,从抽象函数中搜索重运行集合,简单快速,能够提高重运行集合的搜索效率。
22.根据第一方面的第七种可能的实现方式,在所述应用程序容错处理方法的第八种可能的实现方式中,所述根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合,包括:将所述目标抽象函数加入重运行集合;判断所述参数局部版本表中,所述重运行集合中的所有抽象函数的接口参数中是否存在被标记为无效的第一参数;在不存在第一参数的情况下,判断所述重运行集合中的所有抽象函数的输入参数中,是否存在所述参数局部版本表中的版本号低于所述参数全局版本表中的版本号的第二参数;在存在所述第二参数的情况下,根据所述参数局部版本表,判断所述抽象函数中,是否存在
输出参数包括所述第二参数的第一抽象函数;在所述抽象函数中存在所述第一抽象函数的情况下,判断所述重运行集合是否包括所述第一抽象函数;在所述重运行集合不包括所述第一抽象函数的情况下,将所述第一抽象函数加入所述重运行集合;从步骤所述判断所述参数局部版本表中,所述重运行集合中的所有抽象函数的接口参数中是否存在被标记为无效的第一参数开始重新执行,直到所述重运行集合包括所述第一抽象函数。
23.本技术的实施例中搜索重运行集合的过程可以称为前向搜索,通过前向搜索可以判断为了重新运行目标抽象函数,必须首先运行哪些其他的抽象函数来重新产生目标抽象函数的原始输入(即正确的输入数据)。
24.根据第一方面的第八种可能的实现方式,在所述应用程序容错处理方法的第九种可能的实现方式中,所述根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合,包括:在不存在所述第二参数或所述重运行集合包括所述第一抽象函数的情况下,判断所述重运行集合中的所有抽象函数的输出参数中,是否存在所述参数局部版本表中的版本号低于所述参数全局版本表中的版本号的第三参数;在存在所述第三参数的情况下,根据所述参数局部版本表,判断所述抽象函数中,是否存在输入参数包括所述第三参数的第二抽象函数;在所述抽象函数中存在所述第二抽象函数的情况下,判断所述重运行集合是否包括所述第二抽象函数;在所述重运行集合不包括所述第二抽象函数的情况下,将所述第二抽象函数加入所述重运行集合;从步骤所述判断所述参数局部版本表中,所述重运行集合中的所有抽象函数的接口参数中是否存在被标记为无效的第一参数开始重新执行,直到所述重运行集合包括所述第二抽象函数。
25.本技术的实施例中搜索重运行集合的过程可以称为后向搜索,通过后向搜索可以判断为了不破坏当前的内存上下文,必须重新运行哪些抽象函数,即通过后向搜索能够找到还原内存上下文到当前参数局部版本表plvmap记录的状态的抽象函数。
26.根据第一方面的第九种可能的实现方式,在所述应用程序容错处理方法的第十种可能的实现方式中,所述根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合,包括:在不存在所述第三参数或所述重运行集合包括所述第二抽象函数的情况下,所述重运行集合搜索成功。
27.本技术的实施例,在不存在第三参数或重运行集合包括第二抽象函数的情况下,确定重运行集合搜索成功,简单快速,能够提高重运行集合的搜索效率。
28.根据第一方面的第九种可能的实现方式,在所述应用程序容错处理方法的第十一种可能的实现方式中,所述根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合,包括如下任意一项:在存在所述第一参数的情况下,所述重运行集合搜索失败;在所述抽象函数中不存在所述第一抽象函数的情况下,所述重运行集合搜索失败;在所述抽象函数中不存在所述第二抽象函数的情况下,所述重运行集合搜索失败。
29.本技术的实施例,在存在第一参数的情况下,或者抽象函数中不存在第一抽象函数或第二抽象函数的情况下,确定重运行集合搜索失败,简单快速,能够提高重运行集合的搜索效率。
30.根据第一方面的第六种可能的实现方式,在所述应用程序容错处理方法的第十二种可能的实现方式中,所述运行所述重运行集合,包括:根据所述参数局部版本表,生成与所述重运行集合对应的局部控制流图;根据所述局部控制流图,运行所述重运行集合。
31.本技术的实施例,能够根据参数局部版本表,生成与重运行集合对应的局部控制流图,并根据局部控制流图,运行重运行集合,从而不仅能够在应用程序运行过程中,基于参数局部版本表,动态生成重运行集合的局部控制流图,使得局部控制流图的生成不在依赖编译时分析,而且简单快速,能够提高生成局部控制流图时的处理速度,进而提高重运行集合的运行效率。
32.根据第一方面的第六种可能的实现方式至第一方面的第十二种可能的实现方式中的任意一种,在所述应用程序容错处理方法的第十三种可能的实现方式中,所述方法还包括:在所述应用程序运行过程中,根据预设的检查点建立规则,建立至少一个检查点;在所述重运行集合搜索失败的情况下,从所述至少一个检查点中,确定出与所述目标抽象函数最近的目标检查点;从所述目标检查点开始,重新运行所述应用程序,以修复所述计算错误。
33.本技术的实施例,能够在应用程序运行过程中,根据预设的检查点建立规则,建立至少一个检查点,在重运行集合搜索失败的情况下,从至少一个检查点中,确定出与目标抽象函数最近的目标检查点,并从目标检查点开始,重新运行应用程序,从而能够在重运行集合搜索失败的情况下,从与目标抽象函数最近的检查点开始,重新运行应用程序来修复计算错误。
34.根据第一方面或者第一方面的第一种可能的实现方式至第一方面的第十三种可能的实现方式中的任意一种,在所述应用程序容错处理方法的第十四种可能的实现方式中,所述应用程序运行在包括处理器及加速器的异构计算平台上,所述标记并跟踪抽象函数及所述抽象函数的接口参数,包括:在所述应用程序运行过程中,将所述处理器发射到所述加速器的核函数,标记为抽象函数。
35.本技术的实施例,在应用程序运行在包括处理器及加速器的异构计算平台上时,在应用程序运行过程中,将处理器发射到加速器的核函数,标记为抽象函数,不仅使得抽象函数的标记与应用程序的运行平台紧密结合,而且便于封装异构计算平台(包括处理器及加速器)上的内存管理接口,来实现应用程序运行过程中的抽象函数及其接口参数的标记及跟踪。
36.第二方面,本技术的实施例提供了一种应用程序容错处理装置,所述装置包括:第一运行模块,用于运行应用程序,所述应用程序用于完成预设的计算任务;标记及跟踪模块,用于在所述应用程序运行过程中,标记并跟踪抽象函数及所述抽象函数的接口参数,所述抽象函数用于指示所述应用程序中的预设级别的功能模块,所述抽象函数的接口参数包括输入参数及输出参数,所述输入参数为存储所述功能模块的输入数据的内存区域,所述输出参数为存储所述功能模块的输出数据的内存区域;目标抽象函数确定模块,用于在检测到所述应用程序出现计算错误的情况下,从所述抽象函数中,确定发生所述计算错误的目标抽象函数;幂等性判断模块,用于根据所述目标抽象函数的接口参数,判断所述目标抽象函数是否具有幂等性;第二运行模块,用于在所述目标抽象函数具有幂等性的情况下,重新运行所述目标抽象函数,以修复所述计算错误。
37.本技术的实施例,能够在应用程序运行过程中,根据预设级别,标记并跟踪抽象函数及其接口参数,并在检测到计算错误的情况下,确定发生计算错误的目标抽象函数,然后根据目标抽象函数的接口参数,判断目标抽象函数的幂等性,在目标抽象函数具有幂等性
的情况下,重新运行目标抽象函数,以修复计算错误,从而不仅能够实现动态的、应用程序运行时的幂等性分析,使得应用程序的幂等性分析不再依赖于特殊设计的编译器或硬件,而且能够支持可调整的容错粒度,提高了本技术实施例的应用程序容错处理方法的通用性及容错性能。
38.根据第二方面,在所述应用程序容错处理装置的第一种可能的实现方式中,所述接口参数具有版本号,所述版本号用于指示所述接口参数的数据存放状态,所述标记及跟踪模块,被配置为:在所述应用程序运行过程中,根据所述预设级别,识别所述应用程序中的功能模块,将识别出的功能模块标记为抽象函数;确定所述抽象函数的接口参数及所述接口参数的版本号;根据所述抽象函数的接口参数及所述接口参数的版本号,更新参数全局版本表及参数局部版本表,其中,所述参数全局版本表用于记录所述应用程序的所有抽象函数的接口参数的最新版本号,所述参数局部版本表用于记录所述应用程序的各个抽象函数运行时的接口参数的版本号。
39.本技术的实施例,能够在应用程序运行过程中,根据预设级别,识别应用程序中的功能模块,并将识别出的功能模块标记为抽象函数,然后确定抽象函数的接口参数及其版本号,并根据抽象函数的接口参数及其版本号,更新参数全局版本表及参数局部版本表,从而可以在应用程序运行过程中,标记抽象函数及其接口参数,并通过简单的数据结构(参数全局版本表pgvmap及参数局部版本表plvmap)来跟踪抽象函数的接口参数(输入参数及输出参数)指示的内存区的版本变化(即读写历史),实现对抽象函数及其接口参数的标记及跟踪,复杂度低,开销小,能够提高标记及跟踪抽象函数及其接口参数时的处理效率。
40.根据第二方面的第一种可能的实现方式,在所述应用程序容错处理装置的第二种可能的实现方式中,所述根据所述抽象函数的接口参数及所述接口参数的版本号,更新参数全局版本表及参数局部版本表,包括:将所述抽象函数的标识符及所述抽象函数的接口参数的标识符及版本号,加入参数局部版本表中。
41.本技术的实施例,更新参数局部版本表时,能够将抽象函数的标识符及抽象函数的接口参数的标识符及版本号,加入参数局部版本表中,从而能够实现参数局部版本表的动态更新及维护,提高参数局部版本表的准确性。
42.根据第二方面的第一种可能的实现方式或者第二方面的第二种可能的实现方式,在所述应用程序容错处理装置的第三种可能的实现方式中,所述根据所述抽象函数的接口参数及所述接口参数的版本号,更新参数全局版本表及参数局部版本表,包括:在参数全局版本表中存在所述抽象函数的接口参数的情况下,更新所述参数全局版本表中所述抽象函数的接口参数的版本号;或在所述参数全局版本表中不存在所述抽象函数的接口参数的情况下,将所述抽象函数的接口参数的标识符及版本号,加入所述参数全局版本表中。
43.本技术的实施例,更新参数全局版本表时,在参数全局版本表中存在抽象函数的接口参数的情况下,更新参数全局版本表中抽象函数的接口参数的版本号;在参数全局版本表中不存在抽象函数的接口参数的情况下,将抽象函数的接口参数的标识符及版本号,加入参数全局版本表中,从而能够实现参数全局版本表的动态更新及维护,提高参数全局版本表的准确性。
44.根据第二方面的第一种可能的实现方式至第二方面的第三种可能的实现方式中的任意一种,在所述应用程序容错处理装置的第四种可能的实现方式中,所述根据所述抽
象函数的接口参数及所述接口参数的版本号,更新参数全局版本表及参数局部版本表,包括:在所述接口参数被所述应用程序的抽象函数之外的其他操作修改的情况下,更新所述参数全局版本表中所述接口参数的版本号;将所述参数局部版本表中,版本号低于所述参数全局版本表中的版本号的所述接口参数,标记为无效。
45.本技术的实施例,在抽象函数的接口参数被应用程序的抽象函数之外的其他操作修改的情况下,更新参数全局版本表中该接口参数的版本号,并将参数局部版本表中,版本号低于参数全局版本表中的版本号的该接口参数标记为无效,从而能够跟踪抽象函数之外的其他操作对抽象函数的接口参数的修改,提高参数全局版本表及参数局部版本表的准确性。
46.根据第二方面的第一种可能的实现方式至第二方面的第四种可能的实现方式中的任意一种,在所述应用程序容错处理装置的第五种可能的实现方式中,所述幂等性判断模块,被配置为:判断所述参数局部版本表中所述目标抽象函数的接口参数的标识符中,是否存在相同的标识符;在不存在相同的标识符的情况下,确定所述目标抽象函数具有幂等性。
47.本技术的实施例,通过判断参数局部版本表中目标抽象函数的接口参数的标识符中是否存在相同的标识符,并在不存在相同的标识符的情况下,确定目标抽象函数具有幂等性,实现了基于参数局部版本表的运行时幂等性分析,简单快速,从而能够提高处理效率。
48.根据第二方面的第一种可能的实现方式至第二方面的第五种可能的实现方式中的任意一种,在所述应用程序容错处理装置的第六种可能的实现方式中,所述装置还包括:重运行集合搜索模块,用于在所述目标抽象函数不具有幂等性的情况下,在所述抽象函数中,搜索重运行集合,所述重运行集合用于指示为修复所述计算错误所必须重新运行的最小抽象函数的集合;第三运行模块,用于在所述重运行集合搜索成功的情况下,运行所述重运行集合,以修复所述计算错误。
49.本技术的实施例,在目标抽象函数不具有幂等性的情况下,在抽象函数中搜索重运行集合,并在重运行集合搜索成功的情况下,运行重运行集合来修复计算错误,从而能够通过包括多个抽象函数的重运行集合来修复计算错误。
50.根据第二方面的第六种可能的实现方式,在所述应用程序容错处理装置的第七种可能的实现方式中,所述重运行集合搜索模块,被配置为:根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合。
51.本技术的实施例,能够根据参数局部版本表及参数全局版本表,从抽象函数中搜索重运行集合。由于参数局部版本表及参数全局版本表为简单的数据结构,根据参数局部版本表及参数全局版本表,从抽象函数中搜索重运行集合,简单快速,能够提高重运行集合的搜索效率。
52.根据第二方面的第七种可能的实现方式,在所述应用程序容错处理装置的第八种可能的实现方式中,所述根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合,包括:将所述目标抽象函数加入重运行集合;判断所述参数局部版本表中,所述重运行集合中的所有抽象函数的接口参数中是否存在被标记为无效的第一参数;在不存在第一参数的情况下,判断所述重运行集合中的所有抽象函数的输入参数中,是
否存在所述参数局部版本表中的版本号低于所述参数全局版本表中的版本号的第二参数;在存在所述第二参数的情况下,根据所述参数局部版本表,判断所述抽象函数中,是否存在输出参数包括所述第二参数的第一抽象函数;在所述抽象函数中存在所述第一抽象函数的情况下,判断所述重运行集合是否包括所述第一抽象函数;在所述重运行集合不包括所述第一抽象函数的情况下,将所述第一抽象函数加入所述重运行集合;从步骤所述判断所述参数局部版本表中,所述重运行集合中的所有抽象函数的接口参数中是否存在被标记为无效的第一参数开始重新执行,直到所述重运行集合包括所述第一抽象函数。
53.本技术的实施例中搜索重运行集合的过程可以称为前向搜索,通过前向搜索可以判断为了重新运行目标抽象函数,必须首先运行哪些其他的抽象函数来重新产生目标抽象函数的原始输入(即正确的输入数据)。
54.根据第二方面的第八种可能的实现方式,在所述应用程序容错处理装置的第九种可能的实现方式中,所述根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合,包括:在不存在所述第二参数或所述重运行集合包括所述第一抽象函数的情况下,判断所述重运行集合中的所有抽象函数的输出参数中,是否存在所述参数局部版本表中的版本号低于所述参数全局版本表中的版本号的第三参数;在存在所述第三参数的情况下,根据所述参数局部版本表,判断所述抽象函数中,是否存在输入参数包括所述第三参数的第二抽象函数;在所述抽象函数中存在所述第二抽象函数的情况下,判断所述重运行集合是否包括所述第二抽象函数;在所述重运行集合不包括所述第二抽象函数的情况下,将所述第二抽象函数加入所述重运行集合;从步骤所述判断所述参数局部版本表中,所述重运行集合中的所有抽象函数的接口参数中是否存在被标记为无效的第一参数开始重新执行,直到所述重运行集合包括所述第二抽象函数。
55.本技术的实施例中搜索重运行集合的过程可以称为后向搜索,通过后向搜索可以判断为了不破坏当前的内存上下文,必须重新运行哪些抽象函数,即通过后向搜索能够找到还原内存上下文到当前参数局部版本表plvmap记录的状态的抽象函数。
56.根据第二方面的第九种可能的实现方式,在所述应用程序容错处理装置的第十种可能的实现方式中,所述根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合,包括:在不存在所述第三参数或所述重运行集合包括所述第二抽象函数的情况下,所述重运行集合搜索成功。
57.本技术的实施例,在不存在第三参数或重运行集合包括第二抽象函数的情况下,确定重运行集合搜索成功,简单快速,能够提高重运行集合的搜索效率。
58.根据第二方面的第九种可能的实现方式,在所述应用程序容错处理装置的第十一种可能的实现方式中,所述根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合,包括如下任意一项:在存在所述第一参数的情况下,所述重运行集合搜索失败;在所述抽象函数中不存在所述第一抽象函数的情况下,所述重运行集合搜索失败;在所述抽象函数中不存在所述第二抽象函数的情况下,所述重运行集合搜索失败。
59.本技术的实施例,在存在第一参数的情况下,或者抽象函数中不存在第一抽象函数或第二抽象函数的情况下,确定重运行集合搜索失败,简单快速,能够提高重运行集合的搜索效率。
60.根据第二方面的第六种可能的实现方式,在所述应用程序容错处理装置的第十二
种可能的实现方式中,所述第三运行模块,被配置为:根据所述参数局部版本表,生成与所述重运行集合对应的局部控制流图;根据所述局部控制流图,运行所述重运行集合。
61.本技术的实施例,能够根据参数局部版本表,生成与重运行集合对应的局部控制流图,并根据局部控制流图,运行重运行集合,从而不仅能够在应用程序运行过程中,基于参数局部版本表,动态生成重运行集合的局部控制流图,使得局部控制流图的生成不在依赖编译时分析,而且简单快速,能够提高生成局部控制流图时的处理速度,进而提高重运行集合的运行效率。
62.根据第二方面的第六种可能的实现方式至第二方面的第十二种可能的实现方式中的任意一种,在所述应用程序容错处理装置的第十三种可能的实现方式中,所述装置还包括:检查点建立模块,用于在所述应用程序运行过程中,根据预设的检查点建立规则,建立至少一个检查点;目标检查点确定模块,用于在所述重运行集合搜索失败的情况下,从所述至少一个检查点中,确定出与所述目标抽象函数最近的目标检查点;第四运行模块,用于从所述目标检查点开始,重新运行所述应用程序,以修复所述计算错误。
63.本技术的实施例,能够在应用程序运行过程中,根据预设的检查点建立规则,建立至少一个检查点,在重运行集合搜索失败的情况下,从至少一个检查点中,确定出与目标抽象函数最近的目标检查点,并从目标检查点开始,重新运行应用程序,从而能够在重运行集合搜索失败的情况下,从与目标抽象函数最近的检查点开始,重新运行应用程序来修复计算错误。
64.根据第二方面或者第二方面的第一种可能的实现方式至第二方面的第十三种可能的实现方式中的任意一种,在所述应用程序容错处理装置的第十四种可能的实现方式中,所述应用程序运行在包括处理器及加速器的异构计算平台上,所述标记及跟踪模块,被配置为:在所述应用程序运行过程中,将所述处理器发射到所述加速器的核函数,标记为抽象函数。
65.本技术的实施例,在应用程序运行在包括处理器及加速器的异构计算平台上时,在应用程序运行过程中,将处理器发射到加速器的核函数,标记为抽象函数,不仅使得抽象函数的标记与应用程序的运行平台紧密结合,而且便于封装异构计算平台(包括处理器及加速器)上的内存管理接口,来实现应用程序运行过程中的抽象函数及其接口参数的标记及跟踪。
66.第三方面,本技术的实施例提供了一种应用程序容错处理装置,包括:处理器;用于存储处理器可执行指令的存储器;其中,所述处理器被配置为执行所述指令时实现上述第一方面或者第一方面的多种可能的实现方式中的一种或几种的应用程序容错处理方法。
67.本技术的实施例,能够在应用程序运行过程中,根据预设级别,标记并跟踪抽象函数及其接口参数,并在检测到计算错误的情况下,确定发生计算错误的目标抽象函数,然后根据目标抽象函数的接口参数,判断目标抽象函数的幂等性,在目标抽象函数具有幂等性的情况下,重新运行目标抽象函数,以修复计算错误,从而不仅能够实现动态的、应用程序运行时的幂等性分析,使得应用程序的幂等性分析不再依赖于特殊设计的编译器或硬件,而且能够支持可调整的容错粒度,提高了本技术实施例的应用程序容错处理方法的通用性及容错性能。
68.第四方面,本技术的实施例提供了一种非易失性计算机可读存储介质,其上存储
有计算机程序指令,所述计算机程序指令被处理器执行时实现上述第一方面或者第一方面的多种可能的实现方式中的一种或几种的应用程序容错处理方法。
69.本技术的实施例,能够在应用程序运行过程中,根据预设级别,标记并跟踪抽象函数及其接口参数,并在检测到计算错误的情况下,确定发生计算错误的目标抽象函数,然后根据目标抽象函数的接口参数,判断目标抽象函数的幂等性,在目标抽象函数具有幂等性的情况下,重新运行目标抽象函数,以修复计算错误,从而不仅能够实现动态的、应用程序运行时的幂等性分析,使得应用程序的幂等性分析不再依赖于特殊设计的编译器或硬件,而且能够支持可调整的容错粒度,提高了本技术实施例的应用程序容错处理方法的通用性及容错性能。
70.第五方面,本技术的实施例提供了一种计算机程序产品,包括计算机可读代码,或者承载有计算机可读代码的非易失性计算机可读存储介质,当所述计算机可读代码在电子设备中运行时,所述电子设备中的处理器执行上述第一方面或者第一方面的多种可能的实现方式中的一种或几种的应用程序容错处理方法。
71.本技术的实施例,能够在应用程序运行过程中,根据预设级别,标记并跟踪抽象函数及其接口参数,并在检测到计算错误的情况下,确定发生计算错误的目标抽象函数,然后根据目标抽象函数的接口参数,判断目标抽象函数的幂等性,在目标抽象函数具有幂等性的情况下,重新运行目标抽象函数,以修复计算错误,从而不仅能够实现动态的、应用程序运行时的幂等性分析,使得应用程序的幂等性分析不再依赖于特殊设计的编译器或硬件,而且能够支持可调整的容错粒度,提高了本技术实施例的应用程序容错处理方法的通用性及容错性能。
72.本技术的这些和其他方面在以下(多个)实施例的描述中会更加简明易懂。
附图说明
73.包含在说明书中并且构成说明书的一部分的附图与说明书一起示出了本技术的示例性实施例、特征和方面,并且用于解释本技术的原理。
74.图1a示出根据本技术一实施例的应用程序容错处理方法的应用场景的示意图。
75.图1b示出根据本技术一实施例的应用程序容错处理方法的应用场景的示意图。
76.图1c示出根据本技术一实施例的应用程序容错处理方法的应用场景的示意图。
77.图1d示出根据本技术一实施例的应用程序容错处理方法的应用场景的示意图。
78.图1e示出根据本技术一实施例的应用程序容错处理方法的应用场景的示意图。
79.图2示出根据本技术一实施例的应用程序容错处理方法的流程图。
80.图3示出根据本技术一实施例的应用程序容错处理方法中的抽象函数的示意图。
81.图4示出根据本技术一实施例的应用程序容错处理方法中的参数全局版本表的示意图。
82.图5示出根据本技术一实施例的应用程序容错处理方法中的参数局部版本表的示意图。
83.图6示出根据本技术一实施例的标记及跟踪抽象函数及其接口参数的示意图。
84.图7示出根据本技术一实施例的应用程序容错处理方法的流程图。
85.图8示出根据本技术一实施例的搜索重运行集合的处理过程的示意图。
region),并通过基于该幂等区域的重运行机制来修复计算错误,即使用基于编译阶段确定的幂等区域的重运行机制来修复计算错误。
101.幂等区域是指符合幂等性的计算机指令序列,其中,幂等性是指计算机指令序列在运行过程中不会改变原始输入,反复运行得到完全一样的结果。符合幂等性的计算机指令序列,对所有访问的内存区及寄存器,存在只读(read only,ro)、只写(write only,wo)及写后读(read after write,raw)操作,而不存在读后写(write after read,war)操作。
102.使用基于编译阶段确定的幂等区域的重运行机制时,需要在编译阶段,通过编译器分析应用程序的幂等性。具体的,在编译阶段,通过编译器分析应用程序源代码的各个分段区域的幂等性,并根据各个分段区域是否具有幂等性,将应用程序划分为若干个幂等区域。在应用程序运行过程中(即在处理器执行计算任务的过程中),如果检测到计算错误,且该计算错误发生在幂等区域内,则仅需要在当前内存上下文直接重新执行该幂等区域就能修复计算错误。
103.例如,可更改处理器,使其能够利用幂等区域进行错误修复。更改后的处理器只在幂等区域内进行预测执行(speculative execution),因此即使发生了预测错误(mis-speculation)也不需要恢复寄存器上下文,直接将程序计数寄存器(program counter register,pc)恢复到当前幂等区域的起始位置,重新执行该幂等区域即可。也可更改gpu架构,使gpu能够利用幂等区域进行错误修复。
104.但是,上述通过更改硬件(例如处理器、gpu架构)使处理器能够利用幂等区域进行错误修复的方式,不仅涉及到硬件的更改,而且还依赖于编译器对应用程序的幂等性分析,以及需要处理器提供专门标记幂等区域开始与结束的指令。因此,该方式只能应用在特殊设计的处理器上,使用场景受限较大。
105.还可在编译阶段对应用程序的指令序列进行分析,将指令序列划分为多个单入口多出口(single-entry,multiple-exit,seme)区域,每个seme区域包含数十到数百条指令,然后分析每个seme区域的幂等性。在应用程序运行过程中,对于发生在幂等seme区域的计算错误,直接回退到该seme区域的起始位置重新执行,即可修复该计算错误。
106.该方式虽然不涉及硬件的更改,但仍依赖于编译器对应用程序的幂等性分析。例如,仍需通过编译器对应用程序的源代码进行编译层次的分析,获取应用程序的控制流图(control flow graph,cfg),从而将应用程序的指令序列划分为多个seme区域序列,并分析各个seme区域的幂等性。
107.因此,基于编译阶段确定的幂等区域的重运行机制,不仅依赖于编译器对应用程序的幂等性分析(即事先对应用程序进行幂等性分析),无法在运行时调整,局限性较大,而且还依赖于特定的硬件或软件特性,仅适用于部分计算场景,通用性较差。
108.在另一些技术方案中,采用cpu-加速器(gpu、npu等计算加速器)融合的非对称容错方法来修复计算错误。该方法将cpu-加速器架构的计算机分为强容错域(strong resilient domin)和弱容错域(weak resilient domain)两个部分,强容错域由cpu及其访问的内存组成,弱容错域由加速器及其访问的内存组成。强容错域负责容错操作,例如建立检查点、重新执行计算任务等。弱容错域负责检测错误且不将错误扩散至强容错域。
109.该非对称容错方法虽然能够适用于cpu-加速器架构的计算场景以及其他能够划分为强弱容错域的计算场景,但方法仍需事先通过编译器分析应用程序的幂等性,无法在
运行时调整,仅适用于计算任务的输入完全确定,几乎不存在外部变量改变执行顺序的场景,局限性较大。此外,该方法也难以应用在不能严格划分容错域的计算架构中,例如数据库应用、存在共享内存访问并且计算过程包含很多cpu参与的应用程序等。
110.为了解决上述技术问题,本技术提供了一种应用程序容错处理方法。该应用程序容错处理方法能够在应用程序(用于完成预设的计算任务)运行过程中,标记并跟踪抽象函数及其接口参数,抽象函数用于指示应用程序中的预设级别的功能模块,抽象函数的接口参数包括输入参数及输出参数,输入参数为存储功能模块的输入数据的内存区域,输出参数为存储功能模块的输出数据的内存区域;在检测到应用程序出现计算错误的情况下,从抽象函数中,确定发生计算错误的目标抽象函数,并根据目标抽象函数的接口参数,判断目标抽象函数是否具有幂等性;在目标抽象函数具有幂等性的情况下,重新运行目标抽象函数,以修复计算错误。
111.通过这种方式,能够在应用程序运行过程中,根据预设级别,标记并跟踪抽象函数及其接口参数,并在检测到计算错误的情况下,确定发生计算错误的目标抽象函数,然后根据目标抽象函数的接口参数,判断目标抽象函数的幂等性,在目标抽象函数具有幂等性的情况下,重新运行目标抽象函数,以修复计算错误,从而不仅能够实现动态的、应用程序运行时的幂等性分析,使得应用程序的幂等性分析不再依赖于特殊设计的编译器或硬件,而且能够支持可调整的容错粒度,提高了本技术实施例的应用程序容错处理方法的通用性及容错性能。
112.本技术实施例的应用程序容错处理方法可应用于通用计算场景及专用计算场景,用于在处理器发生硬件错误导致正在运行的应用程序出现计算错误时,以尽可能低的成本,修复计算错误(即恢复正确的计算过程),以得到正确的计算结果。也就是说,本技术实施例的应用程序容错处理方法可用于通用计算场景及专用计算场景中的硬件计算容错。
113.通用计算场景包括在以cpu为核心的计算机架构上执行计算任务的场景。例如,在以x86架构或arm架构的cpu为核心的服务器上,执行通用的计算任务。计算任务包括对输入数据进行处理、转换和存储,例如数据库应用、数据流处理应用等。
114.专用计算场景包括在基于cpu和专用计算加速器的非对称架构上执行特定计算任务的场景。例如,在cpu-gpu架构的计算机上执行科学计算任务或深度神经网络计算程序。
115.图1a示出根据本技术一实施例的应用程序容错处理方法的应用场景的示意图。图1a所示的应用场景为通用计算场景,该通用计算场景的计算机架构包括cpu 110、内存120及输入输出(input/output,i/o)设备130,cpu 110、内存120及i/o设备130可通过总线(bus)、片上网络(network on chip,noc)等方式进行连接,本技术对此不作限制。
116.其中,内存120可以为随机存取存储器(random access memory,ram)或其他存储器,本技术对内存120的具体实现方式不作限制。
117.可将图1a所示的应用场景看作是:本技术实施例的应用程序容错处理方法应用于基于单个cpu的计算机。
118.图1b示出根据本技术一实施例的应用程序容错处理方法的应用场景的示意图。图1b所示的应用场景为通用计算场景,该通用计算场景的计算机架构包括多个cpu 110、共享内存140及i/o设备130,多个cpu 110、共享内存140及i/o设备130可通过总线(bus)、noc等方式进行连接,本技术对此不作限制。
119.其中,共享内存140可以为ram或其他存储器,本技术对共享内存140的具体实现方式不作限制。
120.可将图1b所示的应用场景看作是:本技术实施例的应用程序容错处理方法应用于基于多个相同架构cpu的对称架构计算机。
121.图1c示出根据本技术一实施例的应用程序容错处理方法的应用场景的示意图。图1c所示的应用场景为专用计算场景,该专用计算场景的计算机架构包括多个cpu 110、多个加速器(accelerator)150、共享内存140及i/o设备130,多个cpu 110、多个加速器150、共享内存140及i/o设备130可通过总线(bus)、noc等方式进行连接,本技术对此不作限制。
122.其中,加速器150即计算加速器,可例如图形处理器gpu、神经网络处理器npu等,本技术对加速器150的具体类型不作限制;本技术也对应用场景中的cpu 110及加速器150的具体数量不作限制。
123.图1d示出根据本技术一实施例的应用程序容错处理方法的应用场景的示意图。图1d所示的应用场景为专用计算场景,该专用计算场景的计算机架构包括多个cpu 110、多个加速器150及i/o设备130,多个cpu 110、多个加速器150及i/o设备130可通过总线(bus)、noc等方式进行连接,本技术对此不作限制。本技术也对应用场景中的cpu 110及加速器150的具体数量不作限制。
124.每个cpu 110物理连接自己的专用内存,如图1d中的内存160,每个cpu 110对与自己物理连接的内存160拥有独立的内存访问控制。每个加速器150物理连接自己的专用内存,如图1d中的内存170,每个加速器150对与自己物理连接的内存170拥有独立的内存访问控制。内存160、内存170可以为ram或其他存储器,本技术对内存160、内存170的具体实现方式不作限制。
125.图1e示出根据本技术一实施例的应用程序容错处理方法的应用场景的示意图。图1e所示的应用场景为专用计算场景,该专用计算场景的计算机架构包括多个cpu 110、多个加速器150、共享内存140及i/o设备130,多个cpu 110、多个加速器150、共享内存140及i/o设备130可通过总线(bus)、noc等方式进行连接,本技术对此不作限制。本技术也对应用场景中的cpu 110及加速器150的具体数量不作限制。
126.每个cpu 110物理连接自己的专用内存,如图1e中的内存160,每个cpu 110对与自己物理连接的内存160拥有独立的内存访问控制。每个加速器150物理连接自己的专用内存,如图1e中的内存170,每个加速器150对与自己物理连接的内存170拥有独立的内存访问控制。
127.共享内存140、内存160、内存170可以为ram或其他存储器,本技术对共享内存140、内存160、内存170的具体实现方式不作限制。
128.与图1d相比,图1e所示的应用场景中,cpu 110及加速器150除了可以访问与自己物理连接的内存,还可访问共享内存140。
129.可以将上述图1c、图1d、图1c所示的应用场景看作是:本技术实施例的应用程序容错处理方法应用于基于cpu-加速器融合架构的非对称架构计算机。
130.需要说明的是,上述虽然以图1a、图1b、图1c、图1d及图1e作为示例对本技术实施例的应用程序容错处理方法的应用场景进行了示例性说明,但本技术实施例的应用程序容错处理方法还可应用于其他计算场景,例如,可应用于在基于不同架构cpu的非对称架构计
算机上执行计算任务的场景。本技术对应用程序容错处理方法的具体应用场景不作限制。
131.本技术实施例的应用程序容错处理方法支持在多种计算机架构上运行。计算机架构中包括一个或多个处理器(例如cpu、gpu、npu或其他架构的处理器),以及内存(例如ram)。计算机架构包括但不限于完全基于单个cpu的计算机、基于多个相同架构cpu的对称架构计算机、基于多个不同架构cpu的非对称计算机架构、基于cpu-加速器的非对称计算机架构等。
132.计算机架构中的每个处理器可以物理连接自己专用的内存,并且每个处理器对与自己物理连接的专用内存拥有独立的内存地址控制(如图1d所示);计算机架构中的多个处理器也可以通过物理连接外部的内存控制器共享同一个内存(如图1b、图1c所示);计算机架构中的每个处理器可以连接自己专用的内存,同时多个处理器也可以共享另一个内存及其地址空间(如图1e所示)。
133.也就是说,计算机架构中,每个处理器可以物理连接自己专用的内存,拥有自己独立的内存地址空间,也可以与其它处理器一起通过物理连接内存控制器共享一个内存,与其它处理器共享一个单一的内存地址空间。
134.需要说明的是,本技术对应用程序容错处理方法应用的具体计算机架构不作限制,也对计算机架构中处理器与内存的连接方式不作限制。
135.图2示出根据本技术一实施例的应用程序容错处理方法的流程图。如图2所示,该应用程序容错处理方法包括:
136.步骤s210,运行应用程序,所述应用程序用于完成预设的计算任务。
137.应用程序可用于完成金融计算、科学计算、数据库服务等领域的预设的计算任务。本技术对计算任务的具体类型、计算任务所属的具体领域等均不作限制。
138.可通过处理器运行应用程序,以完成预设的计算任务。
139.步骤s220,在所述应用程序运行过程中,标记并跟踪抽象函数及所述抽象函数的接口参数。
140.抽象函数(abstract function,af)可用于指示应用程序中的预设级别的功能模块。功能模块可以是应用程序中的一个具体的代码段落、功能函数、核函数、类方法、多个函数或类方法组成的模块、多个函数或类方法组成的线程、预设粒度的计算任务等。
141.其中,核函数(kernel,也称为算子)是指由计算加速器核心(例如gpu、npu等计算加速处理器核心)执行的一段预先定义的程序。核函数可用于完成一种特定的、可被计算加速器加速的计算,例如矩阵乘法等。核函数通常会被严格定义具体的计算功能及输入输出数据类型。计算加速器采用深度神经网络模型对一个样本数据执行一次计算,通常需要执行多个算子。
142.功能模块的级别可以是指令级、算子级、任务级、线程级或其他级别。与功能模块相对应,抽象函数的级别也可以是指令级、算子级、任务级、线程级或其他级别。例如,功能模块的级别为算子级,相应地,抽象函数的级别也为算子级;功能模块的级别为线程级,相应地,抽象函数的级别也为线程级。本领域技术人员可根据实际情况设置功能模块及抽象函数的级别,本技术对此不作具体限制。
143.通过这种方式,本技术实施例的应用程序容错处理方法能够支持可调整的容错粒度,与现有技术(局限于固定的单一粒度,例如只支持指令级别的容错处理)相比,不仅能够
实现低成本约束下的容错处理,提高容错性能,还可能提高容错处理的通用性。
144.在一种可能的实现方式中,抽象函数的接口参数包括输入参数及输出参数。抽象函数的输入参数为存储抽象函数指示的功能模块的输入数据的内存区域,抽象函数的输出参数为存储抽象函数指示的功能模块的输出数据的内存区域。
145.抽象函数的输入参数可以为一个或多个,可将每个连续存储抽象函数指示的功能模块的输入数据的内存区域看作抽象函数的一个输入参数。类似地,抽象函数的输出参数也可以为一个或多个,可将每个连续存储抽象函数指示的功能模块的输出数据的内存区域看作抽象函数的一个输出参数。
146.抽象函数可对输入参数中的数据进行处理,得到处理结果,并将处理结果写入输出参数中。同一个抽象函数的输入参数(即存储输入数据的内存区域)与输出参数(即存储输出数据的内存区域)可以完全独立、部分重叠或完全重叠,本技术对此不作限制。一个抽象函数的输入参数可以是另一个抽象函数的输出参数;一个抽象函数的输出参数可以是另一个抽象函数的输入参数。
147.在一种可能的实现方式中,可为抽象函数的接口参数定义标识符,即可为抽象函数的输入参数及输出参数定义标识符。标识符为输入参数及输出参数的唯一标识,可将输入参数及输出参数对应的内存区域的地址作为其标识符,也可通过其他方式确定输入参数及输出参数的标识符,本技术对此不作限制。
148.在一种可能的实现方式中,在应用程序运行过程中,抽象函数的接口参数可能被改写。为了区分接口参数改写前的状态与改写后的状态,可以为接口参数存放某一数据时的状态定义一个版本号,该版本号可通过整数(例如0、1、2、3
……
)来表示。
149.也就是说,抽象函数的接口参数具有版本号,该版本号可用于指示抽象函数的接口参数的数据存放状态。具体的,抽象函数的输入参数的版本号可用于指示存储抽象函数指示的功能模块的输入数据的内存区域的数据存放状态,抽象函数的输出参数的版本号可用于指示存储抽象函数指示的功能模块的输出数据的内存区域的数据存放状态。
150.例如,假设抽象函数的接口参数的版本号通过大于等于0的整数来表示,其初始值为0,在对抽象函数的接口参数进行初始化赋值后,可将接口参数的版本号置为初始值0,在接口参数被改写后,其版本号增加1。
151.在一种可能的实现方式中,抽象函数运行时从输入参数读取数据,输入参数的版本号不发生变化;抽象函数向输出参数写入计算结果,即输出参数被改写,输出参数的版本号发生变化,例如,输出参数的版本号增加1。
152.当抽象函数的接口参数的版本号发生变化时,可认为其对应的内存区域被写入过数据(即被改写过)。无论写入的数据与原始数据(即写入前的数据)是否相同,只要存在写入操作,其版本号就会更新。更新后的版本号高于更新前的版本号。
153.需要说明的是,接口参数的版本号也可以通过其他方式来表示,只要能区分出改写前的状态与改写后的状态即可,本技术对接口参数的版本号的具体表示方式不作限制。
154.图3示出根据本技术一实施例的应用程序容错处理方法中的抽象函数的示意图。如图3所示,抽象函数af_a的输入参数为a和b,a的版本号为1,b的版本号也为1,可将抽象函数af_a的输入参数标记为a1(a为输入参数的标识符,1为输入参数a的版本号)和b1(b为输入参数的标识符,1为输入参数b的版本号);抽象函数af_a的输出参数也为a,即抽象函数
af_a的输出参数a与输入参数a为同一块内存区域,抽象函数af_a将运算结果写入到输出参数a,由于发生写入操作,a的版本号由1变为2,因此,可将抽象函数af_a的输出参数标记为a2(a为输出参数的标识符,2为输出参数a的版本号)。
155.在一种可能的实现方式中,由于抽象函数具体指示了应用程序中的指令序列、代码段落、核函数、功能函数(或方法)、线程等,抽象函数的生命周期可以从其涉及到的所有计算机指令中的第一条被执行的指令开始,到最后一条被执行的指令结束。
156.在一种可能的实现方式中,抽象函数的接口参数(即输入参数及输出参数)的生命周期独立于抽象函数的生命周期。接口参数的生命周期从其对应的内存区域被操作系统申请并第一次存放有效数据开始,到该内存区域被释放回收到操作系统结束。接口参数的生命周期可以跨越一个或多个抽象函数的生命周期。
157.在一种可能的实现方式中,如果抽象函数所读写过的内存区域中的数据的生命周期超过该抽象函数的生命周期,则该内存区域需被列为抽象函数的接口参数,即该内存区域需被列为抽象函数的输入参数和/或输出参数。也就是说,不属于抽象函数的接口参数中的数据,其生命周期不会超过抽象函数的生命周期。
158.在一种可能的实现方式中,应用程序运行时可以看作是由多个抽象函数组成和描述,从而可以在应用程序运行过程中,标记抽象函数及其接口参数(即输入参数及输出参数),并跟踪接口参数。
159.在一种可能的实现方式中,标记并跟踪抽象函数及其接口参数时,可在应用程序运行过程中,根据预设的功能模块的级别,识别应用程序中的功能模块,并将识别出的功能模块标记为抽象函数;然后确定抽象函数的接口参数及其版本号(即输入参数及其版本号、输出参数及其版本号);之后根据抽象函数的接口参数及其版本号,更新参数全局版本表及参数局部版本表。
160.其中,参数全局版本表(parameter global version map,pgvmap)用于记录应用程序的所有抽象函数的接口参数(包括输入参数及输出参数)的最新版本号。参数全局版本表pgvmap可包括应用程序的所有抽象函数的接口参数的标识符及最新版本号。参数全局版本表pgvmap还可包括接口参数的标识符到其最新版本号的映射关系。参数全局版本表pgvmap独立于所有抽象函数而存在。
161.在一种可能的实现方式中,根据抽象函数的接口参数及其版本号,更新参数全局版本表pgvmap时,可根据抽象函数的接口参数的标识符,查看参数全局版本表pgvmap中是否存在抽象函数的接口参数。在参数全局版本表pgvmap中不存在抽象函数的接口参数的情况下,将抽象函数的接口参数的标识符及版本号,加入参数全局版本表pgvmap中。
162.在参数全局版本表pgvmap中存在抽象函数的接口参数的情况下,更新参数全局版本表中抽象函数的接口参数的版本号。具体的,可判断抽象函数的接口参数的版本号与参数全局版本表pgvmap中该接口参数的版本号是否相同,如果两者的版本号不同且抽象函数的接口参数的版本号高于参数全局版本表pgvmap中该接口参数的版本号,则使用抽象函数的接口参数的版本号,更新参数全局版本表pgvmap中该接口参数的版本号。
163.通过这种方式,能够实现参数全局版本表的动态更新及维护,从而提高参数全局版本表的准确性。
164.图4示出根据本技术一实施例的应用程序容错处理方法中的参数全局版本表的示
意图。如图4所示,抽象函数af_b实现的功能为“para_c=para_a+para_b”,其接口参数包括输入参数para_a、para_b以及输出参数para_c。其中,para_a、para_b、para_c为接口参数的标识符。
165.抽象函数af_b运行时,其输入参数为版本号为2的para_a(地址address为0x000a000,值value为100)及版本号为4的para_b(地址address为0x000a004,值value为200),其输出参数为para_c(地址address为0x000a008)。抽象函数af_b运行完成后,得到输出结果为300,可将输出结果300存储在输出参数para_c指示的内存区域,即地址为0x000a008的内存区域。
166.由于存在写入操作,输出参数para_c的版本号发生变化,变更后的版本号为3,然后将参数全局版本表pgvmap中的para_c的版本号更新为3,即para_c的最新版本号为3。由于抽象函数af_b只对输入参数para_a、para_b进行了读取,未进行写入操作,因此,para_a、para_b的版本号未发生变化,参数全局版本表pgvmap中para_a、para_b的版本号保持不变。
167.抽象函数af_c实现的功能为“para_d=para_d+para_e”,其接口参数包括输入参数para_d、para_e以及输出参数para_d。其中,para_d、para_e为接口参数的标识符。
168.抽象函数af_c运行时,其输入参数为版本号为0的para_d(地址address为0x000b000,值value为100)及版本号为0的para_e(地址address为0x000b004,值value为200),其输出参数为para_d(地址address为0x000b000),即para_d为输入输出参数。抽象函数af_c运行完成后,得到输出结果300,可将输出结果300存储在输出参数para_d指示的内存区域,即地址为0x000b000的内存区域。
169.由于para_d作为输出参数被写入,para_d的版本号发生变化,其版本号增加1,由0变更为1,即抽象函数af_c的输出参数para_d的版本号为1,而参数全局版本表pgvmap中记录的para_d的版本号为0,抽象函数af_c的输出参数para_d的版本号1高于参数全局版本表pgvmap中para_d的版本号0,可将参数全局变量表中para_d的版本号由0更新为1(即0-》1)。更新后,参数全局版本表pgvmap中记录的para_d的最新版本号为1。由于抽象函数af_c只对输入参数para_e进行了读取,未进行写入操作,因此,para_e的版本号未发生变化,参数全局版本表中para_e的版本号保持不变。
170.图4中还示出了参数全局版本表pgvmap中接口参数的标识符到其版本号的映射关系。例如,接口参数para_a的最新版本号为2,para_b的最新版本号为4,para_c的最新版本号为3,para_d的最新版本号为1,para_e的最新版本号为0。
171.在一种可能的实现方式中,可通过伪代码来描述参数全局版本表pgvmap。图4所示的参数全局版本表pgvmap可通过下述伪代码来描述:
[0172][0173]
需要说明的是,参数全局版本表pgvmap还可通过矩阵、数组等方式进行表示,本领域技术人员可根据实际情况设置参数全局版本表pgvmap的具体表示方式,本技术对此不作限制。
[0174]
在一种可能的实现方式中,参数局部版本表(parameter local version map,plvmap)可用于记录应用程序的各个抽象函数运行时的接口参数的版本号(包括输入参数的版本号及输出参数的版本号)。也就是说,参数局部版本表plvmap可用于记录应用程序的各个抽象函数在运行时与特定版本的输入参数及输出参数的关系。参数局部版本表plvmap依赖于抽象函数而存在。
[0175]
在一种可能的实现方式中,参数局部版本表plvmap可包括与应用程序的各个抽象函数对应的参数版本子表,每个参数版本子表可用于记录对应的抽象函数的标识符及该抽象函数的接口参数的标识符及版本号。从参数局部版本表plvmap中可以获取应用程序的各个抽象函数在运行时的接口参数的标识符及版本号,包括输入参数的标识符及版本号、输出参数的标识符及版本号。
[0176]
在一种可能的实现方式中,在根据抽象函数的接口参数及其版本号,更新参数局部版本表plvmap时,可将抽象函数的标识符及该抽象函数的接口参数的标识符及版本号,加入参数局部版本表plvmap中。其中,抽象函数的标识符为抽象函数的唯一标识。可将抽象函数指示的功能模块的内存地址,确定为抽象函数的标识符。还可通过其他方式确定抽象函数的标识符,本技术对此不作限制。
[0177]
例如,在根据抽象函数的接口参数及其版本号,更新参数局部版本表plvmap时,可在参数局部版本表plvmap中,增加与抽象函数对应的参数版本子表,并将该抽象函数的标识符、输入参数的标识符及版本号、输出参数的标识符及版本号,写入参数版本子表中,从而完成参数局部版本表plvmap的更新。
[0178]
通过这种方式,能够实现参数局部版本表的动态更新及维护,从而提高参数局部版本表的准确性。
[0179]
图5示出根据本技术一实施例的应用程序容错处理方法中的参数局部版本表的示意图。如图5所示,抽象函数af_c实现的功能为“para_d=para_d+para_e”,其接口参数包括输入参数para_d、para_e以及输出参数para_d。其中,para_d、para_e为接口参数的标识符。
[0180]
抽象函数af_c运行时,其输入参数为版本号为0的para_d及版本号为0的para_e,其输出参数为para_d,即para_d为输入输出参数。抽象函数af_c运行完成后,得到输出结果,可将输出结果存储在输出参数para_d指示的内存区域。由于para_d作为输出参数被写
入,para_d的版本号发生变化,其版本号增加1,由0变更为1。
[0181]
更新参数全局版本表pgvmap时,由于抽象函数af_c只对输入参数para_e进行了读取,未进行写入操作,因此,para_e的版本号未发生变化,参数全局版本表中para_e的版本号保持不变;由于参数全局版本表pgvmap中para_d的版本号为0,抽象函数af_c的输出参数para_d的版本号为1,高于参数全局版本表pgvmap中para_d的版本号0,则将参数全局变量表pgvmap中的para_d的版本号由0更新为1(即0-》1)。更新后,参数全局版本表pgvmap中记录的para_d的最新版本号为1。
[0182]
更新参数局部版本表plvmap时,可在参数局部版本表plvmap增加与抽象函数af_c对应的参数版本子表,并将抽象函数af_c的标识符(即af_c)、输入参数的标识符及版本号、输出参数的标识符及版本号,写入参数版本子表中:
[0183]
抽象函数af_c运行时,输入参数para_d和para_e的版本号均为0,可在与抽象函数af_c对应的参数版本子表中的输入(input)位置,记录抽象函数af_c的输入参数para_d及其版本号0、输入参数para_e及其版本号为0;
[0184]
抽象函数af_c运行时,输出参数para_d的版本号为1,可在与抽象函数af_c对应的参数版本子表中的输出(output)位置,记录抽象函数af_c的输出参数para_d及其版本号1。
[0185]
与参数全局版本表pgvmap仅记录参数para_d的最新版本号不同,参数局部版本表plvmap中记录了para_d作为抽象函数af_c的输入参数的版本号0,以及para_d作为抽象函数af_c的输出参数的版本号1。因此,参数局部版本表plvmap可记录抽象函数在运行时与特定版本的输入参数及输出参数的关系。
[0186]
由图5可以看出,在一个参数(例如para_d)既是抽象函数(例如抽象函数af_c)的输入参数,又是该抽象函数输出参数的情况下,即在一个参数为输入输出参数的情况下,更新参数全局版本表pgvmap时,记录该参数的最新版本号(例如para_d的版本号1);更新参数局部版本表plvmap时,将该参数作为输入参数时的版本号(例如para_d的版本号0),记录在与抽象函数对应的参数版本子表中的输入(input)位置,将该参数作为输出参数时的版本号(例如para_d的版本号1),记录在与抽象函数对应的参数版本子表中的输出(output)位置。
[0187]
图5中还示出了参数全局版本表pgvmap与参数局部版本表plvmap的关系:输入参数para_e的版本号未发生变化,参数全局版本表pgvmap与参数局部版本表plvmap记录的para_e的版本号均为1;输入输出参数para_d的版本号发生变化0-》1,参数局部版本表plvmap中,与抽象函数对应的参数版本子表中的输入(input)位置,记录了para_d作为输入参数时的版本号0(即更新前的版本号),与抽象函数对应的参数版本子表中的输出(output)位置,记录了para_d作为输出参数时的版本号1(即更新后的版本号);而参数全局版本表pgvmap中,只记录了para_d的最新版本号1。
[0188]
此外,图5中还示出了参数局部版本表pgvmap中接口参数的标识符到其版本号的映射关系。例如,抽象函数af_c运行时,输入参数para_d的版本号为0,输入参数para_e的版本号为0,输出参数para_d的版本号为1。
[0189]
需要说明的是,图5示出的参数局部版本表pgvmap仅记录了一个抽象函数af_c的接口参数,在实际应用中,参数局部版本表pgvmap可记录多个抽象函数的接口参数,本技术对参数局部版本表pgvmap记录的抽象函数的数量不作限制。
[0190]
在一种可能的实现方式中,可通过伪代码来描述参数局部版本表plvmap。图5所示的参数局部版本表plvmap可通过下述伪代码来描述:
[0191][0192]
需要说明的是,参数局部版本表plvmap还可其他方式进行表示,本领域技术人员可根据实际情况选取参数局部版本表plvmap的具体表示方式,本技术对此不作限制。
[0193]
在一种可能的实现方式中,在抽象函数的接口参数被应用程序的抽象函数之外的其他操作修改的情况下,可更新参数全局版本表pgvmap中该接口参数的版本号,例如,将参数全局版本表pgvmap中该接口参数的版本号增加1,然后将参数局部版本表plvmap中,版本号低于参数全局版本表pgvmap中的版本号的所述接口参数,标记为无效。
[0194]
例如,接口参数para_f的版本号为5,在接口参数para_f被应用程序的抽象函数之外的其他操作修改的情况下,可将参数全局版本表pgvmap中的接口参数para_f的版本号更新为6,然后将参数局部版本表plvmap中,版本号低于6(参数全局版本表pgvmap中的接口参数para_f的版本号)的接口参数para_f,均标记为无效。
[0195]
在抽象函数的接口参数被应用程序的抽象函数之外的其他操作修改的情况下,更新参数全局版本表中该接口参数的版本号,并将参数局部版本表中,版本号低于参数全局版本表中的版本号的该接口参数标记为无效,从而能够跟踪抽象函数之外的其他操作对抽象函数的接口参数的修改,提高参数全局版本表及参数局部版本表的准确性。
[0196]
通过上述方式,能够在应用程序运行过程中,根据预设级别,识别应用程序中的功能模块,并将识别出的功能模块标记为抽象函数,然后确定抽象函数的接口参数及其版本号,并根据抽象函数的接口参数及其版本号,更新参数全局版本表及参数局部版本表,从而可以在应用程序运行过程中,标记抽象函数及其接口参数,并通过简单的数据结构(参数全局版本表pgvmap及参数局部版本表plvmap)来跟踪抽象函数的接口参数(输入参数及输出参数)指示的内存区的版本变化(即读写历史),实现对抽象函数及其接口参数的标记及跟踪,复杂度低,开销小,能够提高标记及跟踪抽象函数及其接口参数时的处理效率。
[0197]
在一种可能的实现方式中,在应用程序运行过程中,标记并跟踪抽象函数及其接口参数,可通过抽象函数参数读写跟踪模块来实现。抽象函数参数读写跟踪模块可提供用于标记的功能接口,该功能接口用于标记抽象函数及其接口参数。
[0198]
例如,用于标记的功能接口可以根据预设级别,将应用程序中功能模块标记为抽象函数,其中,功能模块为应用程序中的一个具体的代码段落、功能函数、核函数、类方法、多个函数或类方法组成的模块、多个函数或类方法组成的线程、预设粒度的计算任务等。用于标记的功能接口还可将存储抽象函数指示的功能模块的输入数据的内存区域,标记为抽象函数的输入参数,将存储抽象函数指示的功能模块的输出数据的内存区域,标记为抽象函数的输出参数。
[0199]
在一种可能的实现方式中,可通过下述伪代码来描述抽象函数参数读写跟踪模块提供的用于标记的功能接口:
[0200]
api_af_launch(function,params,input_param_index,output_param_index)
[0201]
上述功能接口中,api_af_launch表示标记抽象函数及其接口参数的应用程序编程接口(application programming interface,api)的接口名称,function表示抽象函数的标识符或地址,params表示抽象函数的接口参数的标识符或内存地址的列表,input_param_index表示params中的输入参数,output_param_index表示params中的输出参数。
[0202]
在一种可能的实现方式中,抽象函数参数读写跟踪模块还提供了用于跟踪的功能接口,该功能接口用于跟踪应用程序生命周期内所有对抽象函数的接口参数的读写操作,无论该读写操作来自于应用程序的任何抽象函数或者不是抽象函数的其他部分。
[0203]
在一种可能的实现方式中,可通过下述伪代码来描述抽象函数参数读写跟踪模块提供的用于跟踪的功能接口:
[0204]
api_malloc(ident,size)
[0205]
api_free(ident)
[0206]
api_memcpy(dest,src,size)
[0207]
api_write(dest,data,size)
[0208]
上述功能接口中,api_malloc表示分配接口参数指示的内存区域的api接口名称;api_free表示释放接口参数指示的内存区域的api接口名称;api_memcpy表示对接口参数指示的内存区域进行复制操作的api接口名称;api_write表示对接口参数指示的内存区域进行写操作的api接口名称,api_write也可以通过编程语言类对象的赋值运算符的实现,例如在c++、java、python语言中重载特定类对象的“等于号=”运算符;
[0209]
ident表示要分配或释放的内存区域的标识符、内存地址或内存地址指针,dest表示要写入的内存区域的标识符、内存地址或内存地址指针,src表示要读取的内存区域的标识符、内存地址或内存地址指针,data表示要写入的数据,size表示要写入的数据的长度。
[0210]
在实际应用中,抽象函数参数读写跟踪模块一般会通过封装软件架构中的内存管理接口和特定软硬件计算处理器的计算功能函数调用接口来实现。
[0211]
图6示出根据本技术一实施例的标记及跟踪抽象函数及其接口参数的示意图。如图6所示,应用程序611运行在处理器610上,处理器610可以是cpu、gpu、npu或其他计算加速器,处理器610包括抽象函数参数读写跟踪模块612。应用程序611运行过程中使用的数据存储在内存620上,其内存地址空间为0x0000000至0xffffffff。
[0212]
应用程序611运行时可通过多个抽象函数来描述。在应用程序611运行过程中,抽象函数参数读写跟踪模块612可通过用于标记的功能接口,标记抽象函数(例如图6中的抽象函数1,
…
,抽象函数k(k为正整数),
…
)及其接口参数,以及通过用于跟踪的功能接口,跟踪应用程序生命周期内所有对抽象函数的接口参数的读写操作,并将对接口参数的跟踪结果记录在参数全局版本表pgvmap及参数局部版本表plvmap中。
[0213]
例如,如图6所示,应用程序611运行过程中,抽象函数参数读写跟踪模块612标记的抽象函数k的接口参数包括:2个输入参数(输入参数m1及输入参数m2)、1个输入输出参数(m3)、2个输出参数(输出参数m4及输出参数m5)。抽象函数参数读写跟踪模块612可对抽象函数k的接口参数的读写操作进行跟踪,并将跟踪结果记录在参数全局版本表pgvmap及参数局部版本表plvmap中。
[0214]
步骤s230,在检测到所述应用程序出现计算错误的情况下,从所述抽象函数中,确定发生所述计算错误的目标抽象函数。
[0215]
在应用程序运行过程中,可通过纠错码(error correction code,ecc)校验、至少两套设备同时执行同一应用程序、至少两个处理器核心执行同一算子等方式,来检测应用程序是否出现计算错误。这里的计算错误的检测可采用现有的各种检测方式,本技术对应用程序是否出现计算错误的具体检测方式不作限制。
[0216]
在检测到应用程序出现计算错误的情况下,可确定错误位置,例如,出现计算错误的指令位置、代码位置、函数、算子、线程等,进而可根据错误位置,从标记的抽象函数中,确定发生计算错误的目标抽象函数。
[0217]
步骤s240,根据所述目标抽象函数的接口参数,判断所述目标抽象函数是否具有幂等性。
[0218]
确定出发生计算错误的目标抽象函数后,可对目标抽象函数的接口参数进行分析,判断目标抽象函数是否具有幂等性。例如,可判断目标抽象函数的输入参数指示的内存区域是否与输出参数指示的内存区域存在重叠:如果目标抽象函数的输入参数指示的内存区域与输出参数指示的内存区域存在重叠,则目标抽象函数不具有幂等性;如果目标抽象函数的输入参数指示的内存区域与输出参数指示的内存区域不存在重叠,则目标抽象函数具有幂等性。
[0219]
在一种可能的实现方式中,判断目标抽象函数是否具有幂等性时,可判断参数局部版本表plvmap中目标抽象函数的接口参数的标识符中,是否存在相同的标识符。例如,可判断参数局部版本表plvmap中目标抽象函数的输出参数的标识符中,是否存在与目标抽象函数的输入参数的标识符相同的标识符;或者,可判断参数局部版本表plvmap中目标抽象函数的输入参数的标识符中,是否存在与目标抽象函数的输出参数的标识符相同的标识符。
[0220]
如果参数局部版本表plvmap中目标抽象函数的接口参数的标识符中,存在相同的标识符,则确定目标抽象函数不具有幂等性;如果参数局部版本表plvmap中目标抽象函数的接口参数的标识符中,不存在相同的标识符,则确定目标抽象函数具有幂等性。
[0221]
例如,下述伪代码描述的参数局部版本表plvmap中,抽象函数af_c的接口参数的标识符中存在相同的标识符para_d,因此,抽象函数af_c不具有幂等性;抽象函数af_d的接口参数的标识符中,不存在相同的标识符,因此,抽象函数af_d具有幂等性;抽象函数af_e
的接口参数的标识符中存在相同的标识符para_d,因此,抽象函数af_e不具有幂等性。
[0222][0223]
通过这种方式,能够基于参数局部版本表plvmap,对目标抽象函数的幂等性进行分析,简单快速,能够提高处理效率。
[0224]
步骤s250,在所述目标抽象函数具有幂等性的情况下,重新运行所述目标抽象函数,以修复所述计算错误。
[0225]
在目标抽象函数具有幂等性的情况下,目标抽象函数为幂等函数,即目标抽象函数的输入参数指示的内存区域并没有被改写或破坏,在不重新指定输入的情况下,重复运行目标抽象函数会得到完全一样的输出,因此,可通过重新运行目标抽象函数,来修复计算错误,以使应用程序恢复正确的计算过程。
[0226]
图7示出根据本技术一实施例的应用程序容错处理方法的流程图。如图7所示,所
述应用程序容错处理方法还包括:
[0227]
步骤s260,在所述目标抽象函数不具有幂等性的情况下,在所述抽象函数中,搜索重运行集合。
[0228]
其中,重运行集合(relaunch set,re-execution set)可用于指示为修复应用程序的计算错误所必须重新运行的最小抽象函数的集合。
[0229]
由于目标抽象函数不具有幂等性,其输入参数指示的内存区域可能已经被改写或破坏,在不重新指定输入数据的情况下,直接重新运行目标抽象函数会产生预期之外的结果,因此,需要首先恢复目标抽象函数的输入参数指示的内存区域的数据,之后才能重新执行目标抽象函数。可向前回退多个抽象函数,即在运行目标抽象函数之前先运行其他抽象函数来重新产生目标抽象函数的原始输入(即正确的输入数据)。
[0230]
可将包括目标抽象函数在内,能够使目标抽象函数重新运行时得到与多次重复运行一样的结果而必须运行的最小抽象函数的集合,称为重运行集合。重运行集合为一个幂等区域。
[0231]
在一种可能的实现方式中,可根据参数局部版本表plvmap及参数全局版本表pgvmap,从抽象函数中,搜索重运行集合。由于参数局部版本表plvmap及参数全局版本表pgvmap为简单的数据结构,根据参数局部版本表plvmap及参数全局版本表pgvmap,从抽象函数中,搜索重运行集合,简单快速,能够提高重运行集合的搜索效率。
[0232]
在一种可能的实现方式中,根据参数局部版本表plvmap及参数全局版本表pgvmap,从抽象函数中,搜索重运行集合时,可首先将目标抽象函数加入重运行集合,然后判断参数局部版本表plvmap中,重运行集合中的所有抽象函数的接口参数中是否存在被标记为无效的第一参数。
[0233]
在参数局部版本表plvmap中,重运行集合中的所有抽象函数的接口参数中存在第一参数(即被标记为无效的参数,其所指示的内存区域可能已经被破坏或改写)的情况下,重运行集合搜索失败。
[0234]
在参数局部版本表plvmap中,重运行集合中的所有抽象函数的接口参数中不存在第一参数的情况下,可判断重运行集合中的所有抽象函数的输入参数中,是否存在参数局部版本表plvmap中的版本号低于参数全局版本表pgvmap中的版本号的第二参数。也就是说,第二参数为输入参数,且第二参数在参数局部版本表plvmap中的版本号低于其在参数全局版本表pgvmap中的版本号。
[0235]
在重运行集合中的所有抽象函数的输入参数中存在第二参数的情况下,可认为重运行结合中存在输入参数指示的内存区域可能已经被改写或破坏的抽象函数,可根据参数局部版本表plvmap,判断抽象函数中,是否存在输出参数包括第二参数的第一抽象函数。在抽象函数中不存在第一抽象函数的情况下,重运行集合搜索失败。
[0236]
在抽象函数中存在第一抽象函数的情况下,判断重运行集合是否包括第一抽象函数。在抽象函数中存在第一抽象函数且重运行集合不包括第一抽象函数的情况下,将第一抽象函数加入重运行集合。
[0237]
然后从步骤“判断参数局部版本表plvmap中,重运行集合中的所有抽象函数的接口参数中是否存在被标记为无效的第一参数”开始重新执行,直到重运行集合中包括第一抽象函数。例如,假设重运行集合中的所有抽象函数的输入参数中存在3个第二参数,如果
输出参数包括各个第二参数的所有的第一抽象函数均已在重运行集合中,那么可认为重运行集合包括第一抽象函数。
[0238]
上述过程可以称为前向搜索,通过前向搜索可以判断为了重新运行目标抽象函数,必须首先运行哪些其他的抽象函数来重新产生目标抽象函数的原始输入(即正确的输入数据)。
[0239]
在重运行集合中的所有抽象函数的输入参数中不存在第二参数,或者重运行集合包括第一抽象函数的情况下,判断重运行集合中的所有抽象函数的输出参数中,是否存在参数局部版本表plvmap中的版本号低于参数全局版本表pgvmap中的版本号的第三参数。也就是说,第三参数是输出参数,且第三参数在参数局部版本表plvmap中的版本号低于其在参数全局版本表pgvmap中的版本号。
[0240]
在重运行集合中的所有抽象函数的输出参数中存在第三参数的情况下,根据参数局部版本表plvmap,判断抽象函数中,是否存在输入参数包括第三参数的第二抽象函数。在抽象函数中不存在第二抽象函数的情况下,重运行集合搜索失败。
[0241]
在抽象函数中存在第二抽象函数的情况下,判断重运行集合是否包括第二抽象函数。在抽象函数中存在第二抽象函数且重运行集合不包括第二抽象函数的情况下,将第二抽象函数加入重运行集合。
[0242]
然后从步骤“判断参数局部版本表plvmap中,重运行集合中的所有抽象函数的接口参数中是否存在被标记为无效的第一参数”开始重新执行,直到重运行集合中包括第二抽象函数。例如,假设重运行集合中的所有抽象函数的输入参数中存在2个第三参数,如果输出参数包括各个第三参数的第二抽象函数均已在重运行集合中,那么可认为重运行集合包括第二抽象函数。
[0243]
上述过程可以称为后向搜索,通过后向搜索可以判断为了不破坏当前的内存上下文,必须重新运行哪些抽象函数,即通过后向搜索能够找到还原内存上下文到当前参数局部版本表plvmap记录的状态的抽象函数。
[0244]
在重运行集合中的所有抽象函数的输出参数中不存在第三参数的情况下,或者在重运行集合包括第二抽象函数的情况下,重运行集合搜索成功。
[0245]
图8示出根据本技术一实施例的搜索重运行集合的处理过程的示意图。如图8所示,在抽象函数中搜索重运行集合时,可首先执行步骤s801,将目标抽象函数加入重运行集合;然后执行步骤s802,判断参数局部版本表plvmap中,重运行集合中的所有抽象函数的接口参数中是否存在被标记为无效的第一参数;
[0246]
如果存在第一参数,则执行步骤s807,重运行集合搜索失败;
[0247]
如果不存在第一参数,则执行步骤s803,判断重运行集合中的所有抽象函数的输入参数中,是否存在参数局部版本表plvmap中的版本号低于参数全局版本表pgvmap中的版本号的第二参数;
[0248]
如果存在第二参数,则执行步骤s804,根据参数局部版本表plvmap,判断抽象函数中,是否存在输出参数包括第二参数的第一抽象函数;如果抽象函数中不存在第一抽象函数,则执行步骤s807,重运行集合搜索失败;如果抽象函数中存在第一抽象函数,则执行步骤s805,判断重运行集合是否包括第一抽象函数;如果重运行集合不包括第一抽象函数,则执行步骤s806,将第一抽象函数加入重运行集合,然后从步骤s802开始重新执行;
[0249]
如果不存在第二参数,或者如果重运行集合包括第一抽象函数,则执行步骤s808,判断重运行集合中的所有抽象函数的输出参数中,是否存在参数局部版本表plvmap中的版本号低于参数全局版本表pgvmap中的版本号的第三参数;
[0250]
如果不存在第三参数,则执行步骤s812,重运行集合搜索成功;
[0251]
如果存在第三参数,则执行步骤s809,根据参数局部版本表plvmap,判断抽象函数中,是否存在输入参数包括第三参数的第二抽象函数;如果抽象函数中不存在第二抽象函数,则执行步骤s807,重运行集合搜索失败;如果抽象函数中存在第二抽象函数,则执行步骤s810,判断重运行集合是否包括第二抽象函数;如果重运行集合不包括第二抽象函数,则执行步骤s811,将第二抽象函数加入重运行集合,然后从步骤s802开始重新执行;
[0252]
如果重运行集合包括第二抽象函数,则执行步骤s812,重运行集合搜索成功。
[0253]
步骤s270,在所述重运行集合搜索成功的情况下,运行所述重运行集合,以修复所述计算错误。
[0254]
在重运行集合搜索成功的情况下,由于重运行集合为一个幂等区域,可通过运行该重运行集合,来修复计算错误,以使应用程序恢复正确的计算过程。
[0255]
在一种可能的实现方式中,运行重运行集合时,可首先根据参数局部版本表plvmap,生成与重运行集合对应的局部控制流图:可根据参数局部版本表plvmap记录的抽象函数的标识符及抽象函数的接口参数的标识符,确定标识符及版本号相同的输入参数及输出参数,并确定该输入参数所属的抽象函数在该输出参数所属的抽象函数之后运行,进而生成与重运行集合对应的局部控制流图。
[0256]
例如,重运行集合包括3个抽象函数,分别为:af_c、af_d、af_e,参数局部版本表plvmap中记录的这3个抽象函数运行时的接口参数及其版本号,通过伪代码描述如下:
[0257]
[0258][0259]
由上述伪代码中可知,抽象函数af_c的输出参数para_d的标识符及版本号与抽象函数af_e的输入参数para_d的标识符及版本号相同,因此,抽象函数af_c的输出参数para_d是抽象函数af_e的输入参数,在控制流上,抽象函数af_c先于抽象函数af_e运行,即抽象函数af_e依赖于抽象函数af_c的运行结果,抽象函数af_c是抽象函数af_e运行的先决条件。
[0260]
类似地,抽象函数af_d的输出参数para_g的标识符及版本号与抽象函数af_e的输入参数para_g的标识符及版本号相同,因此,抽象函数af_d的输出参数para_g是抽象函数af_e的输入参数,在控制流上,抽象函数af_d先于抽象函数af_e运行,即抽象函数af_e依赖于抽象函数af_d的运行结果,抽象函数af_d是抽象函数af_e运行的先决条件。
[0261]
图9示出根据本技术一实施例的局部控制流图的示意图。如图9所示,该局部控制流图为根据参数局部版本表plvmap生成的与上述重运行集合对应的局部控制流图。该局部控制流图中包括抽象函数af_c、af_d、af_e,以及各个抽象函数的输入参数的标识符及版本号、输出参数的标识符及版本号,且在控制流上,抽象函数af_c和af_d在抽象函数af_e之前运行,抽象函数af_c的输出参数para_d1、抽象函数af_d的输出参数para_g1作为抽象函数af_e的输入参数。
[0262]
在一种可能的实现方式中,得到与重运行集合对应的局部控制流图后,可根据该局部控制流图,运行重运行集合。
[0263]
通过这种方式,不仅能够在应用程序运行过程中,基于参数局部版本表,动态生成重运行集合的局部控制流图,使得局部控制流图的生成不在依赖编译时分析,而且简单快速,能够提高生成局部控制流图时的处理速度,进而提高重运行集合的运行效率。
[0264]
在一种可能的实现方式中,本技术实施例的应用程序容错处理方法还可在应用程
序运行过程中,根据预设的检查点建立规则,建立至少一个检查点。例如,可在应用程序完成初始化开始运行之前,建立检查点;也可在应用程序运行至预设位置时,建立检查点。本领域技术人员可根据实际情况设置检查点建立规则及检查点的数量,本技术对此不作限制。建立检查点时,可备份应用程序运行所需的内存上下文(包括但不限于全局变量、堆栈、寄存器值等)。
[0265]
在重运行集合搜索失败的情况下,可从至少一个检查点中,确定出与目标抽象函数最近的检查点,并将该检查点确定为目标检查点,然后使用与目标检查点对应的内存上下文(即建立目标检查点时备份的内存上下文),恢复应用程序运行所需的内存上下文,之后从目标检查点开始,重新运行应用程序,来修复计算错误,以使应用程序恢复正确的计算过程。
[0266]
通过这种方式,能够在重运行集合搜索失败的情况下,从与目标抽象函数最近的检查点开始,重新运行应用程序来修复计算错误。
[0267]
图10示出根据本技术一实施例的应用程序容错处理方法的处理过程的示意图。如图10所示,使用本技术实施例的应用程序容错处理方法时,首先执行步骤s1001,在应用程序已完成初始化开始运行之前,建立检查点,该应用程序用于完成预设的计算任务;然后执行步骤s1002,运行应用程序,在应用程序运行过程中,标记并跟踪抽象函数及其接口参数,可将跟踪结果记录在参数局部版本表plvmap及参数全局版本表pgvmap中;并在步骤s1003中,判断是否检测到应用程序出现计算错误;
[0268]
如果未检测到应用程序出现计算错误,则执行步骤s1004,应用程序完成计算任务,输出计算结果;
[0269]
如果检测到应用程序出现计算错误,则执行步骤s1005,判断应用程序出现计算错误的次数是否大于或等于预设的错误次数阈值;
[0270]
如果应用程序出现计算错误的次数大于或等于预设的错误次数阈值,则执行步骤s1006,确定无法修复计算错误,计算任务执行失败;
[0271]
如果应用程序出现计算错误的次数小于预设的错误次数阈值,则执行步骤s1007,从抽象函数中,确定发生计算错误的目标抽象函数,然后执行步骤s1008,根据目标抽象函数的接口参数,判断目标抽象函数是否具有幂等性;
[0272]
如果目标抽象函数具有幂等性,则执行步骤s1009,重新运行目标抽象函数,以修复计算错误,并在运行过程中,重新从步骤s1002开始执行;
[0273]
如果目标抽象函数不具有幂等性,则执行步骤s1010,根据参数局部版本表plvmap及参数全局版本表pgvmap,在抽象函数中,搜索重运行集合,并在步骤s1011中,判断重运行集合是否搜索成功;
[0274]
如果重运行集合搜索成功,则执行步骤s1012,运行重运行集合,以修复计算错误,并在运行过程中,重新执行步骤s1002;
[0275]
如果重运行集合搜索失败,则执行步骤s1013,回退到步骤s1001中建立的检查点,重新运行应用程序,并在运行过程中,重新执行步骤s1002。
[0276]
需要说明的是,图10中仅以一个检查点作为示例,对本技术实施例的应用程序容错处理方法的处理过程进行了示例性说明,本领域技术人员可根据实际情况设置检查点的数量,本技术对此不作限制。
[0277]
基于上述实施例,本技术实施例的应用程序容错处理方法,在容错处理时,能够通过运行时的幂等性分析(包括目标抽象函数及重运行集合),尽可能减少检查点的使用数量,从而提高容错处理的性能。
[0278]
本技术实施例的应用程序容错处理方法,不仅支持单输入单输出(single-entry,single-exit,sese)的目标抽象函数及重运行集合的幂等性分析,而且支持多输入多输出的(multi-entry,multi-exit,meme)目标抽象函数及重运行集合的幂等性分析,从而能够扩展基于幂等性分析的容错处理的应用范围。
[0279]
在一种可能的实现方式中,本技术实施例的应用程序可运行在包括处理器及加速器的异构计算平台上,该场景下,在应用程序运行过程中,标记并跟踪抽象函数及其接口参数时,可将处理器发射到加速器的、由加速器运行的核函数(也可称为算子),标记为抽象函数。
[0280]
下面将结合图11a、图11b及图12a、图12b,对本技术实施例的应用程序容错处理方法的具体应用进行示例性说明。
[0281]
图11a示出根据本技术一实施例的应用程序容错处理方法的应用场景的示意图。图11a所示的应用场景为:本技术实施例的应用程序容错处理方法应用于基于英伟达nvidia gpu的cpu-gpu异构计算架构上。
[0282]
如图11a所示,基于nvidia gpu的cpu-gpu异构计算架构包括处理器cpu 1110、加速器gpu 1120及i/o设备1130,cpu 1110、加速器gpu 1120及i/o设备1130通过总线、noc等方式进行连接。处理器cpu 1110物理连接主内存(main memory)1140,加速器gpu 1120物理连接设备内存(device memory)1150,即处理器cpu 1110及加速器gpu 1120各自拥有独立的内存地址空间。
[0283]
gpu运行的计算程序为基于统一计算设备架构(compute unified device architecture,cuda)的核函数,可称为cuda核函数或cuda算子(cuda kernel)。cuda核函数由cpu发射(launch)到gpu上运行,在运行cuda核函数之前,首先要使用cuda提供的内存复制接口,将cuda核函数的输入数据复制到与gpu连接的设备内存(如图11a中的设备内存1150)中指定的地址,cuda核函数执行完成后,也要使用cuda提供的内存复制接口,将输出数据(即cuda核函数的计算结果)复制到与cpu连接的主内存(如图11a中的主内存1140)中才能在cpu中参与其它计算过程。
[0284]
nvidia的开发套件中包括cuda描述工具接口(cuda profiling tools interface,cupti)。cupti接口能够截获所有cuda核函数的发射以及相关的输入输出数据复制操作,并在截获这些操作时执行可预先编程的记录和统计等操作,从而实现对gpu计算性能的评估。
[0285]
因此,在基于nvidia gpu的cpu-gpu异构计算架构上应用本技术实施例的应用程序容错处理方法时,可将cpu发送给gpu的cuda核函数看作抽象函数,并通过封装cupti接口来实现抽象函数参数读写跟踪模块的功能。
[0286]
图11b示出根据本技术一实施例的应用程序容错处理方法的处理过程的示意图。如图11b所示,cpu 1110运行应用程序时,可将需要gpu 1120运行的cuda核函数发送给gpu 1120,同时通过cuda提供的内存复制接口,将cuda核函数的输入数据从主内存1140复制到设备内存1150中,以供cuda核函数运行时使用。gpu 1120运行完cuda核函数后,可将输出数
据存储在设备内存1150中,并通过cuda提供的内存复制接口,将输出数据从设备内存1150复制到主内存1140中。
[0287]
在cpu 1110运行应用程序过程中,可通过封装的cupti接口1160(用于实现本技术实施例中的抽象函数参数读写跟踪模块的功能)将cpu 1110发送给gpu 1120运行的cuda核函数标记为抽象函数,并标记抽象函数的接口参数,以及跟踪接口参数的读写变化,将跟踪结果记录在参数全局版本表及参数局部版本表中。
[0288]
在gpu 1120运行cuda核函数的过程中发生计算错误时,可向cpu 1110发送出现计算错误的消息,cpu 1110收到gpu 1120发送的出现计算错误的消息后,可确定出现计算错误的cuda核函数(即目标抽象函数),并分析出现计算错误的cuda核函数的幂等性,如果出现计算错误的cuda核函数具有幂等性,则重新发射出现计算错误的cuda核函数到gpu运行,以修复计算错误。
[0289]
如果出现计算错误的cuda核函数不具有幂等性,cpu 1110则根据参数全局版本表及参数局部版本表,通过上述实施例所述的方法,在抽象函数中,搜索重运行集合。如果重运行结合搜索成功,则运行重运行集合,以修复计算错误。如果重运行结合搜索失败,则通过检查点修复计算错误。
[0290]
在本示例中,基于nvidia gpu的cupti接口实现了核函数的幂等性判断和重运行集合搜索。由于通常80%以上使用的核函数都具有幂等性,因此,不必在幂等核函数执行前建立检查点备份输入数据,从而能够将建立检查点的粒度扩大到由多个核函数组成的整个计算任务,例如深度神经网络计算中的一次完整的迭代,而不是通常的每个核函数。这样可以在不损失计算容错能力的情况下将建立检查点的开销从10%以上减少到1%以下。
[0291]
本示例不仅可以实现运行时动态幂等性分析,无需事先进行静态的编译时幂等性分析,减少对于源代码和开发工具的依赖,而且不需要对现有的硬件做任何改动,对于处理器的指令集没有额外要求,同时也不限制幂等区域(目标抽象函数及重运行集合)的形式,支持对多输入多输出的幂等区域的分析,具备更好的通用性。此外,本示例还可进一步增大容错粒度,减少检查点。
[0292]
图12a示出根据本技术一实施例的应用程序容错处理方法的应用场景的示意图。图12a所示的应用场景为:本技术实施例的应用程序容错处理方法应用于基于昇腾处理器(例如ascend 910/310)的计算平台上。
[0293]
如图12a所示,基于昇腾处理器的计算平台中,昇腾处理器中同时包含多个cpu核心1210(cpu cores)和多个神经网络处理器核心1220(artificial intelligence cores,ai cores,ai核心),多个cpu核心1210与多个ai核心1220共享同一套内存控制器连接的内存设备(即图12a所示的共享内存1240),并且共享同一个物理内存地址空间。多个cpu核心1210、多个ai核心1220、共享内存1240及i/o设备1230通过总线、noc等方式进行连接。
[0294]
基于昇腾处理器的计算平台也将具体的计算步骤封装为核函数,但在昇腾平台上,核算数称为张量加速引擎算子(tensor boost engine kernel,tbe kernel),简称tbe算子。tbe算子具有被清晰定义的输入输出参数。tbe算子可以通过调用昇腾计算语言(ascend computing language,acl)运行时库来启动。
[0295]
由于基于昇腾处理器的计算平台的cpu核心和ai核心共享了物理内存,在发射tbe算子时,不再需要将输入数据及输出数据在主内存和设备内存之间来回复制。但为了便于
编程和进行内存管理,用于控制任务流程的cpu核心和用于执行具体神经网络计算的ai核心分别以不同的内存管理接口操作不同的虚拟地址空间。发射tbe算子时给出的输入数据,实际上不是将输入数据从主内存复制到设备内存,而是建立虚拟主内存空间中的输入数据的地址与虚拟设备内存空间中的输入数据的地址之间的地址映射。存放输入数据及输出数据的物理内存空间,实际上由acl运行时库来分配,但可以同时由虚拟主内存空间中的对应地址和虚拟设备内存空间中的对应地址来访问。因此acl运行时库实际上能够获取所有对tbe算子的调用、输入数据及输出数据内存地址的映射及读写访问。
[0296]
因此,在基于昇腾处理器的计算平台上应用本技术实施例的应用程序容错处理方法时,可将cpu核心发送给ai核心的tbe算子看作抽象函数,并通过封装acl运行时库的对应接口(以下简称acl运行时接口)来实现抽象函数参数读写跟踪模块的功能。
[0297]
图12b示出根据本技术一实施例的应用程序容错处理方法的处理过程的示意图。如图12b所示,基于昇腾处理器的计算平台中,昇腾处理器中同时包含多个cpu核心(cpu cores)1210及多个ai核心(ai cores),其中,多个ai核心包括多个ai gpu核心(ai gpu cores)1221及多个ai cpu核心(ai cpu cores)1222。
[0298]
cpu核心1210运行应用程序时,可将需要ai核心(例如图12b中的ai gpu核心1221或ai cpu核心1222)运行的tbe算子发送给ai核心,同时,通过acl运行时(acl runtime)接口1270,建立虚拟主内存空间1250中的输入数据的地址与虚拟设备内存空间1260中的输入数据的地址之间的映射,使得cpu核心1210可以通过虚拟主内存空间1250中的输入数据的地址访问共享内存1240中的输入数据,ai核心可以通过虚拟设备内存空间1260中的输入数据的地址访问共享内存1240中的输入数据。其中,共享内存1240为物理内存,例如双倍速率同步动态随机存储器(double data rate synchronous dynamic random access memory,ddr)、高带宽存储器(high bandwidth memory,hbm)等。
[0299]
ai核心运行完tbe算子后,可通过acl运行时接口1270,在共享内存1240中,为输出数据分配内存,并将输出数据存储在分配的内存中,同时建立虚拟主内存空间1250中的输出数据的地址与虚拟设备内存空间1260中的输出数据的地址之间的映射,使得cpu核心1210可以通过虚拟主内存空间1250中的输出数据的地址访问共享内存1240中的输出数据,ai核心可以通过虚拟设备内存空间1260中的输出数据的地址访问共享内存1240中的输出数据。
[0300]
在cpu核心1210运行应用程序过程中,可通过封装的acl运行时接口1270(用于实现本技术实施例中的抽象函数参数读写跟踪模块的功能)将cpu核心1210发送给ai核心运行的tbe算子标记为抽象函数,并标记抽象函数的接口参数,以及跟踪接口参数的读写变化,将跟踪结果记录在参数全局版本表及参数局部版本表中。
[0301]
在ai核心运行tbe算子的过程中发生计算错误时,可向cpu核心1210发送出现计算错误的消息,cpu核心1210收到ai核心发送的出现计算错误的消息后,可确定出现计算错误的tbe算子(即目标抽象函数),并分析出现计算错误的tbe算子的幂等性,如果出现计算错误的tbe算子具有幂等性,则重新发射出现计算错误的tbe算子到ai核心运行,以修复计算错误。
[0302]
如果出现计算错误的tbe算子不具有幂等性,cpu核心1210则根据参数全局版本表及参数局部版本表,通过上述实施例所述的方法,在抽象函数中,搜索重运行集合。如果重
运行结合搜索成功,则运行重运行集合,以修复计算错误。如果重运行结合搜索失败,则通过检查点修复计算错误。
[0303]
在本示例中,基于昇腾处理器计算平台的acl运行时接口实现了tbe算子的幂等性判断和重运行集合搜索。由于大部分tbe算子都具有幂等性,在采用本技术实施例的应用程序容错处理方法的情况下,可以将建立检查点的粒度扩大到由多个tbe算子组成的整个计算任务,从而能够在不损失计算容错能力的情况下将建立检查点的开销从10%以上减少到1%以下。
[0304]
基于上述示例,本技术实施例的应用程序容错处理方法应用于具有共享内存地址空间的异构计算平台时,可通过建立虚拟主内存空间和虚拟设备内存空间到共享的物理内存空间的地址映射来避免内存数据复制,从而提高计算效率。
[0305]
本技术实施例的应用程序容错处理方法的应用场景并不受限于处理器核心架构、物理内存架构和内存地址空间的具体组织形式,只要计算平台的软件架构上存在能够记录抽象函数(核函数或算子)调用及其输入输出参数地址或标识符的接口即可。
[0306]
本技术实施例的应用程序容错处理方法可应用于大部分计算和数据密集型场景的计算硬件容错,例如昇腾解决方案产品中的atlas系列板块和服务器产品,基于昇腾处理器的云计算服务产品,鲲鹏解决方案产品中的大数据存储和处理场景、视频数据处理场景等;同时也能够应用于基于x86或nvidia gpu计算平台的计算或数据密集型应用场景。
[0307]
需要说明的是,本领域技术人员可根据实际情况确定本技术实施例的应用程序容错处理方法的具体应用场景,本技术对此不作限制。
[0308]
图13示出根据本技术一实施例的应用程序容错处理装置的框图。如图13所示,该应用程序容错处理装置,包括:
[0309]
第一运行模块1310,用于运行应用程序,所述应用程序用于完成预设的计算任务;
[0310]
标记及跟踪模块1320,用于在所述应用程序运行过程中,标记并跟踪抽象函数及所述抽象函数的接口参数,所述抽象函数用于指示所述应用程序中的预设级别的功能模块,所述抽象函数的接口参数包括输入参数及输出参数,所述输入参数为存储所述功能模块的输入数据的内存区域,所述输出参数为存储所述功能模块的输出数据的内存区域;
[0311]
目标抽象函数确定模块1330,用于在检测到所述应用程序出现计算错误的情况下,从所述抽象函数中,确定发生所述计算错误的目标抽象函数;
[0312]
幂等性判断模块1340,用于根据所述目标抽象函数的接口参数,判断所述目标抽象函数是否具有幂等性;
[0313]
第二运行模块1350,用于在所述目标抽象函数具有幂等性的情况下,重新运行所述目标抽象函数,以修复所述计算错误。
[0314]
在一种可能的实现方式中,所述接口参数具有版本号,所述版本号用于指示所述接口参数的数据存放状态,所述标记及跟踪模块1320,被配置为:在所述应用程序运行过程中,根据所述预设级别,识别所述应用程序中的功能模块,将识别出的功能模块标记为抽象函数;确定所述抽象函数的接口参数及所述接口参数的版本号;根据所述抽象函数的接口参数及所述接口参数的版本号,更新参数全局版本表及参数局部版本表,其中,所述参数全局版本表用于记录所述应用程序的所有抽象函数的接口参数的最新版本号,所述参数局部版本表用于记录所述应用程序的各个抽象函数运行时的接口参数的版本号。
[0315]
在一种可能的实现方式中,所述根据所述抽象函数的接口参数及所述接口参数的版本号,更新参数全局版本表及参数局部版本表,包括:将所述抽象函数的标识符及所述抽象函数的接口参数的标识符及版本号,加入参数局部版本表中。
[0316]
在一种可能的实现方式中,所述根据所述抽象函数的接口参数及所述接口参数的版本号,更新参数全局版本表及参数局部版本表,包括:在参数全局版本表中存在所述抽象函数的接口参数的情况下,更新所述参数全局版本表中所述抽象函数的接口参数的版本号;或在所述参数全局版本表中不存在所述抽象函数的接口参数的情况下,将所述抽象函数的接口参数的标识符及版本号,加入所述参数全局版本表中。
[0317]
在一种可能的实现方式中,所述根据所述抽象函数的接口参数及所述接口参数的版本号,更新参数全局版本表及参数局部版本表,包括:在所述接口参数被所述应用程序的抽象函数之外的其他操作修改的情况下,更新所述参数全局版本表中所述接口参数的版本号;将所述参数局部版本表中,版本号低于所述参数全局版本表中的版本号的所述接口参数,标记为无效。
[0318]
在一种可能的实现方式中,所述幂等性判断模块1340,被配置为:判断所述参数局部版本表中所述目标抽象函数的接口参数的标识符中,是否存在相同的标识符;在不存在相同的标识符的情况下,确定所述目标抽象函数具有幂等性。
[0319]
在一种可能的实现方式中,所述装置还包括:重运行集合搜索模块,用于在所述目标抽象函数不具有幂等性的情况下,在所述抽象函数中,搜索重运行集合,所述重运行集合用于指示为修复所述计算错误所必须重新运行的最小抽象函数的集合;第三运行模块,用于在所述重运行集合搜索成功的情况下,运行所述重运行集合,以修复所述计算错误。
[0320]
在一种可能的实现方式中,所述重运行集合搜索模块,被配置为:根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合。
[0321]
在一种可能的实现方式中,所述根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合,包括:将所述目标抽象函数加入重运行集合;判断所述参数局部版本表中,所述重运行集合中的所有抽象函数的接口参数中是否存在被标记为无效的第一参数;在不存在第一参数的情况下,判断所述重运行集合中的所有抽象函数的输入参数中,是否存在所述参数局部版本表中的版本号低于所述参数全局版本表中的版本号的第二参数;在存在所述第二参数的情况下,根据所述参数局部版本表,判断所述抽象函数中,是否存在输出参数包括所述第二参数的第一抽象函数;在所述抽象函数中存在所述第一抽象函数的情况下,判断所述重运行集合是否包括所述第一抽象函数;在所述重运行集合不包括所述第一抽象函数的情况下,将所述第一抽象函数加入所述重运行集合;从步骤所述判断所述参数局部版本表中,所述重运行集合中的所有抽象函数的接口参数中是否存在被标记为无效的第一参数开始重新执行,直到所述重运行集合包括所述第一抽象函数。
[0322]
在一种可能的实现方式中,所述根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合,包括:在不存在所述第二参数或所述重运行集合包括所述第一抽象函数的情况下,判断所述重运行集合中的所有抽象函数的输出参数中,是否存在所述参数局部版本表中的版本号低于所述参数全局版本表中的版本号的第三参数;在存在所述第三参数的情况下,根据所述参数局部版本表,判断所述抽象函数中,是否
存在输入参数包括所述第三参数的第二抽象函数;在所述抽象函数中存在所述第二抽象函数的情况下,判断所述重运行集合是否包括所述第二抽象函数;在所述重运行集合不包括所述第二抽象函数的情况下,将所述第二抽象函数加入所述重运行集合;从步骤所述判断所述参数局部版本表中,所述重运行集合中的所有抽象函数的接口参数中是否存在被标记为无效的第一参数开始重新执行,直到所述重运行集合包括所述第二抽象函数。
[0323]
在一种可能的实现方式中,所述根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合,包括:在不存在所述第三参数或所述重运行集合包括所述第二抽象函数的情况下,所述重运行集合搜索成功。
[0324]
在一种可能的实现方式中,所述根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合,包括如下任意一项:在存在所述第一参数的情况下,所述重运行集合搜索失败;在所述抽象函数中不存在所述第一抽象函数的情况下,所述重运行集合搜索失败;在所述抽象函数中不存在所述第二抽象函数的情况下,所述重运行集合搜索失败。
[0325]
在一种可能的实现方式中,所述第三运行模块,被配置为:根据所述参数局部版本表,生成与所述重运行集合对应的局部控制流图;根据所述局部控制流图,运行所述重运行集合。
[0326]
在一种可能的实现方式中,所述装置还包括:检查点建立模块,用于在所述应用程序运行过程中,根据预设的检查点建立规则,建立至少一个检查点;目标检查点确定模块,用于在所述重运行集合搜索失败的情况下,从所述至少一个检查点中,确定出与所述目标抽象函数最近的目标检查点;第四运行模块,用于从所述目标检查点开始,重新运行所述应用程序,以修复所述计算错误。
[0327]
在一种可能的实现方式中,所述应用程序运行在包括处理器及加速器的异构计算平台上,所述标记及跟踪模块1320,被配置为:在所述应用程序运行过程中,将所述处理器发射到所述加速器的核函数,标记为抽象函数。
[0328]
本技术的实施例提供了一种应用程序容错处理装置,包括:处理器以及用于存储处理器可执行指令的存储器;其中,所述处理器被配置为执行所述指令时实现上述方法。
[0329]
本技术的实施例提供了一种非易失性计算机可读存储介质,其上存储有计算机程序指令,所述计算机程序指令被处理器执行时实现上述方法。
[0330]
本技术的实施例提供了一种计算机程序产品,包括计算机可读代码,或者承载有计算机可读代码的非易失性计算机可读存储介质,当所述计算机可读代码在电子设备的处理器中运行时,所述电子设备中的处理器执行上述方法。
[0331]
计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(random access memory,ram)、只读存储器(read only memory,rom)、可擦式可编程只读存储器(electrically programmable read-only-memory,eprom或闪存)、静态随机存取存储器(static random-access memory,sram)、便携式压缩盘只读存储器(compact disc read-only memory,cd-rom)、数字多功能盘(digital video disc,dvd)、记忆棒、软盘、机械编码
设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。
[0332]
这里所描述的计算机可读程序指令或代码可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。
[0333]
用于执行本技术操作的计算机程序指令可以是汇编指令、指令集架构(instruction set architecture,isa)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言—诸如smalltalk、c++等,以及常规的过程式编程语言—诸如“c”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(local area network,lan)或广域网(wide area network,wan)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实施例中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(field-programmable gate array,fpga)或可编程逻辑阵列(programmable logic array,pla),该电子电路可以执行计算机可读程序指令,从而实现本技术的各个方面。
[0334]
这里参照根据本技术实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本技术的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。
[0335]
这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。
[0336]
也可以把计算机可读程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其它可编程数据处理装置、或其它设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。
[0337]
附图中的流程图和框图显示了根据本技术的多个实施例的装置、系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并
行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。
[0338]
也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行相应的功能或动作的硬件(例如电路或asic(application specific integrated circuit,专用集成电路))来实现,或者可以用硬件和软件的组合,如固件等来实现。
[0339]
尽管在此结合各实施例对本发明进行了描述,然而,在实施所要求保护的本发明过程中,本领域技术人员通过查看所述附图、公开内容、以及所附权利要求书,可理解并实现所述公开实施例的其它变化。在权利要求中,“包括”(comprising)一词不排除其他组成部分或步骤,“一”或“一个”不排除多个的情况。单个处理器或其它单元可以实现权利要求中列举的若干项功能。相互不同的从属权利要求中记载了某些措施,但这并不表示这些措施不能组合起来产生良好的效果。
[0340]
以上已经描述了本技术的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。
技术特征:
1.一种应用程序容错处理方法,其特征在于,所述方法包括:运行应用程序,所述应用程序用于完成预设的计算任务;在所述应用程序运行过程中,标记并跟踪抽象函数及所述抽象函数的接口参数,所述抽象函数用于指示所述应用程序中的预设级别的功能模块,所述抽象函数的接口参数包括输入参数及输出参数,所述输入参数为存储所述功能模块的输入数据的内存区域,所述输出参数为存储所述功能模块的输出数据的内存区域;在检测到所述应用程序出现计算错误的情况下,从所述抽象函数中,确定发生所述计算错误的目标抽象函数;根据所述目标抽象函数的接口参数,判断所述目标抽象函数是否具有幂等性;在所述目标抽象函数具有幂等性的情况下,重新运行所述目标抽象函数,以修复所述计算错误。2.根据权利要求1所述的方法,其特征在于,所述接口参数具有版本号,所述版本号用于指示所述接口参数的数据存放状态,所述标记并跟踪抽象函数及所述抽象函数的接口参数,包括:在所述应用程序运行过程中,根据所述预设级别,识别所述应用程序中的功能模块,将识别出的功能模块标记为抽象函数;确定所述抽象函数的接口参数及所述接口参数的版本号;根据所述抽象函数的接口参数及所述接口参数的版本号,更新参数全局版本表及参数局部版本表,其中,所述参数全局版本表用于记录所述应用程序的所有抽象函数的接口参数的最新版本号,所述参数局部版本表用于记录所述应用程序的各个抽象函数运行时的接口参数的版本号。3.根据权利要求2所述的方法,其特征在于,所述根据所述抽象函数的接口参数及所述接口参数的版本号,更新参数全局版本表及参数局部版本表,包括:将所述抽象函数的标识符及所述抽象函数的接口参数的标识符及版本号,加入参数局部版本表中。4.根据权利要求2或3所述的方法,其特征在于,所述根据所述抽象函数的接口参数及所述接口参数的版本号,更新参数全局版本表及参数局部版本表,包括:在参数全局版本表中存在所述抽象函数的接口参数的情况下,更新所述参数全局版本表中所述抽象函数的接口参数的版本号;或在所述参数全局版本表中不存在所述抽象函数的接口参数的情况下,将所述抽象函数的接口参数的标识符及版本号,加入所述参数全局版本表中。5.根据权利要求2-4中任意一项所述的方法,其特征在于,所述根据所述抽象函数的接口参数及所述接口参数的版本号,更新参数全局版本表及参数局部版本表,包括:在所述接口参数被所述应用程序的抽象函数之外的其他操作修改的情况下,更新所述参数全局版本表中所述接口参数的版本号;将所述参数局部版本表中,版本号低于所述参数全局版本表中的版本号的所述接口参数,标记为无效。
6.根据权利要求2-5中任意一项所述的方法,其特征在于,所述根据所述目标抽象函数的接口参数,判断所述目标抽象函数是否具有幂等性,包括:判断所述参数局部版本表中所述目标抽象函数的接口参数的标识符中,是否存在相同的标识符;在不存在相同的标识符的情况下,确定所述目标抽象函数具有幂等性。7.根据权利要求2-6中任意一项所述的方法,其特征在于,所述方法还包括:在所述目标抽象函数不具有幂等性的情况下,在所述抽象函数中,搜索重运行集合,所述重运行集合用于指示为修复所述计算错误所必须重新运行的最小抽象函数的集合;在所述重运行集合搜索成功的情况下,运行所述重运行集合,以修复所述计算错误。8.根据权利要求7所述的方法,其特征在于,所述在所述抽象函数中,搜索重运行集合,包括:根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合。9.根据权利要求8所述的方法,其特征在于,所述根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合,包括:将所述目标抽象函数加入重运行集合;判断所述参数局部版本表中,所述重运行集合中的所有抽象函数的接口参数中是否存在被标记为无效的第一参数;在不存在第一参数的情况下,判断所述重运行集合中的所有抽象函数的输入参数中,是否存在所述参数局部版本表中的版本号低于所述参数全局版本表中的版本号的第二参数;在存在所述第二参数的情况下,根据所述参数局部版本表,判断所述抽象函数中,是否存在输出参数包括所述第二参数的第一抽象函数;在所述抽象函数中存在所述第一抽象函数的情况下,判断所述重运行集合是否包括所述第一抽象函数;在所述重运行集合不包括所述第一抽象函数的情况下,将所述第一抽象函数加入所述重运行集合;从步骤所述判断所述参数局部版本表中,所述重运行集合中的所有抽象函数的接口参数中是否存在被标记为无效的第一参数开始重新执行,直到所述重运行集合包括所述第一抽象函数。10.根据权利要求9所述的方法,其特征在于,所述根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合,包括:在不存在所述第二参数或所述重运行集合包括所述第一抽象函数的情况下,判断所述重运行集合中的所有抽象函数的输出参数中,是否存在所述参数局部版本表中的版本号低于所述参数全局版本表中的版本号的第三参数;在存在所述第三参数的情况下,根据所述参数局部版本表,判断所述抽象函数中,是否存在输入参数包括所述第三参数的第二抽象函数;在所述抽象函数中存在所述第二抽象函数的情况下,判断所述重运行集合是否包括所述第二抽象函数;
在所述重运行集合不包括所述第二抽象函数的情况下,将所述第二抽象函数加入所述重运行集合;从步骤所述判断所述参数局部版本表中,所述重运行集合中的所有抽象函数的接口参数中是否存在被标记为无效的第一参数开始重新执行,直到所述重运行集合包括所述第二抽象函数。11.根据权利要求10所述的方法,其特征在于,所述根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合,包括:在不存在所述第三参数或所述重运行集合包括所述第二抽象函数的情况下,所述重运行集合搜索成功。12.根据权利要求10所述的方法,其特征在于,所述根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合,包括如下任意一项:在存在所述第一参数的情况下,所述重运行集合搜索失败;在所述抽象函数中不存在所述第一抽象函数的情况下,所述重运行集合搜索失败;在所述抽象函数中不存在所述第二抽象函数的情况下,所述重运行集合搜索失败。13.根据权利要求7所述的方法,其特征在于,所述运行所述重运行集合,包括:根据所述参数局部版本表,生成与所述重运行集合对应的局部控制流图;根据所述局部控制流图,运行所述重运行集合。14.根据权利要求7-13中任意一项所述的方法,其特征在于,所述方法还包括:在所述应用程序运行过程中,根据预设的检查点建立规则,建立至少一个检查点;在所述重运行集合搜索失败的情况下,从所述至少一个检查点中,确定出与所述目标抽象函数最近的目标检查点;从所述目标检查点开始,重新运行所述应用程序,以修复所述计算错误。15.根据权利要求1-14中任意一项所述的方法,其特征在于,所述应用程序运行在包括处理器及加速器的异构计算平台上,所述标记并跟踪抽象函数及所述抽象函数的接口参数,包括:在所述应用程序运行过程中,将所述处理器发射到所述加速器的核函数,标记为抽象函数。16.一种应用程序容错处理装置,其特征在于,所述装置包括:第一运行模块,用于运行应用程序,所述应用程序用于完成预设的计算任务;标记及跟踪模块,用于在所述应用程序运行过程中,标记并跟踪抽象函数及所述抽象函数的接口参数,所述抽象函数用于指示所述应用程序中的预设级别的功能模块,所述抽象函数的接口参数包括输入参数及输出参数,所述输入参数为存储所述功能模块的输入数据的内存区域,所述输出参数为存储所述功能模块的输出数据的内存区域;目标抽象函数确定模块,用于在检测到所述应用程序出现计算错误的情况下,从所述抽象函数中,确定发生所述计算错误的目标抽象函数;幂等性判断模块,用于根据所述目标抽象函数的接口参数,判断所述目标抽象函数是否具有幂等性;第二运行模块,用于在所述目标抽象函数具有幂等性的情况下,重新运行所述目标抽象函数,以修复所述计算错误。
17.根据权利要求16所述的装置,其特征在于,所述接口参数具有版本号,所述版本号用于指示所述接口参数的数据存放状态,所述标记及跟踪模块,被配置为:在所述应用程序运行过程中,根据所述预设级别,识别所述应用程序中的功能模块,将识别出的功能模块标记为抽象函数;确定所述抽象函数的接口参数及所述接口参数的版本号;根据所述抽象函数的接口参数及所述接口参数的版本号,更新参数全局版本表及参数局部版本表,其中,所述参数全局版本表用于记录所述应用程序的所有抽象函数的接口参数的最新版本号,所述参数局部版本表用于记录所述应用程序的各个抽象函数运行时的接口参数的版本号。18.根据权利要求17所述的装置,其特征在于,所述根据所述抽象函数的接口参数及所述接口参数的版本号,更新参数全局版本表及参数局部版本表,包括:将所述抽象函数的标识符及所述抽象函数的接口参数的标识符及版本号,加入参数局部版本表中。19.根据权利要求17或18所述的装置,其特征在于,所述根据所述抽象函数的接口参数及所述接口参数的版本号,更新参数全局版本表及参数局部版本表,包括:在参数全局版本表中存在所述抽象函数的接口参数的情况下,更新所述参数全局版本表中所述抽象函数的接口参数的版本号;或在所述参数全局版本表中不存在所述抽象函数的接口参数的情况下,将所述抽象函数的接口参数的标识符及版本号,加入所述参数全局版本表中。20.根据权利要求17-19中任意一项所述的装置,其特征在于,所述根据所述抽象函数的接口参数及所述接口参数的版本号,更新参数全局版本表及参数局部版本表,包括:在所述接口参数被所述应用程序的抽象函数之外的其他操作修改的情况下,更新所述参数全局版本表中所述接口参数的版本号;将所述参数局部版本表中,版本号低于所述参数全局版本表中的版本号的所述接口参数,标记为无效。21.根据权利要求17-20中任意一项所述的装置,其特征在于,所述幂等性判断模块,被配置为:判断所述参数局部版本表中所述目标抽象函数的接口参数的标识符中,是否存在相同的标识符;在不存在相同的标识符的情况下,确定所述目标抽象函数具有幂等性。22.根据权利要求17-21中任意一项所述的装置,其特征在于,所述装置还包括:重运行集合搜索模块,用于在所述目标抽象函数不具有幂等性的情况下,在所述抽象函数中,搜索重运行集合,所述重运行集合用于指示为修复所述计算错误所必须重新运行的最小抽象函数的集合;第三运行模块,用于在所述重运行集合搜索成功的情况下,运行所述重运行集合,以修复所述计算错误。
23.根据权利要求22所述的装置,其特征在于,所述重运行集合搜索模块,被配置为:根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合。24.根据权利要求23所述的装置,其特征在于,所述根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合,包括:将所述目标抽象函数加入重运行集合;判断所述参数局部版本表中,所述重运行集合中的所有抽象函数的接口参数中是否存在被标记为无效的第一参数;在不存在第一参数的情况下,判断所述重运行集合中的所有抽象函数的输入参数中,是否存在所述参数局部版本表中的版本号低于所述参数全局版本表中的版本号的第二参数;在存在所述第二参数的情况下,根据所述参数局部版本表,判断所述抽象函数中,是否存在输出参数包括所述第二参数的第一抽象函数;在所述抽象函数中存在所述第一抽象函数的情况下,判断所述重运行集合是否包括所述第一抽象函数;在所述重运行集合不包括所述第一抽象函数的情况下,将所述第一抽象函数加入所述重运行集合;从步骤所述判断所述参数局部版本表中,所述重运行集合中的所有抽象函数的接口参数中是否存在被标记为无效的第一参数开始重新执行,直到所述重运行集合包括所述第一抽象函数。25.根据权利要求24所述的装置,其特征在于,所述根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合,包括:在不存在所述第二参数或所述重运行集合包括所述第一抽象函数的情况下,判断所述重运行集合中的所有抽象函数的输出参数中,是否存在所述参数局部版本表中的版本号低于所述参数全局版本表中的版本号的第三参数;在存在所述第三参数的情况下,根据所述参数局部版本表,判断所述抽象函数中,是否存在输入参数包括所述第三参数的第二抽象函数;在所述抽象函数中存在所述第二抽象函数的情况下,判断所述重运行集合是否包括所述第二抽象函数;在所述重运行集合不包括所述第二抽象函数的情况下,将所述第二抽象函数加入所述重运行集合;从步骤所述判断所述参数局部版本表中,所述重运行集合中的所有抽象函数的接口参数中是否存在被标记为无效的第一参数开始重新执行,直到所述重运行集合包括所述第二抽象函数。26.根据权利要求25所述的装置,其特征在于,所述根据所述参数全局版本表及所述参数局部版本表,在所述抽象函数中,搜索重运行集合,包括:在不存在所述第三参数或所述重运行集合包括所述第二抽象函数的情况下,所述重运行集合搜索成功。27.根据权利要求25所述的装置,其特征在于,所述根据所述参数全局版本表及所述参
数局部版本表,在所述抽象函数中,搜索重运行集合,包括如下任意一项:在存在所述第一参数的情况下,所述重运行集合搜索失败;在所述抽象函数中不存在所述第一抽象函数的情况下,所述重运行集合搜索失败;在所述抽象函数中不存在所述第二抽象函数的情况下,所述重运行集合搜索失败。28.根据权利要求22所述的装置,其特征在于,所述第三运行模块,被配置为:根据所述参数局部版本表,生成与所述重运行集合对应的局部控制流图;根据所述局部控制流图,运行所述重运行集合。29.根据权利要求22-28中任意一项所述的装置,其特征在于,所述装置还包括:检查点建立模块,用于在所述应用程序运行过程中,根据预设的检查点建立规则,建立至少一个检查点;目标检查点确定模块,用于在所述重运行集合搜索失败的情况下,从所述至少一个检查点中,确定出与所述目标抽象函数最近的目标检查点;第四运行模块,用于从所述目标检查点开始,重新运行所述应用程序,以修复所述计算错误。30.根据权利要求16-29中任意一项所述的装置,其特征在于,所述应用程序运行在包括处理器及加速器的异构计算平台上,所述标记及跟踪模块,被配置为:在所述应用程序运行过程中,将所述处理器发射到所述加速器的核函数,标记为抽象函数。31.一种应用程序容错处理装置,其特征在于,包括:处理器;用于存储处理器可执行指令的存储器;其中,所述处理器被配置为执行所述指令时实现权利要求1-15中任意一项所述的方法。32.一种非易失性计算机可读存储介质,其上存储有计算机程序指令,其特征在于,所述计算机程序指令被处理器执行时实现权利要求1-15中任意一项所述的方法。33.一种计算机程序产品,其特征在于,包括计算机可读代码,或者承载有计算机可读代码的非易失性计算机可读存储介质,当所述计算机可读代码在电子设备中运行时,所述电子设备中的处理器执行权利要求1-15中任意一项所述的方法。
技术总结
本申请涉及一种应用程序容错处理方法、装置及存储介质,所述方法包括运行应用程序,应用程序用于完成预设的计算任务;在应用程序运行过程中,标记并跟踪抽象函数及抽象函数的接口参数;在检测到应用程序出现计算错误的情况下,从抽象函数中,确定发生计算错误的目标抽象函数;根据目标抽象函数的接口参数,判断目标抽象函数是否具有幂等性;在目标抽象函数具有幂等性的情况下,重新运行目标抽象函数,以修复计算错误。本申请的实施例能够实现动态的、应用程序运行时的幂等性分析,以及支持可调整的容错粒度,提高了容错处理的通用性及容错性能。错性能。错性能。
技术研发人员:冷静文 韩林 刁阳彬 过敏意
受保护的技术使用者:华为技术有限公司
技术研发日:2021.12.29
技术公布日:2023/7/13
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
飞机超市 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/