掌桥专利:专业的专利平台
掌桥专利
首页

生成维持线程执行顺序的同步数字电路的语言和编译器

文献发布时间:2023-06-19 12:21:13


生成维持线程执行顺序的同步数字电路的语言和编译器

背景技术

硬件描述语言(“HDL”)是由硬件工程师使用来描述电子电路的结构和行为的建模语言,该电子电路的大部分通常是数字逻辑电路。HDL的示例包括超高速集成电路(“VHSIC”)HDL和VERILOG。

HDL通常需要许多代码行以模拟数字逻辑电路。即使对于非常熟悉HDL的硬件工程师,创造这种代码也是非常耗时间的。此外设计中存在越多的代码行,设计越可能包括错误或执行得较差。

因为HDL通常利用与命令式编程语言不同的编程范式,不非常熟悉HDL的软件工程师通常很难利用这些语言。作为结果,由软件工程师创建的、从HDL生成的电子电路也可能包括错误或执行得较差。

本文呈现的是本公开所做出的关于这些和其他技术挑战。

发明内容

针对生成维持线程执行顺序的同步数字电路的语言和编译器的技术被公开。通过所公开的技术的实现,硬件工程师可以通过减少实现一些类型的电路设计所需的代码行的数目、并且通过消除整类常见的设计错误来实现显著的生产力增益,同时没有牺牲性能。针对具有一些或者没有利用HDL来设计电路经验的软件工程师,所公开的技术提供了熟悉的编程语义,该编程语义可以被用以生成高性能的电路设计。

所公开的技术的实现还可以生成可以维持线程执行顺序的硬件电路。维持线程执行顺序允许诸如低开销线程同步的优化。维持线程执行顺序还允许程序员执行顺序特定的操作。例如,在整个程序中,偶数执行顺序的线程(例如线程“2”、“4”、“6”……)可能与奇数执行顺序的线程的处理不同。此外,当线程是将要被执行的第一个线程或最后一个线程时,特殊操作可以被执行。还可以通过所公开的主题的实现来实现本文中未具体提及的其他技术优势。

为了实现上面简要提到的技术优势,所公开的语言和编译器生成具有相同数目的阶段的代码路径的流水线。例如,第一流水线的所有代码路径可能有6个阶段,而第二个流水线的所有代码路径可能有15个阶段。为了保持该属性,编译器平衡了流水线内的相关代码路径。例如,针对给定的‘if’语句,‘then’块或‘else’块可以被填充,以便具有与另一个块相同数目的阶段。可以通过添加不执行有用工作的虚设阶段来添加阶段,或者可以通过增加流水线深度来添加阶段——即增加用于实现块的阶段数目。通过平衡‘then’和‘else’块中的阶段数目,所有线程在相同数目的时钟周期内执行‘if’语句,因此线程按照它们进入的顺序离开‘if’语句。

一些编程构造允许通过设计重新排序线程执行。例如,针对循环,不能保证线程执行顺序,因为不同的线程可能会执行不同的循环次数。如此,一个线程可以在10次迭代中完成循环,而另一个线程可以在500次迭代中完成相同的循环。然而,所公开的语言包括重新排序块,该重新排序块确保线程按照它们进入重新排序块的顺序离开重新排序块。程序员可以利用重新排序块包裹循环和其他非保序构造,以维护线程执行顺序。备选地或附加地,所公开的语言可以包括“内置”重新排序块功能的循环构造。例如,“reorder_for”循环作为保留线程执行顺序的“for”循环运行。在一些配置中,重新排序块是通过SDC上的重新排序缓冲区来实现的。

在一些配置中,执行的流水线通过先进先出队列(称为‘队列’或‘FIFO’)连接,这些队列存储用于由另一流水线使用的局部变量。FIFO可以被用以实现所公开语言的函数调用、控制流、和其他方面。通过按入队顺序从FIFO中取回局部变量,跨流水线维护线程顺序。

如上所简要讨论的,本文所公开的技术的实现提供了低开销线程同步。进一步地,能够使程序员执行顺序特定操作,诸如区别地处理奇数和偶数线程,或者针对第一或最后的线程执行特殊操作。本文未明确标识的其他技术益处也可以通过实施所公开的技术实现。

应当理解,上述主题可以被实施为计算机控制的装置、计算机实施的方法、计算设备、或者诸如计算机可读介质的产品的制品。通过阅读以下具体实现并且查看相关联的附图,这些和各种其它特征将是明显的。

提供本发明内容以便以简化的形式引入将在以下具体实现中进一步描述的所公开的技术的一些方面的简要描述。本发明内容不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在将本发明内容用于限制所要求保护的主题的范围。此外,所要求保护的主题不限于解决在本公开的任何部分中提到的任何或所有缺点的实施。

附图说明

图1是示出了本文所公开的用于基于程序源代码生成同步数字电路的系统的各方面的计算架构图,该程序源代码包括映射到同步数字电路的编程构造;

图2是示出了说明性的示例同步数字电路的方面的硬件架构图,该同步数字电路包括多个硬件流水线,每个具有多个流水线阶段的硬件流水线,以及可以使用所公开的技术来限定和实施的计算单元;

图3是示出了将以所公开的语言编写的函数映射到硬件电路的硬件架构图;

图4是示出了具有虚设阶段的流水线的填充代码路径的硬件架构图;

图5示出了应用于for循环的重新排序块构造的硬件架构图;

