使用编译器插入的转换代码对冗余线程进行指纹识别的制作方法

文档序号:16807036发布日期:2019-02-10 13:08阅读:175来源:国知局
使用编译器插入的转换代码对冗余线程进行指纹识别的制作方法

相关技术的描述

诸如中央处理单元(cpu)、图形处理单元(gpu)和加速处理单元(apu)之类的处理单元实现多个计算单元(例如,处理器核)以同时或并行地处理多个指令。例如,gpu可以使用多个计算单元来实现,每个计算单元都包括用于同时或并行地执行指令流(通常称为“工作项”或“线程”)的多个处理元件。根据单指令多数据(simd)架构运算的计算单元使用不同的数据集来执行相同的指令。可以在诸如gpu之类的处理单元上同时或并行执行的线程数可以从数十个线程到数千个线程,工程师们渴望将这种能力用于超出通常在gpu上实现的二维(2-d)或三维(3-d)图形应用程序的应用程序。但是,通用应用程序需要比传统图形应用程序更高级别的容错能力,以避免应用程序错误或系统崩溃。

附图说明

通过参考附图,可以更好地理解本公开,并且其众多特征和优点对于本领域技术人员而言将显而易见。在不同附图中使用相同的附图标记表示相似或相同的项目。

图1是根据一些实施方案的加速处理装置的框图。

图2是根据一些实施方案的可以在图1所示的加速处理装置上执行的线程分组的层次结构的框图。

图3是根据一些实施方案的加速处理装置的框图,该加速处理装置基于自从对指纹的先前比较以来发生的事件触发器的数量来选择性地绕过对冗余线程的指纹的比较。

图4是示出根据一些实施方案的在程序代码编译期间由编译器插入的转换代码对程序代码的修改的图。

图5是根据一些实施方案的用于选择性地绕过或执行在冗余线程之间的共享和比较运算(share-and-compareoperation)以检测错误的方法的流程图。

图6是根据一些实施方案的用于执行退出检查以确定在退出程序代码之前是否在冗余线程之间执行共享和比较运算的方法的流程图。

具体实施方式

冗余多线程(rmt)可用于通过在不同处理元件上执行两个或更多个冗余线程,然后比较冗余线程的结果来检测错误,从而提高处理单元的可靠性。通过检测由对相同数据执行相同指令的两个冗余线程产生的结果之间的差异,可指出至少一个冗余线程中的错误。由对相同数据执行相同指令的三个或更多个冗余线程产生的结果之间的相似性和差异可以用于检测错误并且可能纠正错误,例如,使用应用于三个或更多个结果的投票方案。在冗余线程之间传递数据以支持rmt错误检测或纠正的机制会产生显著的开销。例如,自旋锁机制可用于同步冗余线程之间的数据和消息传递。rmt系统的性能可能会因开销而显著降低,至少部分是因为典型的rmt系统会在每个存储指令(或其他事件触发器)之前比较冗余线程产生的结果,以避免存储可能包含错误的数据。

通过根据自从对结果的先前比较以来,用于比较的事件触发器(例如冗余线程执行存储指令)是否已经发生了可配置的次数(例如,不止一次),选择性地绕过对由冗余线程执行的运算结果的比较,可以减少软件实现的rmt错误检测或纠正机制的开销,而不会降低错误检测精度。通过将线程所产生的结果与先前编码的值或与线程相关联的初始值一起散列,以便为每个冗余线程产生编码值,可以减少与存储先前运算的结果以用于后续比较相关联的开销,而不会显著降低检测到错误的概率。编码值形成代表与多个事件触发器相关联的多个结果的每个线程的指纹。在冗余线程遇到多个事件触发器之后,共享和比较冗余线程的指纹值。如果冗余线程的指纹值不同,则检测到错误,这会在某些变型中触发错误恢复过程。冗余线程可以包括两个以上的冗余线程,在这种情况下,投票方案用于通过选择指纹的最常见值作为正确值来执行纠错。指纹的一些实施方案通过将待存储的结果和存储值的地址与指纹的先前值进行散列来计算。