图6是示出了例程的流程图,该例程图示了维持参考图1-图5所描述的线程执行顺序的语言和编译器的操作的各方面;

图7是示出了针对可以实现本文所呈现的技术的方面的计算设备的说明性计算机硬件和软件架构的计算机架构图;以及

图8是图示了其中可以实施所公开的技术的方面的分布式计算环境的网络图。

具体实施方式

以下具体实施方式涉及维持线程执行顺序的语言和编译器。如上所简要讨论的,维持线程执行顺序允许诸如低开销线程同步的优化。维持线程执行顺序也允许程序员实现顺序特定的操作。例如,在整个程序中,在偶数执行顺序中的线程可能和在奇数执行顺序中的线程的处理不同。此外,当线程是将要执行的第一个线程或最后一个线程时,可以执行特殊操作。还可以通过所公开的主题的实现来实现本文中未具体提及的其他技术优势。

虽然本文所描述的主题呈现在维持线程执行顺序的语言和编译器的一般上下文中,本领域技术人员将理解到可以结合其他类型的计算系统和模块来执行其他实现。本领域的技术人员还将理解,本文所描述的主题可以利用其他计算机系统配置来实践,包括手持式设备、多处理器系统、基于微处理器或可编程的消费电子产品、嵌入在设备中的计算或处理系统(诸如可穿戴计算设备、汽车、家庭自动化等)、小型机、大型计算机等。

在下面的详细描述中,参考了构成本文的部分的附图,并且这些附图是通过说明特定配置或示例的方式示出的。现在参考附图,其中相同的数字在多个图中表示相同的元素,将描述维持线程执行顺序的语言和编译器的方面。

图1是示出了本文所公开的用于基于程序源代码102限定和生成同步数字电路(“SDC”)112的说明性系统100的方面的计算架构图,该程序源代码102包括映射到SDC 112的编程构造。SDC可以由门阵列、现场可编程门阵列(“FPGA”)、专用集成电路(“ASIC”)和其它类型的电路设备实现。尽管主要在FPGA中实现的SDC 112的上下文中描述了所公开的主题,但是应当理解,可以利用本文所公开的技术以限定使用其它类型的设备来实现的SDC112。

如图1所图示的,说明性系统100包括编译器104,编译器104编译程序源代码102以生成硬件描述语言(“HDL”)代码或者电路的低级表示(诸如,网络表)。如上述简要讨论的,HDL是由硬件工程师使用来描述电子电路的结构和行为的建模语言,该电子电路的大部分通常是数字逻辑电路。HDL的示例包括VHSIC HDL和VERILOG。

如将在以下详细描述的,程序源代码102是使用设计成以SDC 112为目标的多线程命令式编程语言来表达的。所公开的语言提供了诸如C和JAVA语言的许多特征,诸如函数调用、for-loop、算术运算符和条件语句。然而,所公开的语言包括直接映射到底层SDC 112硬件实现的构造。这使得硬件和软件工程师两者能够推理性能,并且在优化他们的设计方面是有效的。如上所述,这还可以使软件工程师熟悉该语言,并且使硬件工程师免于处理在HDL中编码时出现的各类错误。

所公开的多线程命令式编程语言是命令式的,因为程序语句依次执行,并且是多线程的,因为多个执行线程被可以被并行执行。如上所述,线程是局部变量的集合。在硬件电路处理局部变量时线程被执行。

本文所描述的线程类似于软件线程,但与它不同。虽然软件线程维持包含局部变量的调用栈并且执行存储器中的代码,本文描述的线程是通过硬件电路移动的局部变量的集合。虽然软件线程在可执行代码中具有由指令指针确定的位置,但是所公开的线程在给定时间点在SDC上具有物理位置。SDC可以执行数百、数千、甚至数百万个线程,并且SDC执行可以被流水线化的,即不同线程可以在电路的不同阶段内同时执行。

如下将更详细描述的,语言构造可以被限定在映射到电路实现的程序源代码102中。语言构造是程序的句法上允许的部分,它可以由来自一个或多个词法标记形成。本文所描述的语言构造映射到保证线程排序的电路实现中(即,线程将以与它们进入的相同顺序退出电路实现)。

如下还将更详细描述的,由本文公开的构造生成的电路实现可以被实现为FPGA、门阵列、ASIC或另一类型的合适设备中的SDC。诸如NIC的另一硬件组件可以配置具有FPGA、门阵列或ASIC,以便实现所期望的功能。

如图1所示,编译器104可以将包括本文所公开的语言构造中的一个或多个语言构造的程序源代码102编译为电路说明、该示例中是HDL代码106。该HDL代码106可以被提供给HDL合成工具108,该HDL合成工具108转而可以生成位元流110,该位元流110可以被利用以对SDC 112编程,诸如例如在FPGA上。当以ASIC为目标时,HDL代码106可以被给ASIC制造方提供用于工厂中生产。

图2是示出了说明性的示例SDC 112的方面的硬件架构图,该说明性的示例SDC112包括多个硬件流水线200A-200C(或者“流水线”),可以使用所公开的技术来限定和实现硬件流水线200A-200C。每个硬件流水线具有多个流水线阶段206,每个流水线阶段206具有计算单元208。如图2所示,程序源代码102可以被编译到硬件计算单元208的流水线200A-200C中。

流水线200A-200C可以通过先进先出(“FIFO”)队列连接(本文也可以称为“多个FIFO”或“队列”)。流水线200A-200C实现由程序源代码102限定的功能。FIFO 202存储数据值、将输入提供到流水线200以及存储由流水线200生成的输出。例如,SDC 112包括将它的输出馈送到FIFO 202A的流水线200A。流水线200B转而从FIFO 202A获取它的输入,并且将它的输出提供给FIFO 202B。流水线200C从FIFO 202B获取它的输入。

在一些配置中,流水线200实现策略电路210,该策略电路210确定何时从FIFO 202中取回下一(多个)值。例如,策略电路210可以要求在从输入FIFO(例如,FIFO 202A)中取回值用于处理之前,输入FIFO(例如,在流水线200B情况下为FIFO 202A)不为空并且输出FIFO(例如,FIFO 202B)未满。

如图2所示,流水线200可以由一个或多个流水线阶段206A-206B组成。通过同时执行流水线200的不同阶段206中的不同线程来使执行流水线化。阶段的结果可以存储在寄存器204中,并且提供到针对下一时钟周期的持续时间的下一阶段206。

每个流水线阶段206可以包括诸如加法器208A和查找表(“LUT”)208B的一个或多个计算单元208B。在图示的示例中,加法器208A可以执行基本运算,例如加法、减法、乘法。计算单元也可以实现布尔运算符(例如,“OR”、“NOR”、“XOR”等)或者由SDC制造方提供的其他定制逻辑。

计算单元也可以由用户可编程的查找表208B实现。图示的LUT 208B描绘了将两个输入位映射到单个输出位的两输入真值表。LUT 208B可以被配置为支持不同数目的输入位。为了生成更复杂的输出值,例如字符或8位整数,可以使用多个LUT 208B,每个LUT连接到输入变量的不同位。

计算单元可以暂时将结果存储在寄存器204中(或者“触发器”)。这种寄存器的内容可以被提供给相同或不同流水线200中的其它计算单元。寄存器204可以在连接的数字时钟从0转变到1时捕获输入处的值,并且在输出处提供该值直到下一时钟周期结束(即,直到时钟再次从0转变到1)。寄存器还可以包括启动线。如果启动线被设置为假,则寄存器将不执行上述操作,在多个时钟周期上维持当前输出值。

应当理解,为了讨论的目的,图2中所示的流水线架构已经被简化。本文所描述的编程语言构造可以被利用以实现更复杂的SDC 112,该SDC 112具有包括比图2所示的更多组件。

图3是示出了根据一个实现例的、将以所公开的语言编写的函数映射到硬件电路的硬件架构图300。程序源代码302包括以所公开的语言编写的函数‘f()’304。所公开的语言是命令式的,因为程序语句被依次地执行,并且是多线程的,因为多个执行线程可以并行和/或并发地执行。函数‘f()’304采用两个参数:‘x’306和‘y’308并且返回整数。函数‘f()’具有两个表达式:表达式310执行加法并且将结果存储在局部变量‘z’中,同时表达式312返回乘法的结果。

函数‘f()’304被映射到硬件电路314,硬件电路314包括计算单元316和计算单元318、寄存器320和寄存器322。硬件电路314具有两个阶段——执行表达式310中所描述的加法的第一阶段324和执行表达式312中所描述的乘法的第二阶段326。每个阶段在单个时钟周期中执行,并且每个阶段的结果存储在一个或多个寄存器中。

继续该示例,阶段324在参数‘x’306上执行“+1”运算,将结果(‘z’)存储在寄存器322中。在阶段324期间,参数‘y’308被直接提供给寄存器320。在阶段326期间,计算单元318将‘y’和‘z’的值相乘。结果被存储在寄存器328中。

硬件电路314可以由线程330执行,其中仅描绘了线程330中的一些线程。SDC可以执行数百、数千或数百万个线程。线程指的是局部变量的集合。当局部变量由硬件电路处理时,线程被执行。例如,线程330A具有值332(x=1并且y=2),并且当由硬件电路314处理值332时线程330A执行函数‘f()’304。由函数返回的值可以被添加到局部变量集中,并且在任何时候如果知道特定变量将不再被硬件电路使用,可以从局部变量集中移除该变量。

所公开的线程类似于软件线程,但与它不同。虽然软件线程维持包含局部变量的调用栈并且执行存储器中的代码,所公开的线程是通过硬件电路移动的局部变量的集合。虽然软件线程在可执行代码中具有由指令指针确定的位置,但是所公开的线程在给定时间点在SDC上具有物理位置。

SDC执行可以是流水线化的——即不同线程可以在电路的不同阶段内同时执行。表334描绘了在硬件电路314的流水线化的执行发生时来自不同阶段的不同线程的变量。列336显示存储在(即,之前和之后)阶段之间的值:336A包含由线程330A、330B和330C提供的x和y的值,而列336B包含在已经执行阶段324之后的值,而列336C包含在已经执行阶段326之后的值。行338A-C显示在连续时钟周期之后存储的值。

例如,行338A指示线程330A将要进入具有值332A(x=1并且y=2)的硬件电路314。在行338A和338B之间,出现时钟周期,并且在阶段324中执行线程330A的结果在332B中被描绘(y=2,来自332A的保持,并且z=2,“+1”操作的结果)。同时,来自线程330B的值340A(x=3并且y=5)将要进入硬件电路314。在行338B和338C之间,出现另一时钟周期,并且线程330A执行阶段326的结果在332C(“4”)中被描绘。同时,线程330B执行阶段324的结果在340B中被描绘(y=5并且z=4),并且来自线程330C的值342将要进入硬件电路314(x=7并且y=1)。流水线化的执行流水线执行通过增加SDC利用率来实现更高的吞吐量——即,与一次只有一个线程可以执行硬件电路305相比,更多的SDC在给定的时间点执行有用的工作。