在某些变型中,编译器用于将冗余线程执行的程序代码转换为指纹识别方案。转换代码使冗余线程选择性地绕过共享和比较运算,并将绕过的共享和比较运算的编码值合并为单个编码指纹。例如,当共享和比较运算的事件触发器是存储指令时,编译器插入代码以生成代码的查找表,所述代码用于散列将由冗余线程存储的结果和指纹的相应先前值。编译器还为每个冗余线程初始化计数器。计数器响应于冗余线程执行事件触发器而递增,并用于确定已经绕过共享和比较运算的次数。编译器还插入转换代码以执行散列,以检查是绕过还是执行冗余线程的指纹变量的值的比较,以共享和比较冗余线程的指纹变量的值,以及以确定是否在退出程序代码之前执行未完成的共享和比较运算。

图1是根据一些实施方案的加速处理装置100的框图。加速处理装置(apd)100可用于实现不同类型的处理单元,例如中央处理单元(cpu)、图形处理单元(gpu)、通用gpu(gpgpu)、专用集成电路(asic)、现场可编程门阵列(fpga)、数字信号处理器(dsp)等。apd100可以被配置为实现一个或多个虚拟机,诸如模拟计算机系统的运算并提供用于执行应用程序的平台的低级虚拟机(llvm)。apd100还被配置为实现操作系统,并且在一些实施方案中,每个虚拟机都执行操作系统的单独实例。apd100还被配置为执行内核,例如,以执行诸如图形管道运算之类的运算,包括像素运算、几何计算、图像渲染等。apd100还可以执行非图形处理运算,诸如视频运算、物理模拟、计算流体动力学等。

apd100包括多个计算单元101、102、103,本文统称为“计算单元101-103”。计算单元101-103可以被配置为作为同时执行相同内核的不同实例化的管道而运算。例如,计算单元101-103的一些变型是单指令多数据(simd)处理器核,其使用不同的数据并行地执行相同的指令。apd100的一些实施方案实现更多或更少的计算单元101-103。

计算单元101包括处理元件105、106、107(本文统称为“处理元件105-107”)。处理元件105-107的一些实施方案被配置为执行算术和逻辑运算,所述算术和逻辑运算由被调度以由计算单元101中的处理元件105-107执行的指令指出。计算单元101还包括诸如本地数据存储(lds)110之类的存储器。存储在lds110中的指令或数据对处理元件105-107可见,但对计算单元102、103上的实体不可见。因此,lds110使得能够实现计算单元101上的处理元件105-107之间的共享。可以使用动态随机存取存储器(dram)、嵌入式dram(edram)、相变存储器(pcm)等来实现lds110。为了清楚起见,在图1中仅示出了在计算单元101上实现的处理元件105-107和lds110。然而,计算单元102和103还包括相应的处理元件和相应的lds。

每个处理元件105-107都执行内核的单独实例化。由处理元件105-107执行的内核的实例化可以称为工作项、任务或线程。在一些变型中,从lds110访问由线程执行的指令和由指令运算的数据。然后,由线程执行的运算的结果存储在lds110中。处理元件105-107还包括专用存储器115、116、117,本文统称为“存储器115-117”。每个处理元件105-107上的存储器115-117仅对对应的处理元件105-107可见。例如,存储器115仅对处理元件105可见,而对处理元件106、107不可见。可以使用动态随机存取存储器(dram)、嵌入式dram(edram)、相变存储器(pcm)等来实现存储器115-117。

apd100还包括全局数据存储(gds)120,其是对由apd100实现的所有计算单元101-103都可见的存储器。如本文所用,术语“可见”表示计算单元101-103能够访问gds120中的信息,例如,通过执行存储以将信息写入存储器或执行加载以从存储器读取信息。因此,gds120可用于促进由计算单元101-103上的处理元件执行的线程之间的共享。gds120的一些实施方案对于可以互连到apd100的其他处理单元也是可见的。例如,gds120对于连接到apd100的cpu(图1中未示出)也是可见的。可以使用动态随机存取存储器(dram)、嵌入式dram(edram)、相变存储器(pcm)等来实现gds120。