图4是硬件架构图400,其示出了具有虚设阶段的流水线的填充代码路径使得流水线的所有路径具有相同数目的阶段。具有相同数目的阶段确保了线程执行顺序是通过流水线维持的。在一些配置中,代码列表402包括接受两个参数int‘x’406和int‘y’408的函数‘f()’404。行410将‘1’添加到‘x’并且将值分配给‘z’。第410行将“1”添加到“x”并将值分配给‘z’,这在电路说明418中被描述为计算单元420将‘1’加到‘x’并且将结果存储在寄存器422中。

行411介绍了在“z>2”的条件下“if”语句。在某些配置中,像‘if’语句这样的分支语句是通过并行执行两个分支并基于条件选择要处理的结果来实现的。电路说明418中的对应的组件是多路复用器424,如果‘z’大于‘2’,则它使线程继续由处理代码路径427产生的值,否则使线程继续处理代码路径435(N)产生的值。

代码块412(‘then’块)包括两个语句。“y=y+3”与计算单元428对应,这将‘3’添加到‘y’408的值。结果被存储在寄存器430中,编译器理解该寄存器430包含‘y’的正确值,取代作为参数传入的值。下一个语句“y=y*2”由计算单元432实现,它将存储在寄存器430中的“y”值乘以“2”,并且将结果提供给多路复用器424。如果‘z’的值大于‘2’,则由计算单元432提供的值将被提供给寄存器434。

代码块414(‘else’块)包括单个语句“y=y–1”。该语句由计算单元436实现,计算单元436从‘y’408中减‘1’并且将结果存储在寄存器438中。然而,在下一时钟周期中,虚设计算单元440将存储在寄存器438中的值转发给多路复用器424,如果‘z’的值小于或等于‘2’,多路复用器424将存储在寄存器438中的值提供给寄存器434。该虚设计算单元400被添加以平衡代码路径427中的阶段数目。在一些配置中,寄存器438被添加以维持针对虚设计算单元440的‘y’的值。

在某些配置中,添加到给定代码路径的虚设计算单元的数目等于最长代码路径中的阶段数目减去给定代码路径中的阶段数目。在这种情况下,阶段的最大数目是两个——计算单元428和432,并且代码路径435具有一个阶段436。因此,只添加了一个计算单元435,使一个新的流水线阶段被创建。

在一些实现例中,与插入不执行有用工作(除了平衡分支之外)的计算单元相反,在每个时钟周期结束时,值被简单存储在寄存器中。在一些实现例中,与添加虚设阶段相反,编译器生成更深的流水线,即生成具有比正常创建的更多阶段的代码路径。这可能会减少阶段的平均执行时间,因为计算被分散到更多的阶段。

行416包括单个语句“return z*y”,该语句在返回前将‘y’的值乘以‘z’的值。这与计算单元444对应,它将存储在寄存器434中的‘y’的值与‘z’的值相乘。

图5是硬件架构图500,该图示出了围绕“do-while”循环的重新排序块构造。代码列表502包括采用参数‘x’506和‘y’508的函数‘f()’。行512将int‘z’初始化为‘x+1’,并且与执行流水线522的部分对应。具体地,执行流水线522包括“+1”计算单元534,该计算单元534将‘1’添加到‘x’506的值并且将它存储到寄存器535作为‘z’。行513初始化循环计数器变量‘i’为‘1’。流水线522通过将值‘i’、‘y’和‘z’推送到FIFO 524中而结束。

函数504的重新排序块包裹“do-while”循环518。图5使用“do-while”循环518作为一种语言构造的示例,该语言构造通过设计不保持线程执行顺序。然而,其他不保持线程执行顺序的语言构造被类似地预期。重新排序块516部分由流水线522和流水线526实现。流水线522包括开始重新排序块536,它按照线程进入的顺序注册线程。

在一些配置中,线程与索引或者线程ID相关联。进入开始重新排序块536的第一线程的索引/ID将被存储在重新排序块的第一位置,例如数组的‘0’元素。后续线程将会将他们的索引/ID存储在与它们进入的顺序对应的元素中。通过这种方式,线程执行顺序的记录被创建。重新排序块516的讨论在“do-while”循环518的讨论之后继续。

“do-while”循环518循环‘z’次,每次将‘2’添加到‘y’。“do-while”循环由流水线526实现,为了清晰起见省略了一些方面。“do-while”循环初始地接收由流水线522放置在FIFO 524中的‘z’的值。“do-while”循环518随后可以在块538中将‘i’的值和‘z’进行对比。如果‘i’小于或等于‘z’,循环继续,并且计算单元540将‘2’添加到‘y’。‘y’的更新值、‘z’的值和‘i’的当前值可以被随后存储在FIFO 528中。然而,如果‘i’大于‘z’,则循环结束,并且执行传递到重新排序块542,如下所述。