冗余线程由apd100中的处理元件105-107执行。可以通过编码由线程执行的运算的结果来为每个冗余线程创建指纹。然后,可以比较由冗余线程执行的运算的结果或冗余线程的指纹,以检测(或在某些情况下纠正)在冗余线程的执行期间发生的错误。通常响应于诸如存储指令之类的触发事件来执行结果或相关指纹的比较,以便在将结果提交到存储器之前检测或纠正任何错误。apd100的一些实施方案被配置为根据自从对结果的编码值的先前比较以来,用于比较的事件触发器是否已经发生了可配置的次数,来选择性地绕过冗余线程的指纹的比较。可配置的次数可以设置为大于或等于2的值。

图2是根据一些实施方案的线程分组的层次结构200的框图。层次结构200的一些变型表示由图1所示的apd100同时或并行执行的线程。层次结构200包括内核205,该内核表示可以由诸如图1所示的处理元件105-107之类的处理元件执行的程序代码。内核205的实例化被分组为工作组210、211、212,本文统称为“工作组210-212”。每个工作组210-212都具有定义工作组中的线程数量的本地大小,以及唯一标识每个工作组210-212的组标识符。在一些实施方案中,工作组210-212是同时或并行执行的相关线程的集合。例如,工作组210包括线程215、216、217,本文统称为“线程215-217”。线程215-217被分配了不同的本地标识符,这些本地标识符标识工作组210内的线程215-217。线程215-217还被分配了全局标识符,该全局标识符在分配给所有工作组210-212的线程之间全局地标识线程215-217。每个工作组210-212中的线程都可以与相应工作组210-212中的其他线程同步。

工作组210-212被分配以供在相应的计算单元上执行。例如,工作组210可以在图1所示的计算单元101上执行,工作组211可以在图1所示的计算单元102上执行,而工作组212可以在图1所示的计算单元103上执行。然后,调度工作组210-212内的线程以在所分配的计算单元内的相应处理元件上执行。例如,可以调度线程215以在图1所示的处理元件105上执行,可以调度线程216以在图1所示的处理元件106上执行,可以调度线程217以在图1所示的处理元件107上执行。

apd100实现冗余多线程(rmt)以检测并且在一些情况下纠正在对线程(例如线程215-217)进行处理期间发生的错误。通过实例化多于一个线程来创建冗余线程以使用相同的数据执行相同的指令。冗余线程在不同的处理器元件上执行。全局标识符、或组标识符和本地标识符的组合指出将由对应线程处理的数据。例如,线程的全局标识符可用于计算存储器地址并为线程做出控制决策。因此,可以通过将多于一个线程的全局标识符(或组标识符和本地标识符的组合)映射到单个全局标识符来创建冗余线程,以便两个线程对相同数据执行相同的内核代码。在美国专利no.9,274,904中公开了软件实现的rmt技术,该专利的全部内容通过引用并入本文。软件实现的rmt技术引起的开销可以通过根据自从对结果的编码值的先前比较以来,用于比较的事件触发器是否已经发生了可配置的次数,选择性地绕过冗余线程执行的运算结果的编码值(也可以称为指纹)的比较而减少。

图3是根据一些实施方案的apd300的框图,该apd基于自从对指纹的先前比较以来发生的事件触发器的数量来选择性地绕过指纹的比较。apd300用于实现图1所示的apd100的一些实施方案。apd300被配置为执行内核305。线程310、315表示内核305的对相同数据执行相同指令的冗余实例化。在一些实施方案中,线程310、315由相同的标识符,例如相同的全局标识符、组标识符或本地标识符来标识。尽管图3中示出了两个线程310、315,但是,其他实施方案可以包括更多的冗余线程。