在初始执行后,“do-while”循环518继续迭代另一‘z–1’次。在每次迭代处,‘y’和‘i’的当前值连同‘z’的值一起从FIFO 528中重新取回。应当理解,在该点处‘x’不被维持因为它不在函数的剩余部分使用。执行对比538,并且如果‘i’仍然小于‘z’,执行继续至如上所述的计算单元540。然而,如果‘i’大于‘z’,“do-while”“do-while”循环518结束。

当线程退出“do-while”“do-while”循环518时,它穿过结束重新排序块542。虽然开始重新排序块536和结束重新排序块542被分开描述,但是它们可以由SDC上的单个函数单元实现。结束重新排序块542阻止线程,直到具有较低执行顺序的所有线程(即,在线程索引/ID的数组中的较低编号元素中注册的线程)已经被释放为止。当遇到具有最低执行顺序的线程时,立即释放它以继续执行。按照这种方式,线程被释放以按照它们进入重新排序块516的顺序开始其他计算。流水线526通过将‘z’和‘y’的值存储在FIFO 530中结束。

行520在“do-while”循环518之后执行并且重新排序块516已经完成,返回“z*y”的值。行520部分由流水线532实现,它从FIFIO 530中读取‘y’和‘z’的值,并且应用计算单元543以将‘y’和‘z’相乘。

图5描绘了如何通过执行“do-while”循环改变线程顺序,并且随后通过线程重新排序块被恢复到原始顺序中。线程546A-D按顺序548进入循环,诸如“do-whlie”“do-while”循环518。每个线程具有‘z’544的不同值,并且因此每个线程执行“do-while”循环518不同的迭代次数。具体地,第一个进入的线程546A将迭代六次,第二个进入的线程546B将迭代八次,第三个进入的线程546C将迭代两次,以及第四个进入的线程546D将迭代四次。线程546穿过开始重新排序块536,按照它们进入的顺序来注册它们的线程索引/ID。图表550指示以时钟周期为单位,每个线程执行多长时间。线程546按照不同的顺序退出“do-while”循环518——线程546A第三个退出,线程546B第四个退出,线程546B第一个退出,以及线程546A第二个退出。

虽然线程546C是第一个退出“do-while”循环518的,但是结束重新排序块542延迟进一步执行直到线程546A和546B已经完成“do-while”循环518并且重新开始执行为止。接下来,线程546D完成“do-while”循环518,并且也被阻止直到线程546A-C完成为止。接下来,线程546A完成“do-while”循环518,但是因为546A是向开始重新排序块536注册的第一个线程,所以它被允许重新开始。同时,结束重新排序块542检查由于线程546A已经重新开始,是否允许任何后续线程继续。在该情况下,不允许任何后续线程继续,因为线程546B还没有完成。然而,一旦线程546B完成“do-while”循环518,结束重新排序块542注意到具有较低初始执行顺序的所有线程(即,线程546A)已重新开始执行,因此线程546B被允许重新开始执行。接下来,在线程546B之后进入开始重新排序块536的线程被检查以确定它们是否被允许重新开始。在该示例中,线程546C和546D两者都被阻止,因此它们两者都被允许重新开始(按该顺序),因为在它们之前到达的所有线程已经被允许重新开始。按照这种方式,线程546按照顺序554退出结束重排序块542,即按照它们进入开始重排序块536的相同顺序。图4和图5和对应的讨论描绘了非限制性示例。其他类型的循环、流水线、表达式、分支和排序被类似地预期。

图6是根据本文所公开的一个实现例的例程600的流程图,例程600图示了在图1-图5中图示的和以上所描述的维持线程执行顺序的语言和编译器的各方面。应该理解的是,本文描述的关于图6和其他附图的逻辑运算可以被实现(1)作为在计算设备上运行的计算机实现的动作或程序模块的序列和/或(2)作为计算设备内的互连的机器逻辑电路或电路模块。

本文所公开的技术的特定实现是取决于计算设备的性能和其他要求的选择问题。因此,本文所描述的逻辑运算被不同地称为状态、操作、结构设备、动作或模块。这些状态、操作、结构设备、动作和模块可以用硬件、软件、固件、专用数字逻辑、及其任何组合来实现。应当理解,可以执行比图中所示的和本文所述的更多或更少的操作。这些操作也可以以与本文所述的那些不同的顺序来执行。

例程600在操作602处开始,其中由编译器104接收源代码102。源代码可以以多线程编程语言表达。在一些配置中,源代码102以命令式编程语言表达。源代码可以包括分支语句411,诸如‘if’、‘switch’、‘case’、或者‘while’语句,这些分支语句使线程在多个代码路径(也称为“源代码路径”,以区别来自电路中的所描述的代码路径)中的一个路径上执行。在一些配置中,源代码包括包裹不维持线程执行顺序的代码的重新排序块516,诸如“do-while”循环518。

从操作602,例程行进至操作604,其中编译器104将源代码102编译为电路说明106。在一些配置中,电路说明106包括与多个源代码路径相关联的多个代码路径427和435,并且编译器104将虚设流水线阶段400添加到多个代码路径中的一些或所有代码路径,使得多个代码路径中的一些或所有代码路径具有相同数目的流水线阶段324。

在一些配置中,电路说明包括第一执行流水线200A和第二执行流水线200B,并且第一执行流水线200A通过将局部变量集推送FIFO 202A来切换到对第二执行流水线200B的执行。第二执行流水线可以随后按照局部变量集被推送FIFO 202A的顺序从FIFO 202A中取回局部变量集,从而维持了线程执行顺序。

在一些配置中,电路说明521包括重新排序缓冲区536、542,重新排序缓冲区536、542包裹不维持线程执行顺序的构造518的电路说明。在这些配置中,重新排序缓冲区536、542在构造被执行之前注册线程顺序548,并且在离开构造时将线程返回到原始执行顺序548。在一些配置中,重新排序缓冲区536、542阻止线程执行,直到具有较低执行顺序(即,更接近将要执行的第一线程)的所有线程已经重新开始执行。

从操作604,例程行进至操作606,其中电路说明(例如,HDL代码)被用以生成SDL112,该SDL 112包括由电路说明106限定的电路实现。例程600随后从操作606行进至操作608,在此结束。

图7是示出了针对可以实现本文所呈现的技术的方面的计算设备的说明性计算机硬件和软件架构的计算机架构图。特别地,图9中所图示的架构可以用于实现服务器计算机、移动电话、电子阅读器、智能电话、台式计算机、AR/VR设备、平板计算机、膝上型计算机或另一类型的计算设备。

图7所示的计算机700包括中央处理单元702(“CPU”),系统存储器704,包括随机存取存储器706(“RAM”)和只读存储器708(“ROM”),以及将存储器704耦合到CPU 702的系统总线710。包含有助于在计算机900内的组件之间传送信息的基本例程(诸如在启动期间)的基本输入/输出系统(“BIOS”或“固件”)可以存储在ROM 708中。计算机700还包括用于存储操作系统722、应用程序和其它类型的程序的大容量存储设备712。大容量存储设备712还可以被配置为存储其他类型的程序和数据。

大容量存储设备712通过连接到总线710的大容量存储控制器(未示出)连接到CPU702。大容量存储设备712及其相关联的计算机可读介质针对计算机700提供非易失性存储器。尽管本文所包含的计算机可读介质的描述指大容量存储设备,诸如硬盘、CD-ROM驱动器、DVD-ROM驱动器、或USB存储键,但本领域的技术人员应当理解,计算机可读介质可以是可以由计算机700访问的任何可用计算机存储介质或通信介质。

通信介质包括计算机可读指令、数据结构、程序模块或调制数据信号中的其他数据,诸如载波或其它传输机制、并且包括任何递送介质。术语“调制数据信号”是指其特性中的一个或多个特性以某种方式改变或设置以便对信号中的信息进行编码的信号。作为示例而非限制,通信介质包括诸如有线网络或直接有线连接的有线介质,以及诸如声学、射频、红外线和其他无线介质之类的无线介质。上述任何一种的组合也应当包括在计算机可读介质的范围内。

作为示例而非限制,计算机存储介质可包括以用于存储诸如计算机可读指令、数据结构、程序模块或其它数据的信息的任何方法或技术实现的易失性和非易失性、可移动和不可移动介质。例如,计算机存储介质包括但不限于RAM、ROM、EPROM、EEPROM、闪存或其它固态存储器技术、CD-ROM、数字多功能盘(“DVD”)、HD-DVD、蓝光或其它光存储、磁带盒、磁带、磁盘存储或其它磁存储设备、或者可用于存储所需信息并且可由计算机700访问的任何其它介质。根据权利要求的目的,根据权利要求的术语,被称为“计算机存储介质”,以及其相应的变化,不包括波或信号本身或通信介质。

根据各种配置,计算机700可以在网络化的环境中操作使用通过诸如网络720的网络逻辑连接到远程计算机。计算机700可以通过连接到总线710的网络接口单元716连接到网络720。应当理解,网络接口单元716也可被利用以连接到其它类型的网络和远程计算机系统。计算机700还可以包括用于接收和处理来自多个其他设备的输入/输出控制器718,多个其他设备包括键盘、鼠标、触摸输入、电子指示笔(图7中未示出)或诸如摄像机之类的物理传感器。类似地,输入/输出控制器718可以向显示屏或其他类型的输出设备(也未在图7中示出)提供输出。

应当理解,本文所描述的软件组件在被加载到CPU 702中并且被执行时,可以将CPU 702和整个计算机700从通用计算设备变换为专用计算设备,该专用计算设备被定制以促进本文所呈现的功能。CPU 702可以由任意数目的晶体管或其他分立电路元件构成,其可以单独地或共同地采取任意数目的状态。更具体地说,响应于包含在本文所公开的软件模块内的可执行指令,CPU 702可以而作为有限状态机来操作。这些计算机可执行指令可以通过指定CPU 702如何在状态之间转换来变换CPU 702,从而变换构成CPU 702的晶体管或其他分立硬件元件。

对本文所呈现的软件模块进行编码还可以变换本文所呈现的计算机可读介质的物理结构。在本说明书的不同实现中,物理结构的具体变换取决于各种因素。这些因素的示例包括但不限于,用于实现计算机可读介质的技术、计算机可读介质被表征为主存储器还是辅存储器等。例如,如果计算机可读介质被实现为基于半导体的存储器,则可以通过变换半导体存储器的物理状态来将本文所公开的软件编码在计算机可读介质上。例如,软件可以变换构成半导体存储器的晶体管、电容器或其它分立电路元件的状态。软件还可以变换这些组件的物理状态以便在其上存储数据。

作为另一示例,本文所公开的计算机可读介质可以是使用磁或光技术来实现。在这种实现中,当软件被编码在磁或光介质中时,本文所呈现的软件可以变换磁或光介质的物理状态。这些变换可以包括改变给定磁介质内的特定位置的磁特性。这些变换还可以包括改变给定光学介质内的特定位置的物理特征或特性,以改变这些位置的光学特性。在不脱离本说明书的范围和精神的情况下,物理介质的其它变换是可能的,提供前述示例仅为了便于本讨论。