apd300包括用于执行冗余线程的处理元件320、325。每个处理元件320、325都包括对应的专用存储器330、335。尽管图3中示出了两个处理元件320、325,但是,apd300的一些实施方案也可以包括更多的处理元件。apd300还包括对处理元件320、325两者都可见的存储器340。例如,如果处理元件320、325是由相同的计算单元实现的,则存储器340可以是本地数据存储,例如图1所示的lds110。又如,如果处理元件320、325是在不同的计算单元上实现的,则存储器340可以是全局数据存储,例如图1所示的gds120。

由apd300实现的编译器在编译期间将转换代码插入到由内核305定义的程序代码中。当由线程310、315执行时,转换代码使线程310、315基于执行程序代码的某些部分或某些块的结果,选择性地绕过对由线程310、315生成的指纹的比较。线程310、315根据自从对指纹的先前比较以来用于比较的事件触发器是否已经发生了可配置的次数,选择性地绕过指纹比较。在一些实施方案中,编译器插入转换代码,该转换代码使得线程310、315中的一个或多个分配查找表345,该查找表包括用于对结果进行散列以生成指纹的代码值。例如,可以将256元素8位阵列分配给线程组本地共享存储器空间以形成查找表345。转换代码还可以使线程310、315中的一个或多个初始化查找表345中的代码值。例如,线程310、315中的一个或多个可以将256个8位唯一性高速缓存元素插入到形成查找表345的阵列中。一些实施方案使用不需要使用查找表345的其他算法(诸如基于异或运算的散列算法等)来替代性地执行散列。

插入到程序代码中的转换代码包括寄存器初始化代码,该寄存器初始化代码使线程310、315初始化相应的寄存器350、355以存储指纹的值。例如,线程310、315可以分配相应专用存储器330、335中的寄存器350、355。线程310、315还可以使用存储在查找表345中的代码值来初始化存储在寄存器350、355中的指纹的值。转换代码还包括计数器初始化代码,该计数器初始化代码使线程310、315初始化相应的计数器360、365,这些计数器用于计算线程310、315响应于诸如存储指令之类的事件触发器而绕过比较指纹值的次数。线程310、315可以将计数器360、365初始化为诸如零之类的默认值。

转换代码包括散列码,该散列码使线程310、315将结果的当前值(以及在某些情况下,存储该结果的位置的地址)散列成存储在相应寄存器350、355中的指纹的当前值。例如,如果线程310、315没有绕过对指纹值的任何先前比较,则结果的当前值(诸如要存储在存储器中的值)和存储位置的地址被散列成存储在相应寄存器350、355中的指纹的初始值。又如,如果线程310、315已经绕过对指纹值的一个或多个先前比较,则结果的当前值和地址被散列成指纹的当前值,该指纹的当前值是先前基于响应于绕过先前比较而散列成指纹的结果的先前值和地址而生成的。跳转检查包括在转换代码中,并用于将计数器360、365的值与可配置值进行比较,该可配置值指出是绕过比较还是执行比较。该可配置值设置为大于1的值。可配置值越大,就越多地减少由apd300执行错误检测所用的共享和比较算法所引起的开销。

转换代码还包括共享和比较代码,该共享和比较代码使线程310、315共享相应寄存器350、355中的值,以便可以比较这些值以进行错误检测或纠正。例如,如果由线程310执行的跳转检查指出计数器360的值等于或大于可配置值,则线程310可以通过将指纹值从寄存器350复制到在存储器340中实现的共享缓冲器370来共享存储在寄存器350中的指纹。可以使用同步、自旋锁或其他技术来协调共享缓冲器370的使用。由线程315执行的跳转检查还指出计数器365的值等于或大于可配置值。然后,线程315可以访问与线程310相关联的指纹的共享值,并将共享指纹与存储在寄存器355中的指纹的值进行比较。如果两个值相等,则apd300确定没有发生错误。如果两个值不同,则apd300确定发生了错误,并且apd300可以启动包括纠错的错误过程。

图4是示出根据一些实施方案的在程序代码400编译期间由编译器插入的转换代码对程序代码400的修改的图。程序代码400可以是包括在诸如图2所示的内核205或图3所示的内核305之类的内核中的代码的一部分。程序代码400包括代码块401、事件触发器402、代码块403、事件触发器404、代码块405和退出代码406。事件触发器402、404是触发共享和比较运算的指令,共享和比较运算用于比较冗余线程的指纹以检测或纠正错误。例如,事件触发器402、404可以是用于在某一位置和存储器处存储值的存储指令。因此,存储的值是事件触发器的结果,并且用于确定相应线程的指纹,例如,通过将存储值和存储位置的地址与指纹的先前值或指纹的初始值进行散列。执行程序代码400的线程遇到的事件触发器402、404的数量可以是确定性的或非确定性的。例如,代码块401、403、405可以包括循环、条件指令、分支指令等,它们可能会导致内核的不同实例化在程序代码400的执行期间遇到不同数量的事件触发器402、404。

在编译期间,编译器转换程序代码400。例如,编译器的一些变型在程序代码400中的第一代码块401之前插入表生成代码410,使得执行修改的程序代码415的线程分配和初始化表,例如图3所示的查找表345。表生成代码410的一些实施方案实现32位循环冗余校验(crc)散列例程,并分配256元素8位阵列以存储用于crc散列例程的编码值。例如,用于分配和填充表的表生成代码410可以以伪代码如下编写:

编译器通过插入用于初始化计数器(例如图3所示的计数器360、365)的计数器初始化代码425,而进一步将程序代码400转换为修改的程序代码420。修改的程序代码420还包括在每个事件触发器402、404之后插入的散列码430、431。散列码430、431用于散列与事件触发器402、404相关联的结果,以形成表示事件触发器402、404之后的对应线程的指纹的编码值。散列码430、431的示例以伪代码如下编写:

插入跳转检查代码435、436以确定自从上一次与一个或多个相应的冗余线程共享和比较以来执行程序代码400的线程是否遇到了可配置数量的事件触发器402、404。插入共享和比较代码440、441以使执行程序代码400的线程执行其指纹值与由一个或多个冗余线程计算出的指纹值的共享和比较。仅当相应的跳转检查代码435、436指出线程自从线程的上一次共享和比较以来遇到可配置数量的事件触发器402、404时,才执行共享和比较代码440、441。

通过插入退出检查450来生成最终转换代码445,该退出检查用于确定在线程在退出块406退出程序代码400之前是否存在需要执行的任何未完成的共享和比较运算。

图5是根据一些实施方案的用于选择性地绕过或执行在冗余线程之间的共享和比较运算以检测错误的方法500的流程图。方法500在图1所示的apd100或图3所示的apd300的一些实施方案中实现。apd被配置为使用分配给在apd中实现的对应处理元件的多个线程来执行内核的多个实例化。apd中的编译器转换内核中的程序代码以生成转换代码,该转换代码使得执行内核的实例化的线程选择性地绕过或执行共享和比较运算。例如,编译器可以以图4所示的方式来转换程序代码。

在框505处,apd识别用于执行的线程并生成对所识别的线程来说是冗余的一个或多个线程。如本文所讨论的,可以使用相同的标识符(例如全局标识符、组标识符或本地标识符)来标识冗余线程。apd将冗余线程分配给不同的处理元件。在框510处,在不同的处理元件上执行冗余线程。冗余线程可以同时或并行地执行,并且冗余线程的一些实施方案是同步的。

在框515处,线程检测可能触发共享和比较运算以检测或纠正错误的事件触发器(诸如存储指令)。在框520处,线程响应于检测到事件触发器而递增对应的计数器。在框525处,线程将与事件触发器相关联的结果的散列值(诸如响应于存储指令而存储的数据)合并为对应的指纹。例如,在一些变型中,线程将结果的值散列成基于事件触发器的先前结果而生成的先前指纹。线程还可以将其他信息(例如存储由存储指令指出的数据的位置的地址)散列成指纹。