鉴于以上内容,应当理解,在计算机700中发生许多类型的物理变换以便存储和执行本文所呈现的软件组件。还应当理解,图7所示的计算机700的架构或类似架构,可以被利用以实现其它类型的计算设备,包括手持式计算机、视频游戏设备、嵌入式计算机系统、诸如智能电话、平板计算机和AR/VR设备的移动设备、以及本领域的技术人员已知的其它类型的计算设备。还考虑计算机700可能不包括图7所示的所有组件,可以包括图7中未明确示出的其它组件,或可以利用与图7所示的完全不同的架构。

图8是示出根据本文呈现的各个实现例的、其中可以实现所公开的技术的各方面的分布式网络计算环境800的网络图。如图8所示,一个或多个服务器计算机800A可以经由通信网络720(其可以是固定线路或无线LAN、WAN、内联网、外联网、对等网络、虚拟专用网络、因特网、蓝牙通信网络、专用低压通信网络或其他通信网络中的任一个或组合)与多个客户端计算设备互连,这些客户端计算设备,诸如但不限于,平板计算机800B、游戏控制器800C、智能手表800D、电话800E,诸如智能电话、个人计算机800F和AR/VR设备800G。

在通信网络720是互联网的网络环境中,例如,服务器计算机800A可以是专用服务器计算机,其可操作以经由多个已知协议中的任何一个协议处理和传送去往和来自客户端计算设备800B-800G的数据,多个已知协议诸如超文本传输协议(“HTTP”),文件传输协议(“FTP”)或简单对象访问协议(“SOAP”)。此外,网络化的计算环境1000可以利用各种数据安全协议,诸如,安全插口层(“SSL”)或优良保密协议(“PGP”)。客户端计算设备800B-800G中的每个客户端计算设备都可以配备有操作系统,该操作系统可操作以支持一个或多个计算应用或终端会话,诸如web浏览器(图8中未示出)、或其他图形用户界面(图8中未示出)、或移动桌面环境(图8中未示出),以获得对服务器计算机800A的访问。

服务器计算机800A可以通信地耦合到其它计算环境(图8中未示出)并且接收关于参与的用户交互/资源网络的数据。在说明性操作中,用户(图8中未示出)可以与在客户端计算设备800B-800G上运行的计算应用交互以获得所需数据和/或执行其它计算应用。

数据和/或计算应用可以被存储在一个或者多个服务器800A上,并且在示例通信网络720上通过客户端计算设备800B-800G传达给协作用户。参与用户(图8中未示出)可以请求访问整个或部分驻留在服务器计算机800A中的特定的数据和应用。这些数据可以在客户端计算设备800B-800G和服务器计算机800A之间传送用于处理和存储。

服务器800A可以托管用于数据和应用的生成、认证、加密、通信的计算应用、处理和小程序,并且可以与其他服务器计算环境(图8中未示出)、第三方服务供应方(图8中未示出)、网络附加存储(“NAS”)和存储区域网(“SAN”)合作以实现应用/数据处理。

应当理解,图7中所示的计算架构和图8所示的分布式网络计算环境已经被简化以便讨论。应当理解,计算架构和分布式网络计算环境可以包括和利用许多更多组件、设备、软件程序、网络设备、和本文中未具体描述的其他组件。

本文所呈现的公开内容还包括在以下条款中所阐述的主题:

条款1:一种计算机实现的方法,包括:接收以多线程编程语言表达的源代码,其中源代码包括将执行引导至多个源代码路径中的一个源代码路径的分支语句;将源代码编译为包括流水线的电路说明,其中流水线包括与多个源代码路径相关联的多个代码路径,并且其中一个或多个流水线阶段被添加到多个代码路径中的一个或多个代码路径,使得多个代码路径具有相同数目的流水线阶段;以及,基于电路说明生成同步数字电路,同步数字电路包括电路实现。

条款2:根据条款1的计算机实现的方法,其中多个线程按照第一顺序进入流水线,以及其中多个线程按照第一顺序离开流水线。

条款3:根据条款1至2中任一项的计算机实现的方法,其中将流水线阶段添加到多个代码路径中的一个或多个代码路径包括,确定最长代码路径中的流水线阶段数目,并且添加到每个代码路径的流水线阶段数目等于最长代码路径中的流水线阶段数目减去代码路径中的流水线阶段数目。

条款4:根据条款1至3中任一项的计算机实现的方法,其中流水线包括第一流水线,其中电路说明包括第二流水线,其中执行第一流水线的线程通过将局部变量推送至先进先出队列中来将执行传递至第二流水线,并且其中第二流水线通过按照局部变量被推送的顺序从先进先出队列中读取局部变量来维持跨流水线的线程执行顺序。

条款5:根据条款1至4中任一项的计算机实现的方法,其中源代码包括重新排序块构造,重新排序块包裹不维持线程执行顺序的编程构造,并且其中重新排序块构造映射到电路实现,电路实现:记录传入的线程执行顺序;允许线程执行不维持线程执行顺序的构造;以及,阻止线程重新开始直到所有较低排序的线程已经重新开始。

条款6:根据条款1至5中任一项的计算机实现的方法,其中线程包括,向用于执行的流水线提供局部变量集合。

条款7:根据条款1至6中任一项的计算机实现的方法,其中流水线包括按照序列执行的阶段,并且其中多个线程通过按照序列流动通过阶段来维持执行顺序。

条款8:一种计算设备:一个或多个处理器;以及,至少一种计算机存储介质,其上存储有计算机可执行指令,计算机可执行指令在由一个或多个处理器执行时,使计算设备:接收以多线程编程语言表达的源代码;将源代码编译为包括第一流水线、第二流水线、和先进先出(FIFO)队列的电路说明,FIFO队列存储从第一个流水线传递到第二个流水线的局部线程变量集,其中第一流水线按照线程执行顺序在FIFO队列中存储局部线程变量集,其中第二流水线通过按照线程执行顺序从FIFO队列中取回局部线程变量集来维持护线程执行顺序;以及,基于电路说明生成同步数字电路,同步数字电路包括电路实现。

条款9:根据条款8的计算设备,其中源代码包括,将执行引导至多个源代码路径中的一个源代码路径的分支语句;其中第一流水线包括与多个源代码路径相关联的多个代码路径,并且其中一个或多个流水线阶段被添加到多个代码路径中的一个或多个代码路径,使得多个代码路径具有相同数目的流水线阶段。

条款10:根据条款8至9中任一项的计算设备,其中将流水线阶段添加到多个代码路径中的一个或多个代码路径包括,确定最长代码路径中的流水线阶段数目,并且添加到每个代码路径的流水线阶段数目等于最长代码路径中的流水线阶段数目减去代码路径中的流水线阶段数目。

条款11:根据条款8至10中任一项的计算设备,其中源代码包括重新排序块构造,重新排序块包裹不维持线程执行顺序的编程构造,并且其中重新排序块构造映射到电路实现,电路实现:记录传入的线程执行顺序;允许线程执行不维持线程执行顺序的构造;以及,阻止线程重新开始直到所有较低排序的线程已经重新开始。

条款12:根据条款8至11中任一项的计算设备,其中线程按照线程进入重新排序块的顺序离开重新排序块

条款13:根据条款8至12中任一项的计算设备,其中线程包括,向用于执行的第一流水线提供的局部线程变量集合。

条款14:根据条款8至13中任一项的计算设备,其中第一流水线包括按照序列执行的阶段,并且其中多个线程通过按照序列流动通过阶段来维持执行顺序。

条款15:至少一种计算机存储介质,其上存储有计算机可执行指令,计算机可执行指令在由一个或多个处理器执行时,使计算设备:接收以多线程编程语言表达的源代码,源代码包括映射到电路实现的构造,构造包括重新排序块和不维持线程执行顺序的构造,其中电路实现包括:重新排序缓冲区,重新排序缓冲区按照多个线程被接收的顺序注册线程标识符;电路,电路执行针对多个线程的每个线程的未知数目的时钟周期;其中重新排序缓冲区阻止线程重新开始,直到具有较低执行顺序的所有线程都重新开始;将构造编译为电路说明;以及基于电路说明,生成同步数字电路,同步数字电路包括电路实现。

条款16:根据条款15的至少一种计算机存储介质,其中源代码包括分支语句,分支语句将执行引导至多个源代码路径中的一个源代码路径的分支语句;其中电路说明包括流水线,该流水线包括多个代码路径,并且一个或多个流水线阶段被添加到多个代码路径中的一个或多个代码路径,使得多个代码路径具有相同数目的流水线阶段。

条款17:根据条款15至16中任一项的至少一种计算机存储介质,其中将流水线阶段添加到多个代码路径中的一个或多个代码路径包括,确定最长代码路径中的流水线阶段数目,并且添加到每个代码路径的流水线阶段数目等于最长代码路径中的流水线阶段数目减去代码路径中的流水线阶段数目。

条款18:根据条款15至17中任一项的至少一种计算机存储介质,其中线程包括,向用于执行的第一流水线提供的局部线程变量集合。

条款19:根据条款15至17中任一项的至少一种计算机存储介质,其中第一流水线包括按照序列执行的阶段,并且其中多个线程通过按照序列流动通过阶段来维持执行顺序。

条款20:根据条款15至19中任一项的至少一种计算机存储介质,其中流水线包括第一流水线,其中电路说明包括第二流水线,其中执行第一流水线的线程通过将局部变量推送至先进先出队列中来将执行传递至第二流水线,并且其中第二流水线通过按照局部变量被推送的顺序从先进先出队列中读取局部变量来维持跨流水线的线程执行顺序。

基于前文,应当理解维持线程执行顺序的语言和编译器已经在本文中公开。虽然以计算机结构特征、方法和变换动作、特定计算机器和计算机可读介质的专用的语言描述了本文呈现的主题,但可以理解,所附权利要求书中阐述的主题不必限于本文描述的特定特征、动作或介质。相反,这些特定特征、动作和介质是作为实现所要求保护的主题的示例形式来公开的。

上述主题仅通过说明的方式提供,而不应被解释为限制性的。在没有遵循所说明和所描述的示例配置和应用、并且没有脱离在所附权利要求书中所陈述的本发明的范围的情况下,可以对本文所描述的发明主题做出各种修改和改变。

相关技术
  • 生成维持线程执行顺序的同步数字电路的语言和编译器
  • 编译器支持下的推测多线程内存数据同步执行方法及装置
技术分类

06120113265839