在判定框530处,线程将计数器中的值与阈值进行比较,该阈值指出在冗余线程之间执行共享和比较运算之前要绕过共享和比较运算的可配置次数。如果计数器小于或等于阈值,则方法500前进到框510并继续执行线程。如果计数器大于阈值,则线程在框535处执行共享和比较运算以确定冗余线程的指纹是否匹配。如果指纹不匹配,则apd可以确定发生了错误。如果在框535处执行的共享和比较运算期间检测到错误,则apd可以执行错误报告或恢复。在框540处,线程重置其对应计数器的值。然后,方法500前进到框510并继续执行线程。

图6是根据一些实施方案的用于执行退出检查以确定在退出程序代码之前是否在冗余线程之间执行共享和比较运算的方法600的流程图。方法600在图1所示的apd100或图3所示的apd300的一些实施方案中实现。apd被配置为使用分配给在apd中实现的对应处理元件的多个线程来执行内核的多个实例化。apd中的编译器转换内核中的程序代码以插入退出检查。例如,编译器可以以图4所示的方式转换程序代码400,以插入退出检查450。

在框605处,在不同的处理元件上执行冗余线程。冗余线程可以同时或并行地执行,并且冗余线程的一些实施方案是同步的。在框610处,线程检测退出条件。在判定框615,线程响应于检测到退出条件而检查其对应计数器的值。如果计数器的值大于零(或某个其他默认值),表示自从在冗余线程之间执行上一次共享和比较运算后至少绕过了一次共享和比较运算,则该方法前进到框620。在框620处,线程基于其指纹的当前值执行共享和比较。然后,方法600前进到框625,并且线程执行退出代码。如果计数器的值等于零(或某个其他默认值),表示不存在未完成的共享和比较运算,则方法600直接前进到块625,并且线程执行退出代码。

在一些实施方案中,上述技术的某些方面可以由执行软件的处理系统的一个或多个处理器实现。软件包括存储或以其他方式有形地体现在非暂时性计算机可读存储介质上的一组或多组可执行指令。软件可以包括指令和某些数据,当由一个或多个处理器执行时,这些指令和数据操纵一个或多个处理器以执行上述技术的一个或多个方面。非暂时性计算机可读存储介质可包括例如磁盘或光盘存储装置、诸如闪存之类的固态存储装置、高速缓存、随机存取存储器(ram)或者一个或多个其他非易失性存储装置等等。存储在非暂时性计算机可读存储介质上的可执行指令可以是源代码、汇编语言代码、目标代码或由一个或多个处理器解释或以其他方式可执行的其他指令格式。

注意,并非需要在上文一般描述中描述的所有活动或元素,可能不需要特定活动或装置的一部分,并且可以执行一个或多个另外的活动,或者除了所描述的那些元素之外还包括其他元素。此外,活动的列出顺序不一定是它们的执行顺序。另外,已参考具体实施方案描述了某些概念。然而,本领域普通技术人员认识到,在不脱离如下面的权利要求所阐述的本公开的范围的情况下,可以进行各种修改和改变。因此,说明书和附图应被视为说明性而非限制性的含义,并且所有这些修改旨在包括在本公开的范围内。

上面已经针对具体实施方案描述了益处、其他优点和问题的解决方案。然而,这些益处、优点、问题的解决方案以及可能会导致任何益处、优点或解决方案发生或变得更加明显的任何特征不应被解释为任何或所有权利要求的关键、必需或必要特征。此外,上文公开的特定实施方案仅是说明性的,因为所公开的主题可以以对受益于本文教导的本领域技术人员而言显而易见的不同但等效的方式进行修改和实践。除了在下面的权利要求中描述的之外,对于本文所示的构造或设计的细节没有限制。因此显然的是,可以改变或修改上文公开的特定实施方案,并且所有这些变化都被认为在所公开的主题的范围内。因此,本文寻求的保护如下面的权利要求中所述。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1