CN102089752B - 依赖性问题的有效率的并行计算 - Google Patents
依赖性问题的有效率的并行计算 Download PDFInfo
- Publication number
- CN102089752B CN102089752B CN200980126852.2A CN200980126852A CN102089752B CN 102089752 B CN102089752 B CN 102089752B CN 200980126852 A CN200980126852 A CN 200980126852A CN 102089752 B CN102089752 B CN 102089752B
- Authority
- CN
- China
- Prior art keywords
- sequence
- variable
- execution
- given
- execution sequence
- 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.)
- Expired - Fee Related
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/45—Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
- G06F8/456—Parallelism detection
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
- G06F8/4441—Reducing the execution time required by the program code
- G06F8/4442—Reducing the number of cache misses; Data prefetching
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/45—Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
- G06F8/451—Code distribution
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline, look ahead
Abstract
一种计算方法,包括:接受计算任务(68)的定义,该计算任务包括具有执行依赖性(80)的多个原子处理元(PE-76)。每个执行依赖性规定了在执行一个相应的第二PE之前要执行一个相应的第一PE。编译该计算任务以用于在多处理器设备(32)上并发地执行,所述多处理器设备包括多个处理器(44),所述多个处理器(44)通过在一个包括第二数量的执行序列(98)的调用数据结构(90)中不与所述执行依赖性冲突地布置所述PE而能够同时地执行第一数量的PE,所述第二数量大于1且不超过所述第一数量。调用所述多处理器设备以运行软件代码,所述软件代码响应于所述调用数据结构而并行地执行所述执行序列,以产生所述计算任务的结果。
Description
相关申请的交叉参引
本申请要求下列申请的权益:提交于2008年7月10日的美国临时专利申请61/079,461;提交于2008年8月7日的美国临时专利申请61/086,803;提交于2008年11月3日的美国临时专利申请61/110,676;提交于2009年6月10日的美国临时专利申请61/185,589;以及提交于2009年6月10日的美国临时专利申请61/185,609。上述文献的公开内容均通过参引方式纳入本文。
技术领域
本发明主要涉及并行计算,且具体涉及用于在并行处理器上执行依赖性问题的方法和系统。
背景技术
并行处理技术广泛地用于执行各种计算任务。在逻辑设计仿真领域,例如,Cadambi等人在2002年6月10日至14日路易斯安那州新奥尔良市举办的第三十九届IEEE ACM Design Automation Conference(DAC2002)的学报的570-575页发表的“A Fast,Inexpensive andScalable Hardware Acceleration Technique for FunctionalSimulation”中描述了一种基于超长指令字(VLIW)处理器的仿真加速器,该文献以参引方式纳入本文。使用超长指令字处理器的逻辑仿真的多个方面也在下列文献中进行了论述:美国专利7,444,276,以及美国专利申请公布2007/0219771,2007/0150702,2007/0129926,2007/0129924,2007/0074000,2007/0073999和2007/0073528,以上公开内容均以参引方式纳入本文。
发明内容
本发明的一个实施方案提供了一种计算方法,包括:
接受计算任务的定义,该计算任务包括具有执行依赖性的多个原子处理元(PE),每个执行依赖性规定了在执行一个相应的第二PE之前要执行一个相应的第一PE;
编译所述计算任务以用于在多处理器设备上并发地执行,所述多处理器设备包括多个处理器,所述多个处理器通过在一个包括第二数量的执行序列的调用数据结构中不与执行依赖性冲突地布置所述PE而能够同时地执行第一数量的PE,所述第二数量大于1且不超过所述第一数量;以及
调用所述多处理器设备以运行软件代码,所述软件代码响应于所述调用数据结构而并行地执行所述执行序列,以产生所述计算任务的结果。
在某些实施方案中,计算任务包括对一个设计进行验证的任务。或者,所述计算任务可包括信号处理任务、图像处理任务、包处理任务和/或纠错编码(ECC)任务。在所公开的一个实施方案中,多处理器设备包括图形处理单元(GPU)。在另一个实施方案中,多处理器设备包括数字信号处理器和/或多核中央处理单元(CPU)。
在一个实施方案中,编译所述计算任务包括将每个执行序列中的PE分组成PE组(PEG)。在另一个实施方案中,多处理器设备根据内建调度策略调度所述PE以用于由多个处理器执行,且其中调用所述多处理器设备包括使得所述多处理器设备并行地执行第二数量的执行序列,如同布置在调用数据结构中,而与所述内建调度策略无关。在另一个实施方案中,多处理器被分成组布置,每个组都被指派以执行提供给所述多处理器设备的一个或多个线程块,且其中调用所述多处理器设备包括提供每个执行序列作为待要被所述组中的一个组内的处理器执行的一个相应的线程块。在一个实施方案中,所述每个组中的所述处理器访问一个相应的共享存储器,且其中编译所述计算任务包括使得一个给定执行序列中的PE通过被指派以执行该给定执行序列的一组处理器的共享存储器来交换数据。
在另一个实施方案中,将PE布置在调用数据结构中包括:最小化最长执行序列的长度同时不超过所述第一数量且不与所述执行依赖性相冲突。在又一个实施方案中,一个给定执行依赖性规定了使驱PE将在受驱PE之前被执行,且其中将所述PE布置在所述调用数据结构中包括:在给定执行序列中将受驱PE放置在使驱PE之后。在另一个实施方案中,一个给定执行依赖性规定了使驱PE将在受驱PE之前执行,且其中将所述PE布置在所述调用数据结构中包括:在第一执行序列中放置使驱PE,在不同于所述第一执行序列的第二执行序列中放置受驱PE,并且向所述第二执行序列中插入一个同步元,所述同步元暂停所述第二执行序列的执行直到给定的所述使驱PE完全被执行为止。
在某些实施方案中,编译所述计算任务包括从所述计算任务提取多个非循环子图,并且编译所述多个非循环子图以产生相应的多个调用数据结构。在一个公开的实施方案中,将所述PE布置在所述调用数据结构中包括:定义一个顺序,按此顺序选择所述PE以放置在所述执行序列中,且按此顺序用所述PE填充所述执行序列。
在一个实施方案中,所述定义一个顺序包括,为每个PE:
确定通向所述PE的一个最长的执行依赖性链的第一长度;
确定始自所述给定PE的一个最长的执行依赖性链的第二长度;
基于所述第一长度和所述第二长度,确定一个分配区间——其包括沿着所述执行序列的PE的可能的位置;以及
以所述分配区间的相应的长度的升序来排列所述PE。
填充所述执行序列可包括,将每个PE放置在所述执行序列中之一的相应的分配区间之内。
在另一个实施方案中,所述定义一个顺序包括:
识别输出组,每个输出组包括两个或更多个PE——其驱动了相应的受驱PE;
识别输入组,每个输入组包括至少两个由一个相应的使驱PE所驱动的PE;
基于包含了每个PE的输出组和输入组的数量,为所述每个PE指派一个相应的组评分;并且
基于所述PE的组评分,定义所述顺序。
在又一个实施方案中,将所述PE布置在调用数据结构中包括,对于一个给定PE以及所述执行序列中的一组可能的位置,计算由将给定PE放置在可能的位置而导致的相应的分配成本;以及将给定PE放置在所述可能的位置中的具有最低分配成本的一个位置。
在一个实施方案中,计算所述分配成本包括,根据如下因素估计给定执行序列中的给定的可能的位置的分配成本:由将给定PE放置在给定的可能的位置而导致的所述调用数据结构的执行时间的增加;在给定执行序列中和给定PE共享一个公共使驱PE的PE的第一数量;在给定执行序列中和给定PE共享一个公共受驱PE的PE的第二数量;在给定执行序列中和给定PE共享一个公共执行依赖性的PE的第三数量;和/或距为给定PE计算的最佳位置的距离。在一个实施方案中,将所述PE布置在所述调用数据结构中包括,将所述PE以线程束布置在每个执行序列中,每个线程束包括给定类型的一个或多个PE。
在一些实施方案中,编译所述计算任务包括,对于给定执行序列,定义将变量从所述多处理器设备的设备存储器取到高速缓存的确定性高速缓存模式,并且在执行所述给定执行序列期间将所述变量中的至少一些从所述高速缓存丢弃,并且使得所述多处理器设备在执行所述给定执行序列时实现所述确定性高速缓存模式。在一个实施方案中,给定执行序列中的PE被分组成PE组(PEG),且其中定义所述高速缓存模式包括:
对于在给定PEG的执行期间存在于所述高速缓存中的每个变量,识别在所述给定执行序列中接下来将使用该变量的相应的下一个PEG;
一旦在执行所述给定PEG之后需要从所述高速缓存丢弃一个或多个变量时,选择该一个或多个变量中的一个变量,所选择的变量的相应的下一个PEG具有沿着所述给定执行序列的距所述给定PEG最大的距离;并且
在所述高速缓存模式中定义,在执行所述给定PEG之后丢弃所选择的变量。
在另一个实施方案中,定义所述高速缓存模式包括在单个取命令中合并对两个或更多个变量的取操作。在另一个实施方案中,合并所述取操作包括:为每个变量沿着所述给定执行序列定义一个取区间,所述取区间自当该变量变得有效之时开始,至当该变量首次被使用时结束;以及定义所述单个取命令以包括至少两个在相应的取区间有重叠的变量,并且将所述单个取命令放置为在所述重叠的期间发生。合并所述取操作可包括,通过识别在所述单个取命令的位置和所述给定变量首次被使用的时间之间具有最小距离的给定变量,来选择待要被合并到所述单个取命令中的给定变量。
在一个公开的实施方案中,定义所述高速缓存模式包括,在单个存储命令中合并对两个或更多个变量的存储操作。在一个实施方案中,所述给定执行序列的确定性高速缓存模式,以给定顺序从所述设备存储器取变量,且其中编译所述计算任务包括,根据所述给定顺序以连续的地址将所述变量预排列在所述设备存储器中。在一些实施方案中,编译所述计算任务包括,通过访问所述多处理器设备的设备存储器,使得所述第一执行序列提供一个或多个变量作为输入给第二执行序列。
在一些实施方案中,编译所述计算任务包括,产生多个调用数据结构,所述多个调用数据结构中的每个调用数据结构包括一个或多个执行序列,以及使得所述执行序列中的至少一些执行序列通过访问所述多处理器设备的设备存储器而在不同的调用数据结构之间交换变量。在一个实施方案中,在所述不同的调用数据结构之间交换的每个变量都由一个或多个源执行序列所产生,并被一个或多个目标序列所使用,且其中编译所述计算任务包括,根据所述源执行序列和所述目标执行序列将所述变量聚合成组,并且将每个组以连续的地址存储在所述设备存储器中。在所公开的一个实施方案中,使得所述执行序列交换所述变量包括,使得所述执行序列以读命令从所述设备存储器读所述变量,每个读命令从所述组之一读取预定大小的数据。在一个实施方案中,当两个或更多个组中的变量联合起来未超过所述预定大小时,所述方法包括定义一个从所述两个或更多个组读取所述变量的合并的读命令。
在一个实施方案中,当在一个给定调用数据结构中的多个执行序列的一个集合中使用一组变量时,所述方法包括仅仅使得所述多个执行序列中的一个部分子集从所述设备存储器读取所述一组变量,并且将该变量传递给该集合中的其他的执行序列。使得所述执行序列的部分子集传递所述变量可包括,识别该集合中不能从该调用数据结构的其他执行序列接收所述变量的至少一个执行序列,并且将所识别的序列添加到所述部分子集。使得所述执行序列的部分子集传递所述变量可包括,识别所述给定调用数据结构中的同步元——其将所述部分子集连接到所述集合中的其他执行序列,并且分配与所述同步元相关联的通信资源以便传递所述变量。
在一些实施方案中,编译所述计算任务并且调用所述多处理器设备包括,运行一个事件驱动仿真——其仿真了所述计算任务。在一个实施方案中,将所述PE布置在所述调用数据结构中包括,根据如下因素在所述执行序列中放置所述PE:始自所述PE的相应的最长的执行依赖性链的长度;执行序列的相应的占用程度;和/或由对所述PE的放置而引起的同步元。
根据本发明的一个实施方案,还提供了一种计算方法,包括:
接受计算任务的定义,该计算任务包括具有执行依赖性的多个原子处理元(PE),每个执行依赖性规定了在执行一个相应的第二PE之前要执行一个相应的第一PE;
编译该计算任务以用于在多处理器设备上并发地执行,所述多处理器设备包括并行运行的多个处理器,以及通过在一个包括多个执行序列的调用数据结构中不与所述执行依赖性冲突地布置所述PE来调度该PE,以用于由所述多个处理器根据微处理器设备的内建调度策略执行;以及
调用该多处理器设备以运行软件代码,所述软件代码响应于所述调用数据结构而并行地且无关于所述多处理器设备的调度策略地执行所述执行序列,以产生所述计算任务的结果。
根据本发明的一个实施方案,还提供了一种计算装置,包括:
一个接口,被连接以接受计算任务的定义,该计算任务包括具有执行依赖性的多个原子处理元(PE),每个执行依赖性规定了在执行一个相应的第二PE之前要执行一个相应的第一PE;以及
一个中央处理单元(CPU),所述中央处理单元被布置为:编译该计算任务以用于在多处理器设备上并发地执行,所述多处理器设备包括多个处理器,所述多个处理器通过在一个包括第二数量的执行序列的调用数据结构中不与所述执行依赖性冲突地布置所述PE而能够同时地执行第一数量的PE,所述第二数量大于1且不超过所述第一数量;以及调用该多处理器设备以运行软件代码,所述软件代码响应于所述调用数据结构而并行地执行所述执行序列,以产生所述计算任务的结果。
根据本发明的一个实施方案,还提供了一种计算装置,包括:
一个接口,被连接以接受计算任务的定义,该计算任务包括具有执行依赖性的多个原子处理元(PE),每个执行依赖性规定了在执行一个相应的第二PE之前要执行一个相应的第一PE;以及
一个中央处理单元(CPU),所述中央处理单元被布置为:编译该计算任务以用于在多处理器设备上并发地执行,所述多处理器设备包括并行运行的多个处理器,以及通过在一个包括多个执行序列的调用数据结构中不与所述执行依赖性冲突地布置所述PE来调度该PE,以用于由所述多个处理器根据微处理器设备的内建调度策略执行;以及调用该多处理器设备以运行软件代码,所述软件代码响应于所述调用数据结构而并行地且无关于所述多处理器设备的调度策略地执行所述执行序列,以产生所述计算任务的结果。
根据本发明的一个实施方案,还提供了一种计算装置,包括:
一个多处理器设备,包括能够同时执行第一数量的原子处理元(PE)的多个处理器;以及
一个中央处理单元(CPU),所述中央处理单元被布置为:接受计算任务的定义,该计算任务包括具有执行依赖性的多个原子处理元(PE),每个执行依赖性规定了在执行一个相应的第二PE之前要执行一个相应的第一PE;通过在包括第二数量的执行序列的调用数据结构中不与所述执行依赖性冲突地布置所述PE来编译该计算任务以用于在所述多处理器设备上并发地执行,所述第二数量大于1且不超过所述第一数量;以及调用该多处理器设备以运行软件代码,所述软件代码响应于所述调用数据结构而并行地执行所述执行序列,以产生所述计算任务的结果。
根据本发明的一个实施方案,还提供了一种计算装置,包括:
一个多处理器设备,包括并行运行的多个处理器,且根据所述微处理器设备的内建调度策略调度原子处理元(PE)以用于由所述多个处理器执行;以及
一个中央处理单元(CPU),所述中央处理单元被布置为:接受计算任务的定义,该计算任务包括具有执行依赖性的多个PE,每个执行依赖性规定了在执行一个相应的第二PE之前要执行一个相应的第一PE;通过在包括多个执行序列的调用数据结构中不与所述执行依赖性冲突地布置所述PE来编译该计算任务,以用于在所述多处理器设备上并发地执行;以及调用该多处理器设备以运行软件代码,所述软件代码响应于所述调用数据结构并行地且无关于所述多处理器设备的调度策略地执行所述执行序列,以产生所述计算任务的结果。
根据本发明的一个实施方案,还提供了一种计算机软件产品,所述产品包括计算机可读介质,在所述计算机可读介质中存储了程序指令,所述指令当被计算机读取时,使得所述计算机:接受计算任务的定义,该计算任务包括具有执行依赖性的多个原子处理元(PE),每个执行依赖性规定了在执行一个相应的第二PE之前要执行一个相应的第一PE;编译该计算任务以用于在多处理器设备上并发地执行,所述多处理器设备包括多个处理器,所述多个处理器通过在一个包括第二数量的执行序列的调用数据结构中不与所述执行依赖性冲突地布置所述PE而能够同时地执行第一数量的PE,所述第二数量大于1且不超过所述第一数量;以及调用该多处理器设备以运行软件代码,所述软件代码响应于所述调用数据结构并行地执行所述执行序列,以产生所述计算任务的结果。
根据本发明的一个实施方案,还提供了一种计算机软件产品,所述产品包括计算机可读介质,在所述计算机可读介质中存储了程序指令,所述指令当被计算机读取时,使得所述计算机:接受计算任务的定义,该计算任务包括具有执行依赖性的多个原子处理元(PE),每个执行依赖性规定了在执行一个相应的第二PE之前要执行一个相应的第一PE;编译该计算任务以用于在多处理器设备上并发地执行,所述多处理器设备包括并行运行的多个处理器,通过在一个包括多个执行序列的调用数据结构中不与所述执行依赖性冲突地布置所述PE来调度该PE,以用于由所述多个处理器根据微处理器设备的内建调度策略执行;以及调用该多处理器设备以运行软件代码,所述软件代码响应于所述调用数据结构而并行地且无关于所述多处理器设备的调度策略地执行所述执行序列,以产生所述计算任务的结果。
从下面结合附图的对本发明的实施方案的详细描述中,将可更完整地理解本发明,其中:
附图说明
图1是示意性地示出根据本发明的一个实施方案的用于执行依赖性问题的系统的方框图;
图2是示意性地示出根据本发明的一个实施方案的图形处理单元(GPU)的方框图;
图3是示意性地示出根据本发明的一个实施方案的以依赖性图来表示的依赖性问题的图解;
图4是示意性地示出根据本发明的一个实施方案的静态调用数据库(SID)的图解;
图5是示意性地示出根据本发明的一个实施方案的用于执行依赖性问题的方法的流程图;
图6是示意性地示出根据本发明的一个实施方案的用于SID生成的线程束网格的图解;
图7是示意性地示出根据本发明的一个实施方案的用于将处理单元(PE)分配在线程束网格中的分配区间的图解;
图8是示意性地示出根据本发明的一个实施方案的用于生成SID的方法的流程图;
图9是示意性地示出根据本发明的一个实施方案的一个高速缓存管理方案的图解;
图10A和10B是示意性地示出根据本发明的一个实施方案的变量预取方案的图解;
图11是示意性地示出根据本发明的一个实施方案的一个变量预排列方案的图解;
图12是示意性地示出根据本发明的一个实施方案的多个SID的图解;
图13是示意性地示出根据本发明的一个实施方案的用于SID间通信的一种方法的流程图;
图14A和14B是示意性地示出根据本发明的一个实施方案的SID内通信方案的图解;
图15是示意性地示出了根据本发明的一个实施方案的既使用SID间通信又使用SID内通信的SID的图解;
图16是示意性地示出了根据本发明的一个实施方案的用于减少SID间通信的方法的状态图;
图17是示意性地示出根据本发明的一个实施方案的用于减少SID间通信的方法的流程图;
图18是示意性地示出了根据本发明的一个实施方案的表示数字滤波器的依赖性图的图解;以及
图19是示意性地示出了根据本发明的一个实施方案的表示快速傅立叶变换(FFT)计算单元的依赖性图的图解。
具体实施方式
概述
许多领域中的多种计算任务都可被表示为依赖性问题,例如被表示为一组具有执行依赖性的原子处理元。依赖性问题通常大而复杂,且它们的执行通常涉及高计算复杂性和长执行时间。因此,在并行操作的多个处理器上执行依赖性问题是有利的。然而,在处理元之间的执行依赖性,通常使得依赖性问题难于被划分成并行的计算任务。
本发明的实施方案提供了用于通过并行处理器来执行依赖性问题的改良的方法和系统。所公开的方法和系统对依赖性问题进行操作,该依赖性问题包括具有执行依赖性的原子处理元(PE)。(一对处理元之间的执行依赖性,指的是一个处理元对由另一个处理元所产生的输入进行操作。因此,执行依赖性对于处理元的执行顺序施加了约束。)编译这一依赖性问题,以便在包括多个处理器的多处理器设备例如图形处理单元(GPU)上进行并发执行。
所述编译进程在由所述多处理器设备的处理核所并行执行的多个执行序列中布置所述PE,而不破坏执行依赖性。通常,所述编译进程生成包括所述执行序列的静态调用数据库(SID)。所述多处理器设备被调用以运行执行SID的软件代码,从而产生所述依赖性问题的结果。
通过尝试将相互依赖的PE放置在同一个执行序列中,并且如有需要在不同序列中的PE之间引入同步,以保持执行依赖性。在典型的多处理器设备中,处理器成组布置,且每组中的处理器能够通过共享存储器进行交互并且交换数据。在某些实施方案中,SID中的每个执行序列均作为线程块而提供给所述多处理器设备,以保证在每个序列中的PE均被同一组处理器执行且可通过该组的共享存储器交换数据。
选择SID中的执行序列的数量,以免超越所述多处理器设备能够同时执行的线程块的最大数量。由此,保证了执行序列同时运行,并通常不受所述多处理器设备的任何内建调度策略影响。这一操作模式与已知的调用方案形成明显对比,已知的调用方案通常使大量的线程块涌入多处理器设备,然后依赖于该多处理器设备的内部调度来达到并行化。另一方面,在本文描述的方法和系统中,依赖性问题在多个并行处理器之间的并行化方式是完全确定性的,且是在编译时间而非在运行时间定义的。由此,有效地绕开了多处理器设备的内部调度策略,且PE的执行顺序被在SID中定义的执行序列和同步机制完全控制。本文描述了生成高效率SID的一个示例过程。
此外,本文还描述了用于对在SID执行期间实现的大量存储器访问操作进行管理的几种方法和系统。具体地,所公开的技术通过PE执行序列充分利用了多处理器设备的设备存储器和共享存储器。(在典型的多处理器设备中,设备存储器提供了较大的存储器空间,但却招致了较高的访问时延、较大的访问粒度以及地址对齐约束。另一方面,共享存储器具有有限的存储器空间,但却提供了较快的访问时间,且几乎或完全没有地址对齐约束。)通过利用存储器访问操作的模式在SID编译期间被完全确定这一事实,所公开的技术实现了有效率和确定性的存储器访问。
系统描述
图1是示意性地示出了根据本发明的一个实施方案的用于执行依赖性问题的系统20的方框图。各种计算任务均可被表示为依赖性问题,例如,表示为具有执行依赖性的一批原子处理任务。依赖性问题存在于许多领域和应用中,例如,数字硬件设计仿真,实时视频处理,图像处理,软件定义的无线电(SDR),在各种通信应用中的包处理,以及纠错编码。系统20可用于有效率地执行可被表示为依赖性问题的任何适合的计算任务。接下来进一步描述特定计算任务的几个实例,以及所公开的技术对于这些任务的适用性。
在本实例中,系统20包括服务器24,该服务器24包括接口26、中央处理单元28以及一个或多个图形处理单元(GPU)32。服务器24可包括任何适合的工作站或计算平台。每个GPU,如下所述,包括并行操作的大量处理核。此处描述的方法和系统产生了最大化了GPU核的并行应用的软件代码,且因此使得系统20能够以相对短的执行时间来执行高度复杂的依赖性问题。
服务器24通过用户工作站36与用户交互。服务器24通过接口26接受来自用户的待执行的依赖性问题。所述服务器编译所述输入依赖性问题以产生软件代码,然后在CPU28和GPU32上运行该代码。执行结果通过接口26提供给该用户。系统20的功能可以以取决于应用的多种方式在CPU28和GPU32之间划分。此处描述的实施方案提到了单GPU。然而,一般地,可使用任何期望数量的GPU。
通常,CPU28包括通用处理器,其是以软件编程的,以实现此处描述的功能。该软件可以例如通过网络以电子形式下载到该处理器,或者替代地或附加地,提供到和/或存储在有形介质例如磁、光学或电子存储器上。
系统20的配置是示例配置,完全是为了概念清楚而选择的。也可以使用任何其他适当的系统配置。例如,用户工作站36可以与服务器24本地通信或通过通信网络通信。在替代实施方案中,用户工作站功能可以直接在服务器24上实现。
使用诸如系统20之类的系统来进行逻辑设计仿真的某些方面,在提交于2009年3月25日的题为“Design Simulation using ParallelProcessors”的PCT申请PCT/IL2009/000330中进行了论述,该申请转让给本专利申请的受让人,且其公开内容以参引方式纳入本文。
图2是示意性地示出了根据本发明的一个实施方案的GPU32的内部结构的方框图。在当前实例中,GPU32包括多个多处理器40。每个多处理器40包括多个处理器44,所述多个处理器44在本文也称为处理核。在某些实施方案中,每个多处理器40包括一个单指令多线程(SIMT)处理器,如本领域所知。在替代实施方案中,每个多处理器40包括一个单指令多数据(SIMD)处理器,其中所有处理器44在每个时钟周期内运行相同的指令。(然而,不同的处理器可以在不同数据上运行相同的指令。)在典型应用中,整个GPU中的所有处理器44运行相同的指令。不同处理器的功能之间的差别是由所述数据引入的。所公开的技术既可应用于SIMD处理器也可应用于SIMT处理器。
每个处理器44可以访问若干本地寄存器48。一个给定的多处理器40之内的不同处理器可以在共享存储器52内存储数据。这一共享存储器对于该给定的多处理器的处理器44是可访问的,但对于其他多处理器的处理器是不可访问的。在典型的GPU中,每个多处理器还包括一个指令单元60,该指令单元60管理所述多处理器的操作。在典型的多处理器中,单元60创建、管理和执行并发的线程。具体地,单元60可包括对在所述多处理器中运行的不同线程的操作进行同步的硬件机制。
GPU32包括设备存储器56,该设备存储器56在本文也称为外部存储器。存储器56通常包括动态随机存取存储器(DRAM)。不同于共享存储器52,设备存储器56通常对于所有多处理器40的处理器都是可访问的。另一方面,对设备存储器56的访问在时延和吞吐量方面通常是代价昂贵的。为了有效率地访问存储器56,通常希望写入连续且对齐的存储器地址或从连续且对齐的存储器地址读取。本文描述的某些方法涉及产生有效率地访问存储器56的代码。
每个处理器44在任意给定时间运行的基本软件代码单位被称为线程。通常,CPU28通过为GPU提供线程块来调用GPU32。给定的线程块被保证运行在处于SIMD模式或SIMT模式的单个多处理器40的处理器上。因此,给定的块中的线程可以通过共享存储器52彼此通信。
通常,每个块中的线程的数量可多于在该多处理器中的处理器的数量。提供给GPU的块的数量通常可以多于多处理器的数量。所述GPU包括块管理器60,其从CPU28接受待执行的块,并且根据某些内部标准对块和线程的执行进行调度。这些标准在本文中称为内建调度策略。
因此,除了保证给定块的线程在同一多处理器内执行之外,对给定块的线程在该多处理器内执行的顺序不作保证。对于不同的块在GPU中执行的顺序也不作保证。也就是说,CPU28通常对GPU的内部调度策略没有控制。
此处描述的某些方法和系统生成代码,所述代码利用了GPU的架构特征,例如在给定块内的线程之间同步和共享数据的能力。当把依赖性问题划分成线程时,在该GPU内的线程和块执行的非保证性质(也即,与所述GPU的调度策略无关)的前提下,所公开的方法和系统在不同的原子处理任务之间保留了固有的依赖性。
具体地,所述GPU通常被指定为同时执行一定数量的块。如果GPU调用更多数量的块,则这些块被块管理器60调度。此处描述的某些方法和系统以多个块调用该GPU,该多个块不超过可同时执行的块的最大数量。因此,块管理器60的内部调度策略被有效地绕开了。这些特征在下文进一步详述。
图2中的GPU配置是一个示例配置,其完全是为了概念清楚而选择的。在替代的实施方案中,也可使用任何其他适合的GPU配置。可用于此目的的典型GPU设备是由NVIDIA公司(加利福尼亚州圣克拉拉市)生产的GTX285设备。此设备包括三十个多处理器,每个多处理器包括八个处理核。进一步替代地,虽然本文描述的实施方案提到了GPU的使用,所公开的方法和系统可以和各种其他类型的并行地操作多个处理核的处理器一同使用,例如数字信号处理器(DSP)和多核中央处理单元(CPU)。
使用依赖性图来表示依赖性问题
CPU28以原子执行任务的形式表示了输入依赖性问题,所述原子执行任务在本文称为处理元(PE)。当该依赖性问题由GPU32执行时,每个PE相应于由某个处理器44执行的线程。所述CPU通常保存了一个PE类型库,每个类型执行一个特定的原子任务(例如,查找表查找,触发器,缓冲操作,存储器访问操作,多路复用操作,运算操作,逻辑操作或任意其他适当的任务类型)。每个PE属于所述类型之一,并且在特定数据上操作。
当处理器44以SIMT模式工作时,每个线程通常包括能够运行不同PE类型的代码。当执行该线程时,由该线程执行的实际的PE类型是由数据选择的。由该线程读取的数据可以选择实际的PE类型,选择方式例如,跳转到实现想要的PE功能的程序地址,或者使用任何其他适当的选择方法。因此典型的线程可以执行下列流程:
·从存储器56读取想要的PE类型,并且跳转到实施这一PE类型的适当地址。
·从存储器56读取PE参数和输入值。
·执行想要的PE功能。
·将PE输出值写到存储器56。
(为了有效率地访问存储器56,CPU28可以将PE分成PE组——PEG。这一特征在下文进一步详述,也已在上面引用的PCT申请PCT/IL2009/000330中提及。)通常,线程加载和存储操作都与线程的PE参数无关。例如,给定PEG可支持最多达64个从设备存储器到共享存储器的加载命令。给定线程可加载不由其PE所使用的数据。
当在SIMT处理器中使用上述技术时,通常期望的是,对于被调度为在给定的多处理器SIMT单元中并发运行的线程,它们将运行同样的PE类型,以使得该单元有效率地以SIMD模式运行。
图3是示意性地示出了根据本发明的一个实施方案的用依赖性图来表示的依赖性问题的图解。CPU28使用多个PE表示该依赖性问题,所述多个PE通过执行依赖性而被互连。给定的依赖性规定了某个PE(被称为“使驱(driving)”PE)的输出被用作另一个PE(被称作“受驱(driven)”PE)的输入。换句话说,受驱PE依赖于使驱PE。这样的依赖性意味着使驱PE将在受驱PE之前被执行,这是因为否则受驱PE的输入将无效。
图3示出了示例依赖性问题68,其被转化成依赖性图72。图72包括表示了所述PE的多个顶点76,以及表示了执行依赖性的有向边80。一条给定的边的方向为从使驱PE到受驱PE。在某些实施方案中,CPU28从依赖性图72产生多个子图78。不同于依赖性图72——其通常可以是循环的,而每个子图78是非循环。
下文所述的方法将给定的非循环子图转换成在GPU32上执行的代码。如果依赖性问题使用多个子图来表示,则所公开的方法通常独立地适用于每个子图。在某些实施方案中,可以利用不同子图之间变量的共性来提高计算效率。这些特征将在下文进一步陈述。
使用静态调用数据库(SID)表示和执行依赖性图
在某些实施方案中,CPU28编译所述输入依赖性问题,以产生一个调用数据结构,该调用数据结构在本文中称为静态调用数据库(SID)。该SID被提供给GPU32以便执行。CPU28通常运行一个产生SID的编译器程序。在下文的说明书中,为清楚起见,CPU28执行的行为有些时候被称为是由编译器实现的。然而,在替代的实施方案中,该编译器可以在任何适当的处理器上运行,以产生该SID。由此产生的结果SID可以接着被提供给系统20以便执行。
所述SID包括一批PE执行序列,它们被保证彼此并行且以某一特定顺序运行,而无关于所述GPU的内部调度策略。当GPU以该SID被调用时,每个执行序列作为一个线程块而被提供给GPU。因此,保证了每个序列中的PE运行在GPU32的同一多处理器40中。此外,该SID中的执行序列的数量不超过可由该GPU同时执行的块的最大数量。因此,执行序列被保证在所述GPU中同时运行,并且执行序列基本不受块管理器60的内部调度策略影响。换句话说,有效绕开了所述GPU的内部调度策略,且PE的执行顺序完全由SID所控制。
图4是示意性地示出了根据本发明的一个实施方案的SID90的图解。SID90包括一批执行序列,在本实例中是四个序列98A…98D。然而,通常,可使用任意适当数量的序列,该数量大于1但不超过可由该GPU同时执行的块的最大数量。每个执行序列包括一系列PEG94,其被逐个执行。(下文将进一步叙述将PE分组成PEG)
GPU能够同时运行的块的数量通常是由多处理器40的数量乘以可由每个多处理器40同时执行的块的数量。每个多处理器的并发块的实际数量有时可被多处理器资源(例如,寄存器、共享存储器或线程数)限制,且因此可小于每个多处理器的并发块的规定数量。
在某些情况下,每个多处理器的并发块的实际数量可被写作min((多处理器寄存器数/程序寄存器数),(多处理器共享存储器大小/程序共享存储器),(每个多处理器的线程数量/每个块的线程数量),每个多处理器的并发块的规定数量)。例如,GTX285GPU具有30个多处理器40。每个多处理器包括16,384个寄存器和一个16K字节的共享存储器,且支持最多1024个并发线程,以及最多8个并发块。在一个示例实施方案中,由编译器产生的GPU代码在每个线程使用了2KB共享存储器和15个寄存器,其中每个块包括64个线程。这一代码导致了每个块共有15x64=240个寄存器。在这一实例中,每个多处理器的并发块的数量是min(16KB/2KB,16384/240,1024/64,8)=min(8,68,16,8)=8。因此,可由整个GPU同时执行的并发块的最大数量是8×30=240。
因此,不同的执行序列通常可具有不同的长度,也即,不同的执行时间。通常,CPU28试图将依赖性问题编译成一个执行时间为最小的SID。换句话说,CPU试图在不超过允许的最大序列数量的前提下产生一个具有最短执行序列的SID。下文将进一步详述这类的一个示例SID生成过程。
由于每个执行序列包括了被保证在同一多处理器40中运行的线程块,从而保证了在一个给定序列中的PEG以正确顺序运行。因此,在同一执行序列中把使驱PE放在其相应的受驱PE之前,将保证不破坏PE之间的执行依赖性。此外,属于同一执行序列的PEG可使用运行此序列的多处理器的共享存储器52来交换数据。
然而,在许多依赖性问题中,将每一对依赖的PE置于同一执行序列中这一约束过于严格。这样的约束通常产生了少数的极长的执行序列,且因此增加了执行时间并且限制了可达到的并行化。在许多情况下,希望将依赖的PE置于不同的执行序列中,同时仍然保留执行依赖性。
在一些实施方案中,编译器强制该SID中不同的执行序列之间进行同步,以保持置于不同序列中的PE之间的依赖性。例如,在图4中,如依赖关系110所指示,序列98B中的PEG102依赖于序列98A中的PEG106。(更准确地说,PEG102包括这样一个PE,该PE依赖于PEG106中的一个PE。)为了保证PEG106在PEG102开始执行之前被完全执行,所述编译器将一个同步元,例如SYNC PEG114,放置在序列98B中的PEG102之前。SYNC114暂停序列98B的执行,直到PEG106完成执行并且产生有效输出。然后将PEG106的输出作为输入提供给PEG102,序列98B即可恢复执行。类似地,如依赖关系126所示,序列98C中的PEG118依赖于序列98D中的PEG122。为了保持这一依赖性,该编译器在序列98C中将一SYNC PEG130放置在PEG118之前。
序列之间的同步化通常是用设备存储器56来实现的。例如,使驱PEG可通过向设备存储器56的某一区域写入来发出其执行状态的信号。一个SYNC PEG可以轮询这一区域,并且仅当所述使驱PEG已完成执行时才恢复执行所述SYNC PEG的序列。
然而,注意,并不是不同序列中的每一对依赖的PE都必定要求增加一个同步PEG。例如,假设序列98C中的最后一个PEG依赖于序列98D中的第一个PEG。在此情况下,没有必要给序列98C添加另一个SYNC PEG,因为已有的SYNC PEG130已经保证了只有在序列98D中的第一个PEG执行完毕的情况下,序列98C中的最后一个PEG才会执行。
通常,某个SYNC PEG可依赖于任意期望数量的序列中的任意期望数量的PEG,也即,暂停给定序列的执行直到预定义的一批使驱PEG完成执行为止。在某些实施方案中,同步功能可被嵌入在受驱PEG中而不使用专用的SYNC PEG。
在序列之间的强制同步可以高效地平衡不同序列的执行时间,且因此增进了并行化。另一方面,同步机制导致了时延,且涉及对设备存储器56的代价高昂的访问。如下文将解释,所述编译器通常试图将这些优点和缺陷作折衷平衡,以达到该SID的总执行时间最短。
图5是示意性地示出了根据本发明的一个实施方案的用于执行依赖性问题的方法的流程图。在图中的输入步骤134,该方法以CPU28接收输入依赖性问题作为开始,该问题被表示为依赖性图。在划分步骤138,所述CPU将所述依赖性图划分成有向的、非循环的子图。在例如上文引述的PCT申请PCT/IL2009/000330中,陈述了从依赖性图到有向的、非循环的子图的划分。在分组步骤142,对于每个子图,所述CPU将PE分组成PEG,而在SID构建步骤146,所述CPU将PEG布置在SID中。在调用步骤150,所述CPU调用GPU32以执行该SID。该GPU执行该SID中的PEG序列,以产生该计算任务的结果。
有效率的SID生成
如上所述,在CPU28上运行的编译器通常试图生成这样的SID:其对于给定的最大执行序列数量具有最短的执行时间。输入这一过程中的,是PE的有向的、非循环的依赖性子图,其将要被转换成SID。在某些实施方案中,所述编译器通过以保留了PE之间的执行依赖性的方式将一个二维线程束网格用PE逐渐地填满,来生成SID。
一个线程束是一组同样类型的线程,其在一个给定的多处理器内并发地并且有效率地运行。在一个线程束中的最大线程数量(且因此,PE的最大数量)可从一个GPU类型到另一个GPU类型而有所变化。例如,在NVIDIA GTX285设备中,每个线程束运行32个线程。如下文所示,几个线程束可稍后结合在一起以形成一个PEG。
图6是示意性地示出了根据本发明的一个实施方案的用于SID生成的线程束网格160的图解。网格160包括多个执行序列164,每个执行序列164都包括多个线程束空位168。线程束空位起初是空的,然后该编译器逐渐地用PE将它们填满。为了在不同的执行序列之间强制同步,所述编译器有时将SYNC线程束172插入所述序列。(注意,SYNC线程束不同于普通的线程束,因为它们不包括用于执行的线程。SYNC线程束模仿了将要被插入该序列的SYNC操作的时延。)在该过程结束时,输入子图中的每个PE都被放置入线程束空位之一(每个线程束空位可包括同一类型的多个PE)。然后该编译器从所述线程束形成PEG176,在某些情况下,将给定序列中的两个或更多个相邻线程束结合在一起以形成一个PEG。将PEG的网格输出作为想要的SID。
通常,网格160中的执行序列164的数量被设置为不超过该GPU可同时运行的线程块的最大数量,以使得作为结果的SID的执行不会受内部GPU调度的影响。每个序列的线程束空位的数量通常被初始化为输入子图中的最长路径的长度。
由于PE之间的依赖性,每个PE只能被放置在网格160的列中的某一个部分子集之内。这一子集被称为所述PE的分配区间(allocation interval)。例如,依赖于另一个PE的PE不能被放置在所述线程束网格的第一列(也即,在任意执行序列之始),因为必须先执行使驱。相似地,驱动了另一个PE的PE不能被放置在网格的最后一列。
通常,该子图中的每个PE具有一个特定的分配区间,其定义了该PE可能被放置在其中的网格160的列。PE x的分配区间依赖于两个参数,其被称为PE x的反向段(表示为BP(x))和前向段(表示为PF(x))。给定PE的反向段被定义为该子图中沿通向该PE的最长路径的PE的数量。给定PE的前向段被定义为该子图中沿从该PE开始的最长路径的PE的数量。
使用这套术语,子图中最长路径的长度(且因此,在线程束网格160中的列的数量)由L=max(BP(x)+FP(x))+l给定,其中最大值是子图中所有PEx的数量。PEx的分配区间由[BP(x),L-FP(x)]给定。这些分配区间反映了在分配过程开始时的情况。所述分配区间通常随着分配过程的进行而变化。
图7是示意性地示出了根据本发明的一个实施方案的用于将PE放置在一个线程束网格中的分配区间的图解。图7涉及示例子图180,其包括8个PE76,表示为A…H。所述PE将要被放置在具有两个序列164的线程束网格中。因为穿过此图的最长路径是三个PE长,所以该实例中的每个序列164包括三个线程束空位168。
这8个PE的前向段和反向段在下表中给出:
在分配过程的开始,也即,当线程束网格仍然为空时,这8个PE具有如图所示的分配区间184。在此实例中,PE A和B只能被放置在网格的第一列中,因为它们均驱动了由两个PE组成的一条路径。PE C可被置于除了最后一列之外的任何位置,因其驱动了单PE路径。PE D和E只可被放置在第二列内,因为它们都受某一个PE驱动并且驱动某一个PE。PE F可以被放置在除了第一列以外任何位置,其是受单PE路径驱动的。最后,PE G和H只能被放置在最后一列中,因为两者中的每一个都是受双PE路径驱动的。
图7的实例阐明了,某些PE比起其他的PE来说,在将它们放置在网格160中时的可能性方面受到更严格的限制。具有短分配区间的PE受到严格的限制,而具有更长分配区间的PE在分配方面具有更大自由度。
图8是示意性地示出了根据本发明的一个实施方案的用于生成SID的方法的流程图。该方法始于输入步骤190,在CPU28上运行的编译器接受用于转换成SID的依赖性子图。在某些实施方案中,所述编译器也接受导出该子图的依赖性完成图,其通常包括另外的PE和依赖性。当生成与其他SID无关的单SID时,通常没必要接受完成图。然而,当考虑同一图中其他子图的其他SID时,所述编译器可使用该完成图。这一特征在下文进一步叙述。此外,该编译器可将下列各项作为输入接受:执行序列的数量N、线程束空位单元中的SYNC的时延D、线程束的大小(也即,每个线程束的PE的数量)以及PE的类型。
在区间初始化步骤194,所述编译器为在该子图中的每个PE初始化一个分配区间。如上文所解释,PE x的初始分配区间由[BP(x),L-FP(x)]给定。
在组定义步骤198,所述编译器定义了PE输入组和输出组。一个输入组包括了具有一个公共输入的一组PE(也即,受同一个使驱PE驱动的PE)。公共使驱PE被称为该组的支点(pivot)。一个输出组包括了具有一个公共输出的一组PE(也即,驱动了同一个受驱PE的PE)。公共受驱PE被称为该组的支点。
例如,该编译器可以为整个依赖性图中的每个PE x都创建一个输出组,以使得PE x成为那组的支点。在这一输出组中的PE包括了该子图中的PE——其驱动了PE x。类似地,该编译器可以为整个依赖性图中的每个PE x都创建一个输入组,以使得PE x成为那组的支点。这一输入组中的PE包括了该子图中的PE,它们受PE x驱动。注意,在此实例中,该编译器为整个图中的每个PE创建输入组和输出组。然而,在该组中的PE只选自该子图,而并非选自整个图。
构建输入组和输出组的原因是:通常希望将具有公共输入和/或输出的PE放在同一执行序列中(虽然可能放在不同的线程束中)。考虑整个图的原因是:有时希望将用作其他SID中的PE的公共输入或公共输出的PE放在同一序列中。该编译器给该子图中的每个PE分配一个组评分,其被定义为包括了该PE的输入组和输出组的数量。
在网格初始化步骤202,该编译器初始化了具有N个执行序列的线程束的网格,每个序列具有L个线程束空位。
在某些实施方案中,在排序步骤206,编译器对子图的PE进行预排序。该编译器以PE的分配区间的大小的升序对PE排序。具有相同的分配区间大小的PE被以它们的组评分的降序排序。接下来,编译器按照排序出的顺序,选择用于布置在该网格中的PE。因此,具有最短分配区间的PE被首先放置在该网格中。对于给定的分配区间大小,具有较大的组评分的PE(属于大量输入组和/或输出组的成员的PE)被首先放置。在一个替代的实施方案中,该编译器可通过选择具有最短分配区间的M个PE(M表示了预定义的整数),来选择用于放置在该网格中的下一个PE。该编译器从这些PE中,选择具有最大的组评分的PE。上述分配顺序试图首先分配受约束最严格的PE,以为后续的分配迭代留下尽量多的自由度。
在当前PE选择步骤210,该编译器在已排序的PE中选择用于放置在该网格中的下一个PE。在分配成本计算步骤214,该编译器为此PE在该网格中的每种放置可能计算相应的分配成本。通常,该编译器在所述N个执行序列上检查在该PE的分配区间之内的线程束空位。(在某些情况下,某个线程束即使处于给定PE的分配区间之内,也不被作为放置该PE的候选线程束。例如,该线程束可能已被完全填充,或者其可能包括类型不同于已检查的PE的类型的PE。)
在某些实施方案中,编译器可检查位于给定PE的分配区间之外且相距不远的线程束空位。例如,在某些情况下,与增加SYNC(其可导致在SID执行时间上更糟的惩罚)相反,故意地将一个PE放置在其分配区间之外(仅因此略微增加SID执行时间)可能是更可取的。因此,在某些实施方案中,所述编译器检查该分配区间和若干线程束空位,检查若干线程束空位所花的时间处于由同步引入的时延的数量级。
该编译器为每个可能的线程束空位计算分配成本。所述分配成本是定量的度量,其指示了将该PE放置在特定的线程束空位中的可能的惩罚。
该编译器可将任何适当的标准或启示应用在计算分配成本中。
在一个示例实施方式中,可使用下列规则:
·在SID总执行时间中对于每个线程束空位延迟把成本增加1000,这将会由把PE放置在已检查的线程束空位中而产生。这一规则对于增加总执行时间施加了严厉的惩罚。
·对于以下每个PE把成本降低10,所述PE已经被放置在与已检查的线程束空位相同的序列中,且是同样包括了已检查的PE的一个输入组或输出组的成员。这一规则给出了对于在同一序列中放置输出组或输入组的成员的偏好。
·对于以下每个执行依赖性(直接的或间接的,前向的或反向的)把成本降低10,该执行依赖性和已检查的PE是相关的,且该执行依赖性的其他PE与已检查的线程束空位处于相同的序列中。这一规则给出了对于把一个执行依赖性的两端放置在同一序列中的偏好(且潜在地避免在序列之间插入一个SYNC)。
·通过与已检查的PE的最优列之间的距离来增加成本。PE x的最优列被定义为BP(x)·L/ORIG_L,其中L表示了该网格中的已被填充的列的当前数量,且L_ORIG表示了该子图中的最长路径。注意,最优列可能落到该PE的分配区间之外。
在某些实施方案中,假设PE被放置在某个线程束空位,该编译器可通过检查遍历了该PE的不同的关键子图路径并且计算这些路径的持续时间,来计算分配成本。这种计算将会考虑将被添加的额外的SYNC,以及它们的相关成本。进一步附加地或替代地,该编译器可使用任何其他适当的标准或启示,将分配成本指派给在已检查的PE的分配区间中的不同的线程束空位。
在放置步骤218,该编译器现在将该PE放置在具有最低分配成本的线程束空位中。在SYNC插入步骤222,如果有这一新的放置需要,则该编译器插入一个SYNC。一个SYNC具有整数数量的线程束空位的预定义持续时间,例如两个空位。每SYNC包括一个或多个线程束所组成的列表,对所述一个或多个线程束的执行必须在该SYNC恢复执行其自身的序列之前完成。被一个给定SYNC所轮询的线程束可处于任意数量的序列中。该列表通常不可包括来自同一序列的多个线程束。
在区间更新步骤226,所述编译器更新剩余的未分配PE的分配区间,以反映在所述新的放置以后的可能的放置。
在某些实施方案中,在组评分更新步骤230,该编译器更新在所述新的放置以后剩余的PE的组评分。例如,该编译器可增加与新放置的PE共享同一输入组或输出组的PE的组评分。这一规则给出了对成员已经部分地被分配的输入组或输出组的偏好。作为另一个实例,所述编译器可增加与新放置的PE共享(直接的或间接的、前向的或反向的)执行依赖性的PE的组评分。
在核对步骤234,该编译器核对该子图中是否所有PE都被放置在该线程束网格中。如果有剩余的待分配的PE,所述方法循环返回上述步骤210——其中该编译器选择下一个待放置的PE。在PEG创建步骤238,如果所有PE都已被分配,所述编译器将连续的线程束分组成PEG。通常,每个PEG可仅包括一定数量的属于同一序列的连续的线程束,例如,最多两个线程束,可能加上一个SYNC。此外,PEG可仅包括彼此独立的PE,因为对于在PEG之内的PE执行顺序不存在保证。在上述图6中,例如,一些PEG176只包括单个线程束,一些PEG包括两个线程束,且所述PEG中的一个包括一个线程束和一个SYNC。
在这一阶段,在输出步骤242,所述编译器把作为结果的已填充的线程束网格(一批N个PEG执行序列)作为希望的SID而输出。
通常,上述描述的SID生成过程假设了线程束空位持续时间考虑了不同的PEG操作,例如加载、同步、执行和存储等命令的持续时间。然而,在某些情况下,加载和存储命令的持续时间可被忽略。上述描述假设了所有线程束均具有相同的持续时间,且一个SYNC的持续时间是一个线程束空位的整数倍。这一描述也假设了PEG的持续时间等于其线程束和SYNC的持续时间的总和。然而,所有这些假设都不是强制性的,而且替代的SID生成方案可采取其他假设。
在某些情况下,编译器不得不增加最大执行序列长度,也即,SID总执行时间。例如,当该编译器不能将任一所述线程束中的某个PE放置在PE分配区间内时,可能需要增加L。虽然某些SYNC的插入不导致L的增加,但也可在插入SYNC之后增加L。L的增加通常意味着,先前放置的越过了某一列的线程束和SYNC被推动到了右方。这一推动可触发接下来其他线程束和/或SYNC的一连串的向右推动操作。当计算某个线程束位置的分配成本时(在上述步骤214),该成本通常仅响应于增加了总体SID执行时间L的向右推动操作而增加。不改变L的向右推动操作通常不会导致分配成本。
在许多情形下,所述编译器遇到了用于放置给定PE的几种选项。在某些情况下,将给定PE放置在最低成本位置(在上述步骤218)可能不是全局最优的,因为这一放置可导致对未来的PE放置的可观的惩罚。因此,该编译器通过考虑并行的两个或更多个可替代的SID,并且执行这些SID中的两个或更多个相应的可替代的分配过程,可改善PE分配过程。各种不同的检索方法,例如“A-星”方案或甚至是遗传检索算法,可用于汇聚到全局最佳的SID。
用于有效率的SID操作的存储器管理
如可认识到的,在GPU32上执行SID通常涉及大量的存储器访问操作。在所述GPU中,数据可被存储在设备存储器56或共享存储器52中。设备存储器56通常提供了大量的存储空间(例如,几十亿字节),但是对这一存储器的访问在时延方面代价高昂。通常,多处理器40以较大的粒度(例如,一次512比特)访问设备存储器56。因此,读一个比特或写一个比特到设备存储器56的成本,类似于读或写512个比特的成本。到设备存储器56的读和写命令通常被与这些大粒度的地址对齐。另一方面,每个多处理器中的共享存储器52都可以被所述多处理器的处理器44在相对短的访问时间内以小粒度且不经对齐地访问。然而,共享存储器52的大小,明显地小于设备存储器的大小(例如,是在千字节数量级而不是在十亿字节数量级)。
在本发明的某些实施方案中,所述SID中的PEG序列使用共享存储器52作为高速缓存存储器,以有效率地访问设备存储器56,并且最小化相关的时延惩罚。在接下来的说明中,术语“共享存储器”和“高速缓存”有时候可交替地使用。
在此强调,应注意在此描述的高速缓存和存储器管理方案在编译期间就已完全确定,且在整个SID执行中都保持为确定性的。这一特征不同于某些已知的高速缓存机制——它们的操作可根据运行时间的数据而变化且因此在本质上是统计性的。在本文描述的技术中,由不同的PEG序列请求且产生的数据的模式和时序是在编译期间先行获知的。该编译器可利用这一知识,决定出有效率地访问设备存储器56的某个最优的存储器管理方式(例如,在某一时刻对某一变量高速缓存入或出,或者将多个读请求合并到一个读操作中)。这些方式将由GPU在运行时间内确定性地实现。
图9是示意性地示出了根据本发明的一个实施方案的一个高速缓存管理方案的图解。图9示出了一个特定的PEG执行序列,其包括九个PEG,分别称为P1…P9。该PEG将六个被表示为A…F的变量用作输入,其中每个PEG使用这些变量的某一个子集。在此实例中,共享存储器52可在任何给定时间保留最多三个变量。该编译器定义了确定性的高速缓存模式,其规定了什么时候将某些变量从设备存储器56取到共享存储器52中,且什么时候某些变量将被丢弃,以最优化对大小有限的共享存储器的使用并且最小化从设备存储器读操作的数量。
该图顶部的区域250示出了被每个PEG用作输入的变量。例如,PEG P1使用变量A和B作为输入,PEG P2使用变量B和C,PEG P3只使用变量A,等等。向上的箭头表示了变量被相应的PEG从设备存储器56取到共享存储器52以便用作输入。向下的箭头表示变量在执行PEG之后被从共享存储器丢弃,以便于为下一个PEG中所需的变量释放空间。标以粗体边框的变量表示了高速缓存命中,也即,一个已经存在于高速缓存中且无须取自设备存储器的变量。例如,在执行PEGP2的准备中,没有必要从设备存储器取变量B,因为它来自前一PEG,已经存在于共享存储器中。
在该图底部的区域254示出了,在每个PEG的开始,共享存储器52的内容。例如,在PEG P1的开始,共享存储器保留了变量A和B。在PEG P2的开始,取变量C,且因此共享存储器保留了变量A、B和C。在PEG P3期间,该高速缓存不改变。然而,PEG P4需要变量D作为输入。因此,变量A在PEG P3的末尾被丢弃,且在PEG P4的开始,取变量D。该过程在整个PEG序列执行期间持续进行。
对于在给定时间在共享存储器中存在的每个变量,所述编译器记录该序列中下一个将要请求此变量作为输入的PEG的身份。所述编译器通常通过根据执行顺序扫描该PEG序列,来确定这些PEG的身份。所记录的PEG的身份在该图底部的区域254中示出。例如,在PEG P1的开始取变量A和B时,该编译器注意到变量A接下来将被PEG P3请求,且变量B接下来将被PEG P2请求。作为另一个实例,在PEG P3的开始,所述编译器注意到变量A接下来将被PEG P5请求,且变量B和C接下来均将被PEG P4请求。符号∞指示了将不会被该序列中以后的任一PEG所请求的变量。
使用这些记录,所述编译器决定当将要在共享存储器中释放空间时丢弃哪个变量。当需要丢弃一个变量时,该编译器通常选择丢弃将被在该序列中最远的——也即具有从当前PEG算起的最大距离的——PEG所请求的变量。考虑例如在PEG P3末尾的情况。在这一时间点,共享存储器保留变量A、B和C。需要将这些变量中的一个“清洗掉”,以允许为PEG P4取变量D。由于变量A将被PEG5请求,而变量B和C更早地将被PEG P4请求,故变量A被丢弃。
图9的实例涉及特定的序列,特定的变量以及特定的高速缓存大小。然而,一般地,这一高速缓存管理方案可用于任何其他适合的PEG序列,变量集合以及高速缓存大小。在替代的实施方案中,所述编译器可以使用任意其他适合的标准来设计在共享存储器52中对变量的高速缓存入和高速缓存出。由该GPU指派以执行一个给定PEG序列的多处理器40,根据由该编译器设定的确定性的模式,从设备存储器56取变量到共享存储器52。通常,为SID中每个PEG序列实现一个类似的过程。所述编译器可使用任意适合的数据结构,用于记录将要请求不同变量的PEG。
在某些实施方案中,所述编译器将对自设备存储器56取入共享存储器52的多个变量的取操作聚合到一个取命令中,以减少从设备存储器的代价高昂的取操作的数量。如上所述,在一个典型的GPU中,从设备存储器取单个变量的开销类似于取填充了512比特的变量的开销,且因此将大量变量聚合并且取到一个命令中是有益的。
图10A和10B是示意性地示出了根据本发明的一个实施方案的一个变量预取方案的图解。该实例涉及一个PEG执行序列,其包括九个被表示为P1…P9的PEG。所述PEG使用被表示为A…D,S和T的六个变量作为输入。变量A…D被用在当前SID内部,而变量S和T包括了SID之间的变量。在图10A和10B中的每一个中,每一列相应于序列中某个PEG,且每一行相应于某一个变量。
从每个变量被某一PEG请求作为输入的点开始,这个变量被标以阴影图案。例如,变量B首先被PEG P3请求,且因此,这一变量从PEG P3起被标以阴影图案。竖直线258指示了在当前PEG序列和某个或某些其他序列之间的同步(SYNC),这些SYNC是由后来的PEG实现的。在当前实例中,SYNC是由PEG P1、P4和P7实现的。对于每个SYNC258,一个或多个标记262指示了由所述SYNC所同步的特定变量。例如,由PEG P4实现的SYNC将暂停执行,直到变量C和D被另一序列准备完毕为止。
在某些实施方案中,所述编译器扫描所述PEG序列,并且设置设备存储器取命令的时序,以及由每个命令所取的变量。通常,该编译器试图设置取命令的时序和内容,同时考虑(1)到将会需要每个变量的PEG的距离,以及(2)被认为是有效率的每个命令的若干取操作。基于此信息,该编译器试图将对两个或更多个变量的取操作合并在一个命令中。
在某些实施方案中,所述编译器以逆序(也即,与执行顺序相反)扫描所述PEG序列。为每个变量,所述编译器标记了一个相应的取区间,也即一个可在其间取所述变量的时间区间。这一时间区间始自该变量变为有效的时刻,在首先请求该变量作为输入的PEG处终止。然后该编译器基于这些时间区间设置取操作的时序和内容。
通常,对于每个变量且对于每个PEG,当该变量为有效时,所述编译器标记到该PEG的从将要首先请求该变量作为输入的PEG算起的距离(以PEG为单位)。在与一给定变量相关联的最近的SYNC258之后,该变量可被假设为有效。在当前实例中由所述编译器标出的距离在图10A和10B中示出。例如,变量D首先由PEG P6所请求,然后从PEG P4起的任何时间均可取变量D(在等待在该变量上的SYNC之后)。所述编译器基于标出的距离,设置取操作的时序和内容。例如,编译器可顺着执行顺序扫描PEG序列,识别需要取的变量,并且将它们与对其它变量的取操作结合,以生成有效率的取命令。编译器可合并取区间有重叠的两个或更多个变量。在这一重叠期间,定位合并的取命令。
假设认为,例如取两个变量的命令是有效率的,而仅取一个变量的命令是没有效率的。在图10B的实例中,在对PEG P1和P2的准备中不需要取变量。然而,PEG P3需要变量B作为输入,且因此所述编译器在对PEG P3的准备中定义了一个从设备存储器56的取命令的发生。为了有效率地访问设备存储器,所述编译器在同一个命令中聚合了另一个变量取操作。所述编译器选择自当前PEG起的距离(也即,从当前PEG到将要首先请求该变量的PEG的距离)为最短的有效变量。
在当前实例中,变量S和T在此时刻为有效,且变量T具有较小的距离(3,与6相比)。因此,所述编译器定义取命令,以取所述变量B和T。一旦这些变量被取得,它们就从该列表删去,以免被再次取得。这一过程使用类似的逻辑,且所述编译器定义了另外的两个取命令,一个在PEG P4之前取变量C和D,另一个在PEG P9之前取变量A和S。使用这一技术,在每个变量变得有效之后且在其被首次需要作为输入之前,取该变量,且通过在每个命令中聚合对多个变量的取操作,有效率地定义了取命令。
图10A和10B的实例涉及特定的序列,特定的变量,每个命令的取操作的特定数量以及特定的选择标准。然而,通常,所述编译器可应用一个具有任意其他适当的PEG序列、变量、每个命令的取操作的数量和/或选择标准的预取方案。通常,为SID中每个PEG序列执行一个类似的过程。所述编译器可使用任何适当的数据结构来记录上述时间区间和距离。
在某些实施方案中,所述编译器延迟设备存储器56中的变量(由PEG产生的输出)的存储,并且在每个存储命令中聚合多个变量。每个命令存储多个变量降低了与在设备存储器56中的存储有关的时延和开销。可使用与图10A和10B的预取机制类似的标准来实现此类延迟存储机制。例如,所述编译器可为每个变量识别,自每个产生该变量值的PEG算起直到该变量被要求作为输入(例如,被另一个序列中的PEG所要求,该PEG可能属于不同的SID)的点为止的,一个时间区间。当该变量被另一个SID中的一个序列要求作为输入时,所述编译器可将产生此变量的序列的末尾(而不是该序列内的单独的PEG)视为该变量准备完毕的时间。然后所述编译器可基于这些时间区间,定义多变量存储命令。
如上图9所示,当给定多处理器40执行给定PEG序列时,所述多处理器以一特定的确定性顺序从设备存储器56加载变量,将它们高速缓存在共享存储器中,并且将它们作为输入提供给该序列中的不同的PEG。在一些实施方案中,所述编译器按照PEG序列加载设备存储器56中的变量的顺序,将预排列这些变量。当使用此机制时,给定PEG序列可以使用一个有序的取操作序列,从设备存储器56取变量到连续的存储器地址。
图11是示意性地示出了根据本发明的一个实施方案的一个变量预排列方案的图解。图11的实例示出了上图9的高速缓存机制。该图上方的区域266示出了由该序列中不同的PEG高速缓存入共享存储器52的变量和清洗出共享存储器52的变量。区域270示出了在准备每个PEG的过程中从设备存储器56取得的变量。粗框标出了已经被该序列中一在前PEG读取但却在这期间被清洗出共享存储器的变量。
在某些实施方案中,所述编译器在馈送区域274将所述变量存储在设备存储器56中。在某个PEG序列的馈送区域274中,变量被按照它们将被该PEG序列取得的顺序而存储。注意,可以将给定变量沿着馈送区域存储在两个或更多个不同位置,这是由于PEG序列因高速缓存大小有限而可能重新读取变量。也应注意,每个PEG序列在设备存储器56中具有一个相应的馈送区域。给定变量可被存储在不同的PEG序列中的多个馈送区域。
通常,预排列的变量以符合所述GPU的存储器对齐和尺寸规格的基本部分的形式而被安置在设备存储器中。这些部分在此称为高速缓存行。在一个典型的GPU中,每个高速缓存行包括512比特。通常,不同序列中的PEG以高速缓存行为单位产生、消耗和交换变量。
SID间和SID内通信
如上文所解释,所述编译器将每个依赖性子树转换成一个SID。在某些实施方案中,由一个SID中的一个PEG产生的变量,被另一个SID中的一个PEG用作输入。在不同SID中的PEG之间的通信通常是经由设备存储器56实现的。在某些实施方案中,所述编译器存储了通过被称为邮箱的数据结构而在SID之间通信的变量。每个邮箱包括由公共PEG序列生成和/或使用的变量。在SID之间的通信是通过将高速缓存行写入邮箱或是从邮箱读取高速缓存行来实现的。因此,通过利用不同变量之间的用途和生成共性,有效率地实现了对设备存储器56的访问。
图12是示意性地示出了根据本发明的一个实施方案的多个SID的图解。本实例示出了两个SID,表示为SID-X和SID-Y。SID-X包括两个PEG序列,每个都包括四个PEG280。SID-Y包括两个PEG序列,每个都包括两个PEG280。每个PEG接受最高达三个输入变量(其在该PEG的相应的块的左手侧示出)作为输入,并且产生一个输出变量(其在该PEG的相应的块的右手侧示出)。例如,在SID-X中的PEG1/1,接受变量A和C作为输入,并且生成变量D。在每个SID之内也可存在序列间的一些依赖性,例如在SID-X中在PEG2/3和PEG1/4之间。
某些变量被定义为入口变量和出口变量,也即,分别地,从CPU(或其他主机环境)输入的变量,和输出到CPU(或其他主机环境)的变量。在本实例中,入口变量包括变量A、B、C、F和Q。出口变量包括变量S、G、H和P。
在一个给定SID中,所述变量可被分类成生成的变量(其由SID生成),已使用的变量(其被SID中的PEG用作输入)和输入变量(其被SID中的PEG用作输入,但却不是在该SID中内部产生的)。在不同的类别之间有时可存在重叠。在此实例中,变量分类在下表中示出:
图13是示意性地示出了根据本发明的一个实施方案的用于SID间通信的一种方法的流程图。在SID间识别步骤284,该方法以该编译器识别一个SID间变量的集合为开始。SID间变量包括那些既不是入口变量也不是出口变量而且将要在不同SID之间交换的变量。该编译器可通过如下方式识别SID间变量:(1)识别所有SID的所有输入变量的集合,以及(2)从该集合中除去入口变量和出口变量。在本实例中,SID X和SID Y的输入变量的集合是{A,B,C,E,F,M,L,Q,N,V,P},入口变量的集合是{A,B,C,F,Q}而出口变量的集合是{S,G,H,P}。于是,SID间变量的集合是{E,M,L,N,V}。
然后,在用途/生成映射步骤288,所述编译器将SID间变量按照它们的用途和生成由不同SID的不同PEG序列映射。在当前实例中,不同的SID间变量的用途与生成在下表中给出:
例如,其中M→(X1)表示变量M是由SID-X中的序列1所生成。通常,给定的SID间变量可被属于任意期望数量的SID的任意期望数量的序列所生成和/或使用。
在分组步骤292,所述编译器接着将由公共序列生成的和由公共序列使用的SID间变量分组到一起。对于每个这样的组,编译器定义了一个数据结构,称为“邮箱”。邮箱被存储在设备存储器56的某一区域中。每个邮箱通常包括一个或多个高速缓存行。在当前实例中,所述编译器可定义下列四个邮箱:
在SID间通信步骤296,在运行时间,不同的SID通过向邮箱写高速缓存行和从邮箱读高速缓存行来彼此通信。由于每个邮箱包括由同样的序列生成的并且被同样的序列使用的SID间变量,因此对设备存储器56的访问是有效率的。
邮箱机制的效率至少部分地依赖于,在每个SID内从PE到PEG序列的分配。如上图8中所解释,编译器试图将与其他SID中的相同的PE通信的PE分组在同一PEG序列中。如果这一分组是成功的且定义明确的,图13的方法将产生相对小且定义明确的邮箱组,其中每个邮箱包含相对大数量的变量。
在某些实施方案中,编译器可以通过根据PEG序列请求变量的顺序,排列每个邮箱内部的变量,从而进一步改进访问设备存储器56的效率。
在某些实施方案中,在同一SID内的不同PEG序列可向彼此传递变量。这一通信形式在本文中被称为SID内通信。在同一SID内的PEG序列通常通过经由设备存储器56交换包含了变量值的高速缓存行来通信。SID内通信通常受到变量有效性的约束。也就是说,仅当产生该变量的PEG已经完成执行之后,某一PEG序列可向另一序列传递一个变量。在某些实施方案中,所述编译器以(在高速缓存行解析中)保留执行依赖性和最小化事务的数量的方式定义在PEG序列之间的通信事务。SID内通信通常是经由在序列之间引入的SYNC元而实现的。也就是说,SYNC元——它暂停执行一个序列直到其他序列中的一个或多个PEG完成执行为止——也可以从所述其他序列向被暂停的序列传递变量。
图14A和14B是示意性地示出了根据本发明的一个实施方案的SID内通信方案的图解。图14A示出具有3个PEG序列的示例SID。对于每个PEG,在PEG块的左手侧示出了输入变量,而在该块的右手侧示出了输出变量。
图14B示出了四个高速缓存行300,其被该编译器定义,用于在图14A的SID中的PEG序列之间传递变量。经过每个高速缓存行的变量在图中用括号标出。该编译器可使用任何适当的方法,诸如各种不同的动态编程技术,来定义高速缓存行300。通常,该方案不是唯一的,且多个方案均是可行的。该编译器试图识别出满足预定标准——例如最小化高速缓存行300的数量——的方案。
用于增进SID间通信效率的技术
如上所述,在不同SID之间交换SID间变量,是通过将变量存储在设备存储器56中的邮箱中而实现的。每个邮箱包括一个或多个高速缓存行,且关联于由一个或多个源执行序列组成的集合(在一个或多个源SID中)以及由一个或多个目标执行序列组成的集合(在一个或多个目标SID中)。通常,SID间变量被指派给邮箱,以使得(1)由相同的SID集合以及执行序列所生成和使用的变量,被指派给同一邮箱,(2)未由相同的SID集合以及序列所生成和使用的变量被指派给分立的邮箱,以免共享相同的高速缓存行,且(3)每个变量在全部邮箱中仅出现一次。
然而,在某些情况下,SID变量间的生成和使用并不能够将变量有效率地分组成邮箱。这样的分组可能产生具有少量变量的邮箱。由于设备存储器是以高速缓存行为单位读取的,并不考虑高速缓存行中的变量的实际数量,因此具有较少变量的邮箱会导致低的高速缓存行利用率。
在某些实施方案中,所述编译器结合两个或更多个来自“充填稀疏”邮箱的SID间高速缓存行,以产生“充填稠密”的高速缓存行。通过合并高速缓存行,可减少来自设备存储器的加载操作。减少的程度取决于待要被合并的高速缓存行的选择。例如,该编译器可能试图合并在目标执行序列的集合中具有相对大的重叠的SID间高速缓存行。
例如考虑,被序列S1和S2所使用的高速缓存行A,以及由序列S1、S2和S3所使用的高速缓存行B。同样假设高速缓存行A和B足够稀疏,从而有可能将它们合并成新的高速缓存行C而不超过高速缓存行的大小限制。在这一实例中,在合并A和B以形成高速缓存行C之后,序列S1和S2均将仅需要加载一个高速缓存行(合并的高速缓存行C)而不是两个高速缓存行。序列S3仍将需要加载单个高速缓存行(高速缓存行C而不是高速缓存行B)。总的来说,合并高速缓存行A和B的结果是,设备存储器的加载操作减少了。在替代的实施方案中,所述编译器可合并任意期望数量的高速缓存行。
替代地,该编译器可使用SID内通信机制(即,使用序列间的同步元),将那些能够在目标SID内的目标执行序列之间传输其变量的SID间高速缓存行合并。下面进一步详述了,利用较少使用的SID内通信资源来改进SID间通信的概念。例如考虑三个执行序列S1、S2和S3以及三个高速缓存行A、B和C的配置。在此实例中,序列S1具有来自高速缓存行A的输入变量,序列S2具有来自高速缓存行B的输入变量,而序列S3具有来自高速缓存行C的输入变量。同样假设在序列之间的同步机制允许了从序列S1到序列S2的数据传递。在序列S2之内,来自高速缓存行B的输入变量仅被放置在与序列S1的同步之后的PEG所需要。在此情况下,将高速缓存行A和高速缓存行B合并,并通过在序列S1和序列S2之间的同步机制传递高速缓存行B的变量,是有利的。当使用这样的方案时,序列S2不需要加载高速缓存行B,因为序列S2通过该同步机制从序列S1接收其变量。从而,所述编译器可以通过以下方式来减少加载操作的数量:(1)将由不同目标序列所使用的高速缓存行合并,和(2)使用SID内通信将变量从一个目标序列传递到另一个目标序列。
无论SID间高速缓存行是被合并与否,所述编译器均可通过利用较少使用的SID内通信资源来减少来自设备存储器的SID间高速缓存行加载操作的数量,如下面的说明书中所解释。
图15是示意性地示出了根据本发明的一个实施方案的既使用SID间通信又使用SID内通信的SID310的图解。SID310通过加载SID间高速缓存行314,从另一个SID接收SID间变量。在当前实例中,来自高速缓存行314的SID内变量被SID310中的三个执行序列318A...318C所使用。(SID310完全可以包括另外的不使用来自此SID间高速缓存行的变量的执行序列。)
在不使用SID内资源来传递SID间变量的情况下,三个序列318A...318C中的每一个为获得其输入变量均将需要分别从设备存储器56中的适当的邮箱来加载高速缓存行314。从而,将需要三个分立的加载操作。替代地,高速缓存行314可仅被所述序列的一个子集(例如,被单个序列)所加载,而其他序列可使用SID内通信接收所述变量。
在SID310中,例如,SYNC326A将序列318B中的某一个PEG同步到序列318A中的某一个PEG,且SYNC326B将序列318C中的某一个PEG同步到序列318B中的某一个PEG。每个SYNC都和一个SID内高速缓存行相关联,所述SID内高速缓存行依赖于所述SYNC,且从一个或多个使同步(synchronizing)序列到一个或多个被同步(synchronized)序列(或者,更准确地,从一个或多个使同步PEG到被同步PEG)传递变量。例如,SYNC326A与一个将变量从序列318A传递到序列318B的SID内高速缓存行相关联。
假设SID内高速缓存行具有自由的未分配带宽,它们可被用于将数据从序列318A传递到序列318B,以及从序列318B传递到序列318C。因此,在某些情况下,所有三个序列318A…C可通过如下方式获得SID间高速缓存行314的变量:使得只有序列318A从设备存储器实际加载高速缓存行,然后通过依赖于SYNC326A和326B的SID内高速缓存行将所述变量传递给序列318B和318C。
注意,假定在给定序列中,使用SID间变量的PEG被定位在SYNC之后,其中该SYNC的SID内高速缓存行被用于将变量传递给该序列,那么这一解决方案是可行的。序列318A中的PEG322A可访问SID间变量,因为序列318A是实际加载了来自设备存储器56的SID间高速缓存行的序列。在序列318B中,PEG322B可访问已传递的变量,因为它被定位在SYNC326A之后。在序列318C中,PEG322D可访问已传递的变量,因为它被定位在SYNC326B之后。另一方面,PEG322C不能访问已传递的变量,因为它被定位在SYNC326B之前。
如果PEG322C需要使用来自SID间高速缓存行314的变量,那么序列318C需要独立加载这一SID间高速缓存行,这导致另一个加载操作。在这一情况下,SYNC326B的SID内高速缓存行将不会被用于从SID间高速缓存行314传递变量。
在某些实施方案中,所述编译器试图通过在SID内SYNC上指派用于载运SID间变量的可用的资源,来减少由给定SID执行的SID间高速缓存行加载操作的数量。这一过程通常是针对每个SID执行的。在下面的图16和图17描述了此类型的一个示例过程。然而,替代地,可使用任何其他适当的过程。
图16和17的过程使用两个被表示为F和P的函数。对于给定执行序列s和SID间变量a,函数F(s,a)是一个静态函数,其返回序列s中的使用变量a作为输入的第一输入项(PEG)。也就是说,变量a应不晚于F(s,a)而被提供给序列s的共享存储器。如果变量a未在序列s中的任何位置用作输入,那么F(s,a)=∞。
函数P(s_seq,s_off,t_seq,t_off,req_size)通过该SID返回一个路径的集合(一条或多条),给定大小req_size的数据可通过这些路径从源序列s_seq传递到目标序列t_seq。返回的路径自源序列的偏移s_off或更晚处开始,并且在t_off或更早处到达目标序列。函数P在编译期间可响应于SID内通信资源的分配而改变。在某些实施方案中,P还接收需要在t_off使用的一个变量数组。函数P通常考虑到所述变量中的某些已经通过序列之间的同步而传递。在某些实施方案中,P返回了可被用于数据传递的多个路径的组合。
该过程还使用了一个表示为H的数据库。对于由该SID使用的每个SID间高速缓存行,数据库H将使用这一高速缓存行的序列分类成几个类。所述类通常是由各自的列表来表示的。在当前实例中,所述序列被分成六类:
·必须加载(ML):因为不能通过SID内同步接收SID间变量,而必须从设备存储器56加载高速缓存行的序列。
·应当加载(SL):即使不是ML序列,仍然被该过程要求以从设备存储器56加载高速缓存行的序列。
·放置(PL):待要从其他序列接收SID间变量而不加载高速缓存行,且已经在SID内高速缓存行上为其分配了适当的资源的序列。
·根依赖(RD):尚未被指派给SL、ML或P类,且可被SL、ML或PL类中的至少一个序列经由SID内高速缓存行而到达的序列。
·远依赖(FD):不能被SL、ML或PL类中任意序列到达的序列。
·未解析(U):其类尚未被解析的序列。(在FD类与U类之间的区别在于,FD类中的序列可从RD类或FD类中的序列到达,但仍不可从SL类、ML类或PL类中的序列到达。)
下面的说明涉及了给定的SID间高速缓存行,其具有相关的将序列分成类的分类。下面描述的过程通常对于每个SID间高速缓存行是重复的。
在任意给定时间,每个类可包括任意数量的序列,但一个给定序列只可以出现在一个类中。如上所示,只有使用来自正被讨论的SID间高速缓存行的变量的序列被分类。图16和17的过程是迭代过程,其以U类中的所有序列为开始。(通常,U类起初仅仅包括使用由正被讨论的SID间高速缓存行载运的变量的序列。其他序列通常被忽略。)该过程以U类为空结束,所有序列均指派为SL类、ML类或P类。当该过程结束时,ML类和SL类中的每个序列被定义为单独地加载SID间高速缓存行,而在P类中的序列被定义为接收来自其他序列的SID间变量而不加载高速缓存行。SID内SYNC的适当资源被指派,以将SID间变量传递给P类中的序列。
图16是示意性地示出了根据本发明的一个实施方案的用于减少SID间通信的方法的状态图330。状态图330包括状态334、338、342、346、348和350,分别代表了U、ML、SL、P、RD和FD类。在状态之间的转变由图中的箭头标出。这一迭代分配过程通过这些转变将序列类到类移动(从状态到状态),直到U类为空且所有序列到达ML、SL或P类为止。
图17是示意性地示出根据本发明的一个实施方案的用于减少SID间通信的方法的流程图。(通常为每个SID间高速缓存行重复这一过程。)在初始化步骤360,该方法以编译器初始化数据库H作为开始。当前处理的SID间高速缓存行被表示为c。对于使用高速缓存行c的每个序列s(也即,满足F(s,c)≠∞的序列),该编译器将该序列加至U类。
然后在解析步骤364,该编译器试图解析高速缓存行c,也即,使用函数S和P对U中的序列分类。
解析步骤包括了相继执行的几个阶段,如下:
1)ML解析阶段:对于U类中的每个序列s,所述编译器核对由序列s所使用的高速缓存行c的变量是否可从使用此高速缓存行的另一序列获得。(使用函数F来识别用于提供所述变量的可能序列。使用函数P来识别用于传递所述变量的可能路径。)如果没有找到用于获得到序列s的变量的序列和路径,所述编译器从U类移除序列s,并且将它加至ML类。
2)RD解析阶段:对于U类中的每个序列s,所述编译器(使用F和P)识别能够从ML、SL或PL类中的一个序列获得它们从高速缓存行c需要的变量的序列。所述编译器将识别的序列从U类移除,并将它们加至RD类。
3)该编译器重复接下来的三个子阶段,直到U类为空为止:
a)RD子阶段:使用函数F和P,所述编译器识别能够从SL类中的一个序列获得它们从高速缓存行c需要的变量的序列。编译器从U类移除这些序列并且将它们加到RD类。
b)FD子阶段:使用函数F和P,该编译器识别能够从RD或FD类中的一个序列获得它们从高速缓存行c需要的变量的序列。该编译器从U类移除这些序列,并且将它们加到FD类。如果找到了至少一个序列,则重复FD子阶段。
c)SL子阶段
该过程的这一阶段识别和解析在两个或更多个所述序列之间的循环依赖方向图。循环依赖的一个详细实例在上面引用的美国临时专利申请61/185,609的10.3.1.2.4章节得以描述。
1.所述编译器在高速缓存行c的U类列表中选择一个序列s。表示为req_offset的一个变量被设置为F(s,c)。
2.使用函数P,所述编译器扫描在U类中的序列(除了序列s以外),并且在不晚于req_offset的一个偏移处,试图识别能够提供被序列s所需要的高速缓存行c的变量的源序列。
3.如果找到了源序列ss,则s被设置为s=ss,且req_offset被设置为使得高速缓存行c为可用的ss需要有的偏移。该过程循环回到上述步骤2。
4.如果未找到所述源序列,该编译器将序列s从U类移除并将其加到SL类。
在完成解析步骤364之后,对于给定的SID间高速缓存行c,U类为空,且使用高速缓存行c的序列被分类成ML、SL、RD和FD类。在ML和SL类中的序列被定义为单独地从设备存储器56加载高速缓存行c,而这一定义将不会被该过程的后继迭代所改变。
现在,在放置步骤368,所述编译器试图分配SID内资源,以便将SID间变量提供给RD类中的序列。通常,只要在数据库H中的任一RD类列表中仍然剩余有序列,所述编译器就为给定SID间高速缓存行c执行下列过程:
1)所述编译器从高速缓存行c的RD类的序列中选择具有其从该高速缓存行需要的最小数据大小的序列s。该编译器(使用函数P)选择一个路径p(或多个路径的组合),其使用最少量的SID内高速缓存行资源来将所需要的变量从已经具有这些变量的序列传递到序列s。注意,如果路径p遍历了多于一跳(也即,通过一个或多个中间序列到达序列s),则沿着该路径在这多个SID内高速缓存行上的资源应被纳入考虑。
2)如果没有找到适当的路径p,则步骤368终止。
3)如果找到了适当的路径p,则所述编译器从RD类中除去序列s,并将其加到PL类。
4)该编译器通过路径p提交(分配)SID内高速缓存行的用途,以传输被序列s需要的高速缓存行c的SID间变量。该编译器刷新函数P以反映由于新分配的资源而在可能的路径中的可能的改变。
在此阶段,所述编译器通常把SID内通信资源提交给RD类中的某些序列,并且因此将它们移动到PL类。对于留在RD类中的序列,所述编译器未成功找到具有可用资源的路径来为这些序列提供必要的SID间变量。
在重新洗牌步骤372,现在所述编译器对RD类和FD类中的序列进行重新洗牌。在此步骤中,所述编译器将RD和FD类中的所有序列(如果有剩余)移动到U类。在核对空步骤376,所述编译器核对U类是否为空。如果在U类中仍然剩有序列,该方法循环回到上面的步骤364,且该编译器继续尝试解析当前未解析的序列。如果U类为空,则所有序列被分类到ML、SL或PL类,且该方法在终止步骤380终止。ML类和SL类中的每个序列将单独地从设备存储器加载SID间高速缓存行。
通过由一个或多个SID内高速缓存行组成的预定义的和预提交的路径,PL类中的每个序列均将从其他序列接收必要的SID间变量。从而,当使用该技术时,减少了来自设备存储器56的SID间高速缓存行加载操作的数量,且从而减少了SID总执行时间。
示例依赖性问题应用
本文所述的方法和系统在许多领域和应用中可被用来解决依赖性问题。一般地,任何可被表示为具有执行依赖性的一个处理元(PE)集合的计算任务,均可使用所公开的技术而有效率地并行化和执行。下面的说明勾勒了依赖性问题的几种示例性类型。所公开的技术绝不限于这些实例,而是可被用来解决任何其他适当类型的依赖性问题。
在某些实施方案中,由系统20解决的依赖性问题包括一个通过仿真来验证硬件设计的任务。该申请在上面引用的PCT申请PCT/IL2009/000330中被详细论述。在通常的设计验证应用中,图1的服务器24从用户,例如验证工程师处接收待要被仿真的设计的定义。该设计通常作为一个或多个以硬件描述语言(HDL)例如VHDL或Verilog写成的文件而被接收。服务器也接受测试台定义,该定义规定了该设计的验证环境。所述测试台规定了待要被应用到该设计的外部异步事件(例如,时钟信号、重置信号和各种不同输入)。测试台也规定了待要被应用到仿真的设计的测试。该测试台通常包括用C、Verilog或用验证专用语言诸如E或System-Verilog写成的软件。
在CPU28上运行的编译器编译所述测试台和设计以产生仿真代码,然后在CPU28和GPU32上运行该仿真代码。具体地,所述编译器将所述设计和测试台表示成具有PE和依赖性的依赖性图,从该依赖性图中提取非循环的子图,并且为每个子图生成一个SID。然后该GPU被调用,以执行不同的SID,以产生仿真结果。仿真结果(例如,关于下列的报告:已经通过的测试和已经失败的测试,怀疑的故障,故障位置,和/或在验证该设计方面可辅助用户的任何其他信息)被提供给用户。
替代地,本文描述的方法和系统可被用于执行在例如实时视频处理、图像处理、软件定义的无线电(SDR)、在各种通信应用中的包处理和纠错编码等应用中遇到的计算任务。所有这些应用通常涉及可被表示成依赖性问题的复杂的计算任务,例如,数字滤波以及快速傅立叶变换(FFT)计算。这样的任务自身适于用本文所描述的方法和系统进行并行化和解决。在下面的图18和19中示出了使用依赖性图表示数字滤波器和FFT计算单元的具体实例。一旦一个给定计算任务(例如,本文给出的实例或任何其他任务)被表示为依赖性图,即可使用此处描述的方法和系统对其进行并行化和解决。如上所述,所述依赖性图可被转换成一组子图,每个子图都被编译以产生一个SID,而所述GPU执行这些SID以产生一个结果。
图18是示意性地示出了根据本发明的一个实施方案的表示了有限脉冲响应(FIR)数字滤波器的依赖性图400的图解。由图400所表示的数字滤波器通过表示为a0,…,aN-1的一组N个滤波器系数而将输入信号x[n]滤波,以产生一个已滤波的输出信号y[n]。滤波运算是由下式给出的:
此类的FIR滤波器在许多信号处理应用中都常见,诸如在通信接收机和发射机、图像处理应用和医学成像应用中。
图400包括几类PE,例如,被同步到公共时钟信号的触发器PE410,乘法器PE414以及加法器PE418。执行依赖性在图中被示为箭头。例如,在给定的时钟周期中,给定的乘法器PE414仅当所述触发器PE完成执行且其输出有效之后,才可以将给定触发器PE410的输出乘以相应的滤波器系数。其他种类的数字滤波器,诸如无限脉冲响应(IIR)滤波器,也可被以相似方式表示为依赖性图。
图19是示意性地示出了根据本发明的一个实施方案的表示快速傅立叶变换(FFT)计算单元的依赖性图420的图。FFT计算,如本领域所公知,可以通过一系列基础计算单元——其有时被称为“蝶形”——来有效率地执行。依赖性图420表示了单个计算单元。在典型的FFT应用中,多个这样的计算单元被串联和/或并联。依赖性图420包括加法器/乘法器PE424。每个PE424接受两个输入。当某个PE输入被标以权重WNK时,该PE将该输入乘以该权重,然后将其加到其他输入。例如,图左上方的PE产生了一个输出,由v[0]+v[l]·W4 0给出。WN K由WN K=e(i2πK/N)给出。在N=4的一个典型实施方式中,所述权重由W4 0=1,W4 1=i,W4 2=-1和W4 3=-i给出。替代地,可以使用任何其他适当的权重值。此类的FFT计算单元常见于多种应用中,诸如频域信号处理和纠错编码(ECC)。
另外的实施方案以及变体
在某些实施方案中,所述编译器应用了一个试图将PE合并成PEG的过程。这一过程的输出是一个包括了顶点(表示了PEG)和边(表示了PEG间依赖性)的图。该过程通常试图通过将PEG间依赖性的数量最小化的方式,将PE分组成PEG。一个此类分组通常导致一个具有较少序列间SYNC的SID。一个示例的合并过程在上面引用的美国临时专利申请61/110,676的章节5.5.1中描述。
在某些实施方案中,所述编译器试图沿着PE执行时间前进而迭代地构建所述SID。在这一过程中,所述编译器首先放置具有长的前向段(FP)的PE,然后将它们放置在不那么充填密集的执行序列中。此外,所述编译器对于在不请求添加SYNC的序列中放置PE给出较高的优先级。一个示例的SID生成过程在上面引述的美国临时专利申请61/110,676的章节6.3.6中得以描述。通常,所述编译器基于任何其他将PE的FP长度、执行序列的占用程度和/或可能的SYNC添加纳入了考虑的标准或启示,而将PE放置在执行序列中。
在某些实施方案中,CPU和GPU共同地运行一个事件驱动(EDE)仿真器,其仿真了该依赖性问题。事件驱动操作在上面引用的美国临时专利申请61/079,461的章节6.8中得以描述,且在上面引用的美国临时专利申请61/086,803的章节5.1-5.3中得以描述。具体地,所述编译器可以将执行某一个SID将会触发另一个SID执行的情况识别为,需要对在CPU上运行的仿真立即更新。这一方案节省了在GPU和CPU之间的交互的时延。这一技术例如在上面引用的美国临时专利申请61/086,803的章节5.2.1中得以描述。
应理解,上面的实施方案是以举例方式引用的,且本发明不限于在上文已具体示出和描述的内容。相反地,本发明的范围包括了此处描述的各种不同特征的组合与子组合以及变体和修改,所述变体和修改对于本领域技术人员而言在阅读前文说明书之后将为显然,并且未在现有技术中公开。
Claims (80)
1.一种用于执行依赖性问题的计算方法,包括:
接受计算任务的定义,该计算任务包括具有执行依赖性的多个原子处理元PE,每个执行依赖性规定了在执行一个相应的第二PE之前要执行一个相应的第一PE;
在一个包括多个执行序列的调用数据结构中布置所述PE,每个执行序列包括有序的PE序列使得该执行序列中的、根据依赖性将要在该执行序列中的其它PE之前被执行的PE位于该执行序列中的所述其它PE之前,并且其中所述执行序列中的至少一个包括依赖于其它执行序列中的PE的一个或多个PE;以及
调用多处理器设备以运行软件代码,所述软件代码响应于所述调用数据结构而在所述多处理器设备包括的多个处理器上并行地执行所述执行序列,以产生所述计算任务的结果,每个处理器执行所述执行序列中的一个或多个。
2.根据权利要求1所述的方法,其中所述计算任务包括对一个设计进行验证的任务。
3.根据权利要求1所述的方法,其中所述计算任务包括下列之一:信号处理任务、图像处理任务、包处理任务和纠错编码ECC任务。
4.根据权利要求1所述的方法,其中所述多处理器设备包括图形处理单元GPU。
5.根据权利要求1所述的方法,其中所述多处理器设备包括选自由下列组成的一组类型中的至少一个设备类型:数字信号处理器和多核中央处理单元CPU。
6.根据权利要求1所述的方法,包括将每个执行序列中的PE分组成PE组PEG。
7.根据权利要求1所述的方法,其中所述多处理器设备根据内建调度策略调度所述PE以用于由所述多个处理器执行,且其中调用所述多处理器设备包括使得所述多处理器设备并行地执行第二数量的执行序列,如同布置在调用数据结构中,而与所述内建调度策略无关。
8.根据权利要求1-7中任一所述的方法,其中所述多个处理器被分成组布置,每个组都被指派以执行提供给所述多处理器设备的一个或多个线程块,且其中调用所述多处理器设备包括提供每个执行序列作为待要被所述组中的一个组内的处理器执行的一个相应的线程块。
9.根据权利要求8所述的方法,其中每个所述组中的所述处理器访问一个相应的共享存储器,且其中编译所述计算任务包括使得一个给定执行序列中的PE通过被指派以执行该给定执行序列的一组处理器的共享存储器来交换数据。
10.根据权利要求1-7中任一所述的方法,其中在所述调用数据结构中布置所述PE包括:将所述PE布置进能由所述多处理器设备同时执行的多个序列中。
11.根据权利要求1-7中任一所述的方法,其中一个给定执行依赖性规定了使驱PE将在受驱PE之前被执行,且其中在所述调用数据结构中布置所述PE包括:在给定执行序列中将所述受驱PE放置在所述使驱PE之后。
12.根据权利要求1-7中任一所述的方法,其中一个给定执行依赖性规定了使驱PE将在受驱PE之前被执行,且其中在所述调用数据结构中布置所述PE包括:在第一执行序列中放置所述使驱PE,在不同于所述第一执行序列的第二执行序列中放置所述受驱PE,并且向所述第二执行序列中插入一个同步元,该同步元暂停所述第二执行序列的执行直到给定的所述使驱PE完全被执行为止。
13.根据权利要求1-7中任一所述的方法,其中布置所述PE包括从所述计算任务提取多个非循环子图,并且编译所述多个非循环子图以产生相应的多个调用数据结构。
14.根据权利要求1-7中任一所述的方法,其中在所述调用数据结构中布置所述PE包括,定义一个顺序:将按此顺序选择所述PE以放置在所述执行序列中,以及按此顺序用所述PE填充所述执行序列。
15.根据权利要求14所述的方法,其中所述定义一个顺序包括,为每个PE:
确定通向所述PE的一个最长的执行依赖性链的第一长度;
确定始自给定PE的一个最长的执行依赖性链的第二长度;
基于所述第一长度和所述第二长度,确定一个分配区间——其包括沿着所述执行序列的PE的可能的位置;以及
以所述分配区间的相应的长度的升序来排列所述PE。
16.根据权利要求15所述的方法,其中填充所述执行序列包括,将每个PE放置在所述多个执行序列中的一个中的相应的分配区间之内。
17.根据权利要求14所述的方法,其中所述定义一个顺序包括:
识别输出组,每个输出组包括两个或更多个PE——其驱动了相应的受驱PE;
识别输入组,每个输入组包括至少两个由一个相应的使驱PE所驱动的PE;
基于包含了每个PE的输出组和输入组的数量,为所述每个PE指派一个相应的组评分;并且
基于所述PE的组评分,定义所述顺序。
18.根据权利要求1-7中任一所述的方法,其中在所述调用数据结构中布置所述PE包括:对于一个给定PE以及所述执行序列中的一组可能的位置,计算由将所述给定PE放置在所述可能的位置而导致的相应的分配成本;以及将所述给定PE放置在所述可能的位置中的具有最低分配成本的一个位置。
19.根据权利要求18所述的方法,其中计算所述分配成本包括,根据选自下列因素组成的一组因素中的至少一个因素,估计给定执行序列中的一个给定的可能的位置的分配成本:
由将所述给定PE放置在所述给定的可能的位置而导致的所述调用数据结构的执行时间的增加;
在所述给定执行序列中的、和所述给定PE共享一个公共使驱PE的PE的第一数量;
在所述给定执行序列中的、和所述给定PE共享一个公共受驱PE的PE的第二数量;
在所述给定执行序列中的、和所述给定PE共享一个公共执行依赖性的PE的第三数量;以及
距为所述给定PE计算的最佳位置的距离。
20.根据权利要求1-7中任一所述的方法,其中在所述调用数据结构中布置所述PE包括,将所述PE以线程束布置在每个执行序列中,每个线程束包括给定类型的一个或多个PE。
21.根据权利要求1-5和7中任一所述的方法,其中布置所述PE包括,对于给定执行序列,定义将变量从所述多处理器设备的设备存储器取到高速缓存的确定性高速缓存模式,并且在执行所述给定执行序列期间将所述变量中的至少一些从所述高速缓存丢弃,并且使得所述多处理器设备在执行所述给定执行序列时实现所述确定性高速缓存模式。
22.根据权利要求21所述的方法,其中所述给定执行序列中的PE被分组成PE组PEG,且其中定义所述高速缓存模式包括:
对于在给定PEG的执行期间存在于所述高速缓存中的每个变量,识别所述给定执行序列中将使用该变量的相应的下一个PEG;
一旦在执行所述给定PEG之后需要从所述高速缓存丢弃一个或多个变量时,选择该一个或多个变量中的一个变量,所选择的变量的相应的下一个PEG具有沿着所述给定执行序列的距所述给定PEG最大的距离;并且
在所述高速缓存模式中定义,在执行所述给定PEG之后丢弃所选择的变量。
23.根据权利要求21所述的方法,其中定义所述高速缓存模式包括,在单个取命令中合并对两个或更多个变量的取操作。
24.根据权利要求23所述的方法,其中合并所述取操作包括:为每个变量沿着所述给定执行序列定义一个取区间,所述取区间自当该变量变得有效之时开始,至当该变量首次被使用时结束;以及定义所述单个取命令以包括至少两个其相应的取区间有重叠的变量,并且将所述单个取命令放置为在所述重叠期间发生。
25.根据权利要求24所述的方法,其中合并所述取操作还包括,通过识别如下给定变量:在所述单个取命令的位置和该给定变量首次被使用的时间之间具有最小距离,来选择待要被合并到所述单个取命令中的给定变量。
26.根据权利要求21所述的方法,其中定义所述高速缓存模式包括,在单个存储命令中合并对两个或更多个变量的存储操作。
27.根据权利要求21所述的方法,其中所述给定执行序列的确定性高速缓存模式以给定顺序从所述设备存储器取变量,且其中编译所述计算任务包括,根据所述给定顺序以连续的地址将所述变量预排列在所述设备存储器中。
28.根据权利要求1-7中任一所述的方法,其中布置所述PE包括,通过访问所述多处理器设备的设备存储器,使得第一执行序列提供一个或多个变量作为输入给第二执行序列。
29.根据权利要求1-7中任一所述的方法,其中布置所述PE包括:产生多个调用数据结构,所述多个调用数据结构中的每个调用数据结构包括一个或多个执行序列;以及使得所述执行序列中的至少一些执行序列通过访问所述多处理器设备的设备存储器而在不同的调用数据结构之间交换变量。
30.根据权利要求29所述的方法,其中在所述不同的调用数据结构之间交换的每个变量都由一个或多个源执行序列所产生,并被一个或多个目标执行序列所使用,且其中编译所述计算任务包括,根据所述源执行序列和所述目标执行序列将所述变量聚合成组,并且将每个组以连续的地址存储在所述设备存储器中。
31.根据权利要求30所述的方法,其中使得所述执行序列交换所述变量包括,使得所述执行序列以读命令从所述设备存储器读所述变量,每个读命令从所述变量聚合成的所述组之一读取预定大小的数据。
32.根据权利要求31所述的方法,还包括,当两个或更多个组中的变量联合起来未超过所述预定大小时,定义一个从所述两个或更多个组读取所述变量的合并的读命令。
33.根据权利要求29所述的方法,还包括,当在一个给定调用数据结构中的多个执行序列的一个集合使用一组变量时,仅仅使得所述多个执行序列的一个部分子集从所述设备存储器读取所述一组变量,并且将所述变量传递给该集合中的其他的执行序列。
34.根据权利要求33所述的方法,其中使得所述执行序列的部分子集传递所述变量包括,识别该集合中不能从该调用数据结构中的其他执行序列接收所述变量的至少一个执行序列,并且将所识别的序列添加到所述部分子集。
35.根据权利要求33所述的方法,其中使得所述执行序列的部分子集传递所述变量包括,识别所述给定调用数据结构中的同步元——其将所述部分子集连接到所述集合中的其他执行序列,并且分配与所述同步元相关联的通信资源以便传递所述变量。
36.根据权利要求1-7中任一所述的方法,其中布置所述PE并且调用所述多处理器设备包括,运行一个事件驱动仿真——其仿真了所述计算任务。
37.根据权利要求1-7中任一所述的方法,其中在所述调用数据结构中布置所述PE包括,根据选自下列因素组成的一组因素中的至少一个因素,将所述PE放置在所述执行序列中:
始自所述PE的相应的最长的执行依赖性链的长度;
执行序列的相应的占用程度;以及
由对所述PE的放置而引起的同步元。
38.根据权利要求10所述的方法,其中布置所述PE包括以最小化最长执行序列的长度的方式进行布置。
39.一种用于执行依赖性问题的计算方法,包括:
提供多处理器设备,该多处理器设备包括能够同时执行最多达第一数量的处理元的多个处理器,并具有用于调度过程以用于执行的内建调度策略;
接受计算任务的定义,该计算任务包括具有执行依赖性的第二数量的多个原子处理元PE,每个执行依赖性规定了在执行一个相应的第二PE之前要执行一个相应的第一PE,其中所述第二数量大于所述第一数量;
通过在一个包括数量小于所述第一数量的多个执行序列的调用数据结构中不与所述执行依赖性冲突地布置所述PE,编译所述计算任务以用于在所述多处理器设备上并发地执行;以及
调用所述多处理器设备以运行软件代码,所述软件代码响应于所述调用数据结构而并行地且无关于所述多处理器设备的调度策略地执行所述执行序列,以产生所述计算任务的结果。
40.一种用于执行依赖性问题的计算装置,包括:
一个接口,被连接以接受计算任务的定义,该计算任务包括具有执行依赖性的多个原子处理元PE,每个执行依赖性规定了在执行一个相应的第二PE之前要执行一个相应的第一PE;以及
一个中央处理单元CPU,所述中央处理单元被布置为:通过在一个包括多个执行序列的调用数据结构中布置所述PE编译所述计算任务以用于在多处理器设备上并发地执行,所述多处理器设备包括能够同时地执行第一数量的PE的多个处理器,每个执行序列包括有序的PE序列使得该执行序列中的、根据依赖性将要在该执行序列中的其它PE之前被执行的PE位于该执行序列中的所述其它PE之前,并且其中所述执行序列中的至少一个包括依赖于其它执行序列中的PE的一个或多个PE;以及,调用所述多处理器设备以运行软件代码,所述软件代码响应于所述调用数据结构而在多个处理器上并行地执行所述执行序列,以产生所述计算任务的结果,每个处理器执行所述执行序列中的一个或多个。
41.根据权利要求40所述的装置,其中所述计算任务包括对一个设计进行验证的任务。
42.根据权利要求40所述的装置,其中所述计算任务包括下列之一:信号处理任务、图像处理任务、包处理任务和纠错编码ECC任务。
43.根据权利要求40所述的装置,其中所述多处理器设备包括图形处理单元GPU。
44.根据权利要求40所述的装置,其中所述多处理器设备包括选自由下列组成的一组类型中的至少一个设备类型:数字信号处理器和多核中央处理单元CPU。
45.根据权利要求40所述的装置,其中所述CPU被布置为将每个执行序列中的PE分组成PE组PEG。
46.根据权利要求40所述的装置,其中所述多处理器设备根据内建调度策略调度所述PE用于由所述多个处理器执行,且其中所述CPU被布置为使得所述多处理器设备并行地执行第二数量的执行序列,如同布置在调用数据结构中,而与所述内建调度策略无关。
47.根据权利要求40-46中任一所述的装置,其中所述多个处理器被分成组布置,每个组都被指派以执行提供给所述多处理器设备的一个或多个线程块,且其中所述CPU被布置为提供每个执行序列给所述多处理器设备以作为待要被所述组中的一个组内的处理器执行的一个相应的线程块。
48.根据权利要求47所述的装置,其中每个所述组中的所述处理器访问一个相应的共享存储器,且其中所述CPU被布置为使得一个给定执行序列中的PE通过被指派以执行该给定执行序列的一组处理器的共享存储器来交换数据。
49.根据权利要求40-46中任一所述的装置,其中所述CPU被布置为,最小化所述调用数据结构中的最长执行序列的长度。
50.根据权利要求40-46中任一所述的装置,其中一个给定执行依赖性规定了使驱PE将在受驱PE之前被执行,且其中所述CPU被布置为在给定执行序列中将所述受驱PE放置在所述使驱PE之后。
51.根据权利要求40-46中任一所述的装置,其中一个给定执行依赖性规定了使驱PE将在受驱PE之前执行,且其中所述CPU被布置为,在第一执行序列中放置所述使驱PE,在不同于所述第一执行序列的第二执行序列中放置所述受驱PE,并且向所述第二执行序列中插入一个同步元,该同步元暂停所述第二执行序列的执行直到给定的所述使驱PE完全被执行为止。
52.根据权利要求40-46中任一所述的装置,其中所述CPU被布置为,从所述计算任务提取多个非循环子图,并且编译所述多个非循环子图以产生相应的多个调用数据结构。
53.根据权利要求40-46中任一所述的装置,其中所述CPU被布置为:定义一个顺序,将按此顺序选择所述PE以放置在所述执行序列中;以及,按此顺序用所述PE填充所述执行序列。
54.根据权利要求53所述的装置,其中所述CPU被布置为,为每个PE:
确定通向所述PE的一个最长的执行依赖性链的第一长度;
确定始自给定PE的一个最长的执行依赖性链的第二长度;
基于所述第一长度和所述第二长度,确定一个分配区间——其包括沿着所述执行序列的PE的可能的位置;并且以所述分配区间的相应的长度的升序来排列所述PE。
55.根据权利要求54所述的装置,其中所述CPU被布置为,通过将每个PE放置在所述多个执行序列中的一个中的相应的分配区间之内,来填充所述执行序列。
56.根据权利要求53所述的装置,其中所述CPU被布置为:
识别输出组,每个输出组包括两个或更多个PE——其驱动了相应的受驱PE;
识别输入组,每个输入组包括至少两个由一个相应的使驱PE所驱动的PE;
基于包含了每个PE的输出组和输入组的数量,为该每个PE指派一个相应的组评分;并且
基于所述PE的组评分,定义所述顺序。
57.根据权利要求40-46中任一所述的装置,其中所述CPU被布置为:对于一个给定PE以及所述执行序列中的一组可能的位置,计算由将所述给定PE放置在所述可能的位置而导致的相应的分配成本;以及将所述给定PE放置在所述可能的位置中的具有最低分配成本的一个位置。
58.根据权利要求57所述的装置,其中所述CPU被布置为,根据选自下列因素组成的一组因素中的至少一个因素,估计给定执行序列中的给定的可能的位置的分配成本:
由将所述给定PE放置在所述给定的可能的位置而导致的所述调用数据结构的执行时间的增加;
在所述给定执行序列中的、和所述给定PE共享一个公共使驱PE的PE的第一数量;
在所述给定执行序列中的、和所述给定PE共享一个公共受驱PE的PE的第二数量;
在所述给定执行序列中的、和所述给定PE共享一个公共执行依赖性的PE的第三数量;以及
距为所述给定PE计算的最佳位置的距离。
59.根据权利要求40-46中任一所述的装置,其中所述CPU被布置为,将所述PE以线程束布置在每个执行序列中,每个线程束包括给定类型的一个或多个PE。
60.根据权利要求40-44和46中任一所述的装置,其中所述CPU被布置为,对于给定执行序列,定义将变量从所述多处理器设备的设备存储器取到高速缓存的确定性高速缓存模式,并且在执行所述给定执行序列期间将所述变量中的至少一些从所述高速缓存丢弃,并且使得所述多处理器设备在执行所述给定执行序列时实现所述确定性高速缓存模式。
61.根据权利要求60所述的装置,其中所述给定执行序列中的PE被分组成PE组PEG,且其中所述CPU被布置为以如下方式定义所述高速缓存模式:
对于在给定PEG的执行期间存在于所述高速缓存中的每个变量,识别所述给定执行序列中将使用该变量的相应的下一个PEG;
一旦在执行所述给定PEG之后需要从所述高速缓存丢弃一个或多个变量时,选择该一个或多个变量中的一个变量,所选择的变量的相应的下一个PEG具有沿着所述给定执行序列的距所述给定PEG最大的距离;并且
在所述高速缓存模式中定义,在执行所述给定PEG之后丢弃所选择的变量。
62.根据权利要求60所述的装置,其中所述CPU被布置为在单个取命令中合并对两个或更多个变量的取操作。
63.根据权利要求62所述的装置,其中所述CPU被布置为:为每个变量沿着所述给定执行序列定义一个取区间,所述取区间自当该变量变得有效之时开始,至当该变量首次被使用时结束;以及定义所述单个取命令以包括至少两个其相应的取区间有重叠的变量,并且将所述单个取命令放置为在所述重叠期间发生。
64.根据权利要求63所述的装置,其中所述CPU还被布置为,通过识别如下给定变量:在所述单个取命令的位置和该给定变量首次被使用的时间之间具有最小距离,来选择待要被合并到所述单个取命令中的给定变量。
65.根据权利要求60所述的装置,其中所述CPU被布置为,在单个存储命令中合并对两个或更多个变量的存储操作。
66.根据权利要求60所述的装置,其中所述给定执行序列的确定性高速缓存模式,以给定顺序从所述设备存储器取变量,且其中所述CPU被布置为,根据所述给定顺序以连续的地址将所述变量预排列在所述设备存储器中。
67.根据权利要求40-46中任一所述的装置,其中所述CPU被布置为,通过访问所述多处理器设备的设备存储器,使得第一执行序列提供一个或多个变量作为输入给第二执行序列。
68.根据权利要求40-46中任一所述的装置,其中所述CPU被布置为,产生多个调用数据结构,所述多个调用数据结构中的每个调用数据结构包括一个或多个执行序列,以及使得所述执行序列中的至少一些执行序列通过访问所述多处理器设备的设备存储器而在不同的调用数据结构之间交换变量。
69.根据权利要求68所述的装置,其中在所述不同的调用数据结构之间交换的每个变量都由一个或多个源执行序列所产生,并被一个或多个目标执行序列所使用,且其中所述CPU被布置为,根据所述源执行序列和所述目标执行序列将所述变量聚合成组,并且将每个组以连续的地址存储在所述设备存储器中。
70.根据权利要求69所述的装置,其中所述CPU被布置为,使得所述执行序列以读命令从所述设备存储器读所述变量,每个读命令从所述变量聚合成的所述组之一读取预定大小的数据。
71.根据权利要求70所述的装置,其中当两个或更多个组中的变量联合起来未超过所述预定大小时,所述CPU被布置为,定义一个从所述两个或更多个组读取所述变量的合并的读命令。
72.根据权利要求68所述的装置,其中,当在一个给定调用数据结构中的多个执行序列的一个集合使用一组变量时,所述CPU被布置为,仅仅使得所述多个执行序列的一个部分子集从所述设备存储器读取所述一组变量,并且将所述变量传递给该集合中的其他的执行序列。
73.根据权利要求72所述的装置,其中所述CPU被布置为,识别该集合中不能从该调用数据结构中的其他执行序列接收所述变量的至少一个执行序列,并且将所识别的序列添加到所述部分子集。
74.根据权利要求72所述的装置,其中所述CPU被布置为,识别所述给定调用数据结构中的同步元——其将所述部分子集连接到所述集合中的其他执行序列,并且分配与所述同步元相关联的通信资源以便传递所述变量。
75.根据权利要求40-46中任一所述的装置,其中所述CPU被布置为,与所述多处理器设备一起,运行一个事件驱动仿真——其仿真了所述计算任务。
76.根据权利要求40-46中任一所述的装置,其中所述CPU被布置为,根据选自下列因素组成的一组因素中的至少一个因素,将所述PE放置在所述执行序列中:
始自所述PE的相应的最长的执行依赖性链的长度;
执行序列的相应的占用程度;以及
由对所述PE的放置而引起的同步元。
77.根据权利要求40-46中任一项所述的装置,其中所述CPU被配置为,将所述PE布置进能由所述多处理器设备同时执行的多个序列中。
78.一种用于执行依赖性问题的计算装置,包括:
一个接口,被连接以接受计算任务的定义,该计算任务包括具有执行依赖性的第二数量的多个原子处理元PE,每个执行依赖性规定了在执行一个相应的第二PE之前要执行一个相应的第一PE;以及
一个中央处理单元CPU,所述中央处理单元被布置为:
编译所述计算任务以用于在多处理器设备上并发地执行,所述多处理器设备包括能够同时执行最多达第一数量的处理元PE的多个处理器,并具有用于调度过程以由所述多处理器设备的所述处理器执行的内建调度策略,其中所述第一数量小于所述第二数量,并且其中所述编译包括在一个包括多个执行序列的调用数据结构中不与所述执行依赖性冲突地布置所述PE;以及
调用所述多处理器设备以运行软件代码,所述软件代码响应于所述调用数据结构而并行地且无关于所述多处理器设备的调度策略地执行所述执行序列,以产生所述计算任务的结果。
79.一种用于执行依赖性问题的计算装置,包括:
一个多处理器设备,包括能够同时执行第一数量的原子处理元PE的多个处理器;以及
一个中央处理单元CPU,所述中央处理单元被布置为:接受计算任务的定义,该计算任务包括具有执行依赖性的多个PE,每个执行依赖性规定了在执行一个相应的第二PE之前要执行一个相应的第一PE;通过在一个包括多个执行序列的调用数据结构中布置所述PE来编译该计算任务以用于在所述多处理器设备上并发地执行,每个执行序列包括有序的PE序列使得该执行序列中的、根据依赖性将要在该执行序列中的其它PE之前被执行的PE位于该执行序列中的所述其它PE之前,并且其中所述执行序列中的至少一个包括依赖于其它执行序列中的PE的一个或多个PE;以及,调用所述多处理器设备以运行软件代码,所述软件代码响应于所述调用数据结构而在多个处理器上并行地执行所述执行序列,以产生所述计算任务的结果,每个处理器执行所述执行序列中的一个或多个。
80.一种用于执行依赖性问题的计算装置,包括:
一个多处理器设备,包括并行运行的多个处理器,且根据多处理器设备的内建调度策略调度原子处理元PE以用于由所述多个处理器执行;以及
一个中央处理单元CPU,所述中央处理单元被布置为:接受计算任务的定义,该计算任务包括具有执行依赖性的多个PE,每个执行依赖性规定了在执行一个相应的第二PE之前要执行一个相应的第一PE;通过在一个包括多个执行序列的调用数据结构中布置所述PE来编译该计算任务,以用于在所述多处理器设备上并发地执行,每个执行序列包括有序的PE序列使得该执行序列中的、根据依赖性将要在该执行序列中的其它PE之前被执行的PE位于该执行序列中的所述其它PE之前,并且其中所述执行序列中的至少一个包括依赖于其它执行序列中的PE的一个或多个PE;以及,调用所述多处理器设备以运行软件代码,所述软件代码响应于所述调用数据结构且无关于所述多处理器设备的调度策略在多个处理器上并行地地执行所述执行序列,以产生所述计算任务的结果,每个处理器执行所述执行序列中的一个或多个。
Applications Claiming Priority (11)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US7946108P | 2008-07-10 | 2008-07-10 | |
US61/079,461 | 2008-07-10 | ||
US8680308P | 2008-08-07 | 2008-08-07 | |
US61/086,803 | 2008-08-07 | ||
US11067608P | 2008-11-03 | 2008-11-03 | |
US61/110,676 | 2008-11-03 | ||
US18560909P | 2009-06-10 | 2009-06-10 | |
US18558909P | 2009-06-10 | 2009-06-10 | |
US61/185,589 | 2009-06-10 | ||
US61/185,609 | 2009-06-10 | ||
PCT/IB2009/052820 WO2010004474A2 (en) | 2008-07-10 | 2009-06-30 | Efficient parallel computation of dependency problems |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102089752A CN102089752A (zh) | 2011-06-08 |
CN102089752B true CN102089752B (zh) | 2014-05-07 |
Family
ID=41507505
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN200980126852.2A Expired - Fee Related CN102089752B (zh) | 2008-07-10 | 2009-06-30 | 依赖性问题的有效率的并行计算 |
Country Status (7)
Country | Link |
---|---|
US (1) | US8516454B2 (zh) |
EP (1) | EP2297647A4 (zh) |
JP (1) | JP5733860B2 (zh) |
KR (1) | KR101607495B1 (zh) |
CN (1) | CN102089752B (zh) |
IL (1) | IL209244A (zh) |
WO (1) | WO2010004474A2 (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108874520A (zh) * | 2018-06-06 | 2018-11-23 | 成都四方伟业软件股份有限公司 | 计算方法及装置 |
Families Citing this family (88)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103646009B (zh) | 2006-04-12 | 2016-08-17 | 索夫特机械公司 | 对载明并行和依赖运算的指令矩阵进行处理的装置和方法 |
CN101627365B (zh) | 2006-11-14 | 2017-03-29 | 索夫特机械公司 | 多线程架构 |
EP2257874A4 (en) | 2008-03-27 | 2013-07-17 | Rocketick Technologies Ltd | DESIGN SIMULATION ON THE BASIS OF PARALLEL PROCESSORS |
US9032377B2 (en) | 2008-07-10 | 2015-05-12 | Rocketick Technologies Ltd. | Efficient parallel computation of dependency problems |
US8516454B2 (en) | 2008-07-10 | 2013-08-20 | Rocketick Technologies Ltd. | Efficient parallel computation of dependency problems |
EP3290530B1 (en) | 2009-02-18 | 2020-09-02 | Streck Inc. | Preservation of cell-free nucleic acids |
EP2282264A1 (en) * | 2009-07-24 | 2011-02-09 | ProximusDA GmbH | Scheduling and communication in computing systems |
US9354944B2 (en) * | 2009-07-27 | 2016-05-31 | Advanced Micro Devices, Inc. | Mapping processing logic having data-parallel threads across processors |
US8689191B2 (en) * | 2010-03-05 | 2014-04-01 | International Business Machines Corporation | Correct refactoring of concurrent software |
US8650554B2 (en) * | 2010-04-27 | 2014-02-11 | International Business Machines Corporation | Single thread performance in an in-order multi-threaded processor |
US20110276966A1 (en) * | 2010-05-06 | 2011-11-10 | Arm Limited | Managing task dependency within a data processing system |
EP3156896B1 (en) | 2010-09-17 | 2020-04-08 | Soft Machines, Inc. | Single cycle multi-branch prediction including shadow cache for early far branch prediction |
KR101710910B1 (ko) * | 2010-09-27 | 2017-03-13 | 삼성전자 주식회사 | 프로세싱 유닛의 동적 자원 할당을 위한 방법 및 장치 |
CN102073547B (zh) * | 2010-12-17 | 2013-08-28 | 国家计算机网络与信息安全管理中心 | 一种多路服务器多缓冲区并行收包的性能优化方法 |
CN103635875B (zh) | 2011-03-25 | 2018-02-16 | 英特尔公司 | 用于通过使用由可分区引擎实例化的虚拟核来支持代码块执行的存储器片段 |
EP2689327B1 (en) | 2011-03-25 | 2021-07-28 | Intel Corporation | Executing instruction sequence code blocks by using virtual cores instantiated by partitionable engines |
WO2012135041A2 (en) | 2011-03-25 | 2012-10-04 | Soft Machines, Inc. | Register file segments for supporting code block execution by using virtual cores instantiated by partitionable engines |
US9128748B2 (en) * | 2011-04-12 | 2015-09-08 | Rocketick Technologies Ltd. | Parallel simulation using multiple co-simulators |
KR101639854B1 (ko) | 2011-05-20 | 2016-07-14 | 소프트 머신즈, 인크. | 복수의 엔진에 의해 명령어 시퀀스들의 실행을 지원하기 위한 상호접속 구조 |
TWI603198B (zh) | 2011-05-20 | 2017-10-21 | 英特爾股份有限公司 | 以複數個引擎作資源與互連結構的分散式分配以支援指令序列的執行 |
US9032266B2 (en) * | 2011-06-28 | 2015-05-12 | Terence Wai-kwok Chan | Multithreaded, mixed-HDL/ESL concurrent fault simulator for large-scale integrated circuit designs |
CN102855339A (zh) * | 2011-06-29 | 2013-01-02 | 北京华大九天软件有限公司 | 集成电路版图验证并行处理解决方案 |
KR101818760B1 (ko) * | 2011-07-22 | 2018-01-15 | 삼성전자주식회사 | 시뮬레이션 장치 및 그의 시뮬레이션 방법 |
US9003383B2 (en) * | 2011-09-15 | 2015-04-07 | You Know Solutions, LLC | Analytic engine to parallelize serial code |
US8966461B2 (en) * | 2011-09-29 | 2015-02-24 | Advanced Micro Devices, Inc. | Vector width-aware synchronization-elision for vector processors |
US8752036B2 (en) * | 2011-10-31 | 2014-06-10 | Oracle International Corporation | Throughput-aware software pipelining for highly multi-threaded systems |
KR101703401B1 (ko) | 2011-11-22 | 2017-02-06 | 소프트 머신즈, 인크. | 다중 엔진 마이크로프로세서용 가속 코드 최적화기 |
US20150039859A1 (en) | 2011-11-22 | 2015-02-05 | Soft Machines, Inc. | Microprocessor accelerated code optimizer |
US9170820B2 (en) * | 2011-12-15 | 2015-10-27 | Advanced Micro Devices, Inc. | Syscall mechanism for processor to processor calls |
KR101885211B1 (ko) * | 2012-01-27 | 2018-08-29 | 삼성전자 주식회사 | Gpu의 자원 할당을 위한 방법 및 장치 |
GB2500707B (en) * | 2012-03-30 | 2014-09-17 | Cognovo Ltd | Multiprocessor system, apparatus and methods |
US9691171B2 (en) | 2012-08-03 | 2017-06-27 | Dreamworks Animation Llc | Visualization tool for parallel dependency graph evaluation |
US11468218B2 (en) | 2012-08-28 | 2022-10-11 | Synopsys, Inc. | Information theoretic subgraph caching |
US9720792B2 (en) | 2012-08-28 | 2017-08-01 | Synopsys, Inc. | Information theoretic caching for dynamic problem generation in constraint solving |
US8924945B1 (en) * | 2012-10-04 | 2014-12-30 | Google Inc. | Managing dependencies on multi-threaded environment |
KR101926464B1 (ko) * | 2012-10-11 | 2018-12-07 | 삼성전자 주식회사 | 멀티코어 프로세서에서 수행되는 프로그램의 컴파일 방법, 멀티코어 프로세서의 태스크 매핑 방법 및 태스크 스케줄링 방법 |
US9015656B2 (en) * | 2013-02-28 | 2015-04-21 | Cray Inc. | Mapping vector representations onto a predicated scalar multi-threaded system |
CN104035747B (zh) * | 2013-03-07 | 2017-12-19 | 伊姆西公司 | 用于并行计算的方法和装置 |
EP2779100A1 (en) | 2013-03-11 | 2014-09-17 | Thomson Licensing | Method for processing a computer-animated scene and corresponding device |
US8904320B2 (en) | 2013-03-13 | 2014-12-02 | Synopsys, Inc. | Solving multiplication constraints by factorization |
US10275255B2 (en) | 2013-03-15 | 2019-04-30 | Intel Corporation | Method for dependency broadcasting through a source organized source view data structure |
US9891924B2 (en) | 2013-03-15 | 2018-02-13 | Intel Corporation | Method for implementing a reduced size register view data structure in a microprocessor |
US9904625B2 (en) | 2013-03-15 | 2018-02-27 | Intel Corporation | Methods, systems and apparatus for predicting the way of a set associative cache |
US9886279B2 (en) | 2013-03-15 | 2018-02-06 | Intel Corporation | Method for populating and instruction view data structure by using register template snapshots |
KR102083390B1 (ko) | 2013-03-15 | 2020-03-02 | 인텔 코포레이션 | 네이티브 분산된 플래그 아키텍처를 이용하여 게스트 중앙 플래그 아키텍처를 에뮬레이션하는 방법 |
KR101708591B1 (ko) | 2013-03-15 | 2017-02-20 | 소프트 머신즈, 인크. | 블록들로 그룹화된 멀티스레드 명령어들을 실행하기 위한 방법 |
US10140138B2 (en) | 2013-03-15 | 2018-11-27 | Intel Corporation | Methods, systems and apparatus for supporting wide and efficient front-end operation with guest-architecture emulation |
US9632825B2 (en) | 2013-03-15 | 2017-04-25 | Intel Corporation | Method and apparatus for efficient scheduling for asymmetrical execution units |
WO2014150806A1 (en) | 2013-03-15 | 2014-09-25 | Soft Machines, Inc. | A method for populating register view data structure by using register template snapshots |
WO2014150971A1 (en) | 2013-03-15 | 2014-09-25 | Soft Machines, Inc. | A method for dependency broadcasting through a block organized source view data structure |
WO2014150991A1 (en) * | 2013-03-15 | 2014-09-25 | Soft Machines, Inc. | A method for implementing a reduced size register view data structure in a microprocessor |
US9569216B2 (en) | 2013-03-15 | 2017-02-14 | Soft Machines, Inc. | Method for populating a source view data structure by using register template snapshots |
US9811342B2 (en) | 2013-03-15 | 2017-11-07 | Intel Corporation | Method for performing dual dispatch of blocks and half blocks |
IL232836A0 (en) * | 2013-06-02 | 2014-08-31 | Rocketick Technologies Ltd | Efficient parallel computation of dependency problems |
CN103559574B (zh) * | 2013-10-28 | 2017-02-08 | 东软集团股份有限公司 | 一种工作流操作方法及系统 |
EP3074866A4 (en) * | 2013-11-27 | 2017-12-27 | Intel Corporation | Apparatus and method for scheduling graphics processing unit workloads from virtual machines |
US20160350245A1 (en) * | 2014-02-20 | 2016-12-01 | Lei Shen | Workload batch submission mechanism for graphics processing unit |
GB2524063B (en) | 2014-03-13 | 2020-07-01 | Advanced Risc Mach Ltd | Data processing apparatus for executing an access instruction for N threads |
US9298769B1 (en) * | 2014-09-05 | 2016-03-29 | Futurewei Technologies, Inc. | Method and apparatus to facilitate discrete-device accelertaion of queries on structured data |
US9860145B2 (en) | 2015-07-02 | 2018-01-02 | Microsoft Technology Licensing, Llc | Recording of inter-application data flow |
US10261985B2 (en) | 2015-07-02 | 2019-04-16 | Microsoft Technology Licensing, Llc | Output rendering in dynamic redefining application |
US9712472B2 (en) | 2015-07-02 | 2017-07-18 | Microsoft Technology Licensing, Llc | Application spawning responsive to communication |
US9785484B2 (en) | 2015-07-02 | 2017-10-10 | Microsoft Technology Licensing, Llc | Distributed application interfacing across different hardware |
US10198252B2 (en) | 2015-07-02 | 2019-02-05 | Microsoft Technology Licensing, Llc | Transformation chain application splitting |
US9733993B2 (en) | 2015-07-02 | 2017-08-15 | Microsoft Technology Licensing, Llc | Application sharing using endpoint interface entities |
US9733915B2 (en) * | 2015-07-02 | 2017-08-15 | Microsoft Technology Licensing, Llc | Building of compound application chain applications |
US10198405B2 (en) | 2015-07-08 | 2019-02-05 | Microsoft Technology Licensing, Llc | Rule-based layout of changing information |
US10031724B2 (en) | 2015-07-08 | 2018-07-24 | Microsoft Technology Licensing, Llc | Application operation responsive to object spatial status |
US10277582B2 (en) | 2015-08-27 | 2019-04-30 | Microsoft Technology Licensing, Llc | Application service architecture |
US10740116B2 (en) * | 2015-09-01 | 2020-08-11 | International Business Machines Corporation | Three-dimensional chip-based regular expression scanner |
US9684744B2 (en) | 2015-10-15 | 2017-06-20 | Rocketick Technologies Ltd. | Verification of system assertions in simulation |
US10977092B2 (en) * | 2015-10-16 | 2021-04-13 | Qualcomm Incorporated | Method for efficient task scheduling in the presence of conflicts |
US11151446B2 (en) * | 2015-10-28 | 2021-10-19 | Google Llc | Stream-based accelerator processing of computational graphs |
US10579350B2 (en) * | 2016-02-18 | 2020-03-03 | International Business Machines Corporation | Heterogeneous computer system optimization |
US10650048B2 (en) * | 2016-09-09 | 2020-05-12 | Baidu Usa Llc | Managing complex service dependencies in a data integration system |
KR102278337B1 (ko) * | 2017-04-21 | 2021-07-19 | 에스케이하이닉스 주식회사 | 메모리장치의 스케줄러 및 스케줄링 방법 |
KR102334511B1 (ko) | 2017-05-29 | 2021-12-03 | 바르셀로나 수퍼컴퓨팅 센터 - 센트로 나쇼날 드 수퍼컴퓨타숑 | 작업 의존성 관리 |
CN107239334B (zh) * | 2017-05-31 | 2019-03-12 | 清华大学无锡应用技术研究院 | 处理不规则应用的方法及装置 |
CN108984212B (zh) * | 2017-05-31 | 2021-06-25 | 腾讯科技(深圳)有限公司 | 一种关闭进程的方法以及电子设备 |
US10360002B2 (en) * | 2017-06-06 | 2019-07-23 | Informatica Llc | Method, apparatus, and computer-readable medium for generating an alternative implementation of a program on one or more engines |
JP2018207396A (ja) * | 2017-06-08 | 2018-12-27 | 富士通株式会社 | 情報処理装置、情報処理方法及びプログラム |
US10672095B2 (en) | 2017-12-15 | 2020-06-02 | Ati Technologies Ulc | Parallel data transfer to increase bandwidth for accelerated processing devices |
CN110825440B (zh) | 2018-08-10 | 2023-04-14 | 昆仑芯(北京)科技有限公司 | 指令执行方法和装置 |
US11204783B2 (en) * | 2018-08-23 | 2021-12-21 | Apple Inc. | Method and device for process data sharing |
CN111090464B (zh) * | 2018-10-23 | 2023-09-22 | 华为技术有限公司 | 一种数据流处理方法及相关设备 |
CN109634729A (zh) * | 2018-11-20 | 2019-04-16 | 中国船舶重工集团公司第七0七研究所 | 一种捷联惯导设备多核dsp并行解算方法 |
KR20200083048A (ko) * | 2018-12-31 | 2020-07-08 | 삼성전자주식회사 | 폴링 시간을 예측하는 뉴럴 네트워크 시스템 및 이를 이용한 뉴럴 네트워크 모델 처리 방법 |
KR20220094601A (ko) | 2020-12-29 | 2022-07-06 | 삼성전자주식회사 | 스토리지 장치 및 그 구동 방법 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101044457A (zh) * | 2004-09-28 | 2007-09-26 | 英特尔公司 | 用于依赖性链处理的系统、方法和装置 |
Family Cites Families (29)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH08287022A (ja) * | 1995-03-31 | 1996-11-01 | Internatl Business Mach Corp <Ibm> | マルチプロセッサ・システム及びその排他的制御方法 |
JP2959525B2 (ja) * | 1997-06-02 | 1999-10-06 | 日本電気株式会社 | データ処理装置および方法、情報記憶媒体 |
US6397372B1 (en) * | 1999-01-19 | 2002-05-28 | Zeki Bozkus | Cell based parallel verification of an integrated circuit design |
NL1015579C1 (nl) * | 2000-06-30 | 2002-01-02 | Thales Nederland Bv | Werkwijze voor het automatisch verdelen van programmataken over een verzameling processors. |
WO2002056145A2 (en) * | 2001-01-11 | 2002-07-18 | P C Krause And Associates Inc | Circuit simulation |
US7158925B2 (en) * | 2002-04-18 | 2007-01-02 | International Business Machines Corporation | Facilitating simulation of a model within a distributed environment |
JP4787456B2 (ja) * | 2002-12-25 | 2011-10-05 | 日本電気株式会社 | 並列プログラム生成装置,並列プログラム生成方法および並列プログラム生成プログラム |
WO2005020292A2 (en) * | 2003-08-26 | 2005-03-03 | Nusym Technology, Inc. | Methods and systems for improved integrated circuit functional simulation |
WO2006117683A2 (en) * | 2005-01-25 | 2006-11-09 | Lucid Information Technology, Ltd. | Graphics processing and display system employing multiple graphics cores on a silicon chip of monolithic construction |
US20060242618A1 (en) * | 2005-02-14 | 2006-10-26 | Yao-Ting Wang | Lithographic simulations using graphical processing units |
JP4448784B2 (ja) * | 2005-03-15 | 2010-04-14 | 株式会社日立製作所 | 並列計算機の同期方法及びプログラム |
JP3938387B2 (ja) * | 2005-08-10 | 2007-06-27 | インターナショナル・ビジネス・マシーンズ・コーポレーション | コンパイラ、制御方法、およびコンパイラ・プログラム |
US7409656B1 (en) * | 2005-09-12 | 2008-08-05 | Cadence Design Systems, Inc. | Method and system for parallelizing computing operations |
US7444276B2 (en) * | 2005-09-28 | 2008-10-28 | Liga Systems, Inc. | Hardware acceleration system for logic simulation using shift register as local cache |
US20070073999A1 (en) * | 2005-09-28 | 2007-03-29 | Verheyen Henry T | Hardware acceleration system for logic simulation using shift register as local cache with path for bypassing shift register |
US20070074000A1 (en) * | 2005-09-28 | 2007-03-29 | Liga Systems, Inc. | VLIW Acceleration System Using Multi-state Logic |
US20090150136A1 (en) * | 2005-10-10 | 2009-06-11 | Sei Yang Yang | Dynamic-based verification apparatus for verification from electronic system level to gate level, and verification method using the same |
US8781808B2 (en) * | 2005-10-10 | 2014-07-15 | Sei Yang Yang | Prediction-based distributed parallel simulation method |
US20070219771A1 (en) * | 2005-12-01 | 2007-09-20 | Verheyen Henry T | Branching and Behavioral Partitioning for a VLIW Processor |
US20070129926A1 (en) * | 2005-12-01 | 2007-06-07 | Verheyen Henry T | Hardware acceleration system for simulation of logic and memory |
US20070129924A1 (en) * | 2005-12-06 | 2007-06-07 | Verheyen Henry T | Partitioning of tasks for execution by a VLIW hardware acceleration system |
US20070150702A1 (en) * | 2005-12-23 | 2007-06-28 | Verheyen Henry T | Processor |
US7760743B2 (en) * | 2006-03-06 | 2010-07-20 | Oracle America, Inc. | Effective high availability cluster management and effective state propagation for failure recovery in high availability clusters |
US7627838B2 (en) * | 2006-04-25 | 2009-12-01 | Cypress Semiconductor Corporation | Automated integrated circuit development |
GB2443277B (en) * | 2006-10-24 | 2011-05-18 | Advanced Risc Mach Ltd | Performing diagnostics operations upon an asymmetric multiprocessor apparatus |
US20080208553A1 (en) * | 2007-02-27 | 2008-08-28 | Fastrack Design, Inc. | Parallel circuit simulation techniques |
EP2257874A4 (en) * | 2008-03-27 | 2013-07-17 | Rocketick Technologies Ltd | DESIGN SIMULATION ON THE BASIS OF PARALLEL PROCESSORS |
US8516454B2 (en) | 2008-07-10 | 2013-08-20 | Rocketick Technologies Ltd. | Efficient parallel computation of dependency problems |
US8543360B2 (en) * | 2009-06-30 | 2013-09-24 | Omniz Design Automation Corporation | Parallel simulation of general electrical and mixed-domain circuits |
-
2009
- 2009-06-30 US US12/994,153 patent/US8516454B2/en active Active
- 2009-06-30 CN CN200980126852.2A patent/CN102089752B/zh not_active Expired - Fee Related
- 2009-06-30 WO PCT/IB2009/052820 patent/WO2010004474A2/en active Application Filing
- 2009-06-30 JP JP2011517279A patent/JP5733860B2/ja not_active Expired - Fee Related
- 2009-06-30 KR KR1020107028355A patent/KR101607495B1/ko not_active IP Right Cessation
- 2009-06-30 EP EP09794083A patent/EP2297647A4/en not_active Withdrawn
-
2010
- 2010-11-10 IL IL209244A patent/IL209244A/en not_active IP Right Cessation
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101044457A (zh) * | 2004-09-28 | 2007-09-26 | 英特尔公司 | 用于依赖性链处理的系统、方法和装置 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108874520A (zh) * | 2018-06-06 | 2018-11-23 | 成都四方伟业软件股份有限公司 | 计算方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
WO2010004474A2 (en) | 2010-01-14 |
US20110067016A1 (en) | 2011-03-17 |
JP2011527788A (ja) | 2011-11-04 |
JP5733860B2 (ja) | 2015-06-10 |
WO2010004474A9 (en) | 2011-01-13 |
KR20110034597A (ko) | 2011-04-05 |
CN102089752A (zh) | 2011-06-08 |
WO2010004474A3 (en) | 2010-03-11 |
EP2297647A2 (en) | 2011-03-23 |
KR101607495B1 (ko) | 2016-03-30 |
IL209244A0 (en) | 2011-01-31 |
EP2297647A4 (en) | 2012-12-12 |
US8516454B2 (en) | 2013-08-20 |
IL209244A (en) | 2015-01-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102089752B (zh) | 依赖性问题的有效率的并行计算 | |
US9032377B2 (en) | Efficient parallel computation of dependency problems | |
US8990827B2 (en) | Optimizing data warehousing applications for GPUs using dynamic stream scheduling and dispatch of fused and split kernels | |
US9672065B2 (en) | Parallel simulation using multiple co-simulators | |
CN105159761B (zh) | 用于在多处理器上进行数据并行计算的应用编程接口 | |
EP0247146B1 (en) | Parallel processor system for processing natural concurrencies and method therefor | |
JP2011527788A5 (zh) | ||
CN101556544A (zh) | 为了用于由通用处理器执行而对应用程序重定目标 | |
CN102870096A (zh) | 子缓冲器对象 | |
Xu et al. | Automatic cross-replica sharding of weight update in data-parallel training | |
Shterenlikht et al. | Fortran 2008 coarrays | |
CN110597606A (zh) | 一种高速缓存友好的用户级线程调度方法 | |
US20190121678A1 (en) | Parallel computing | |
CN104216685A (zh) | 依赖性问题的有效率的并行计算 | |
CN104166539A (zh) | 并行原子递增 | |
Kwok | Parallel program execution on a heterogeneous PC cluster using task duplication | |
Davidović et al. | Parallel local search to schedule communicating tasks on identical processors | |
Taft | Achieving 60 GFLOP/s on the production CFD code OVERFLOW-MLP | |
Lázaro-Muñoz et al. | A tasks reordering model to reduce transfers overhead on GPUs | |
Karsin | A performance model for GPU architectures: analysis and design of fundamental algorithms | |
Hiesgen et al. | Manyfold actors: extending the C++ actor framework to heterogeneous many-core machines using OpenCL | |
US11675572B2 (en) | Sharing data structures | |
Honig et al. | Improving the efficiency of functional parallelism by means of hyper-scheduling | |
Hmid et al. | A Transfer-Aware Runtime System for Heterogeneous Asynchronous Parallel Execution | |
CN116775266A (zh) | 用于处理器中的线程组的可扩展负载均衡的技术 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20140507 Termination date: 20180630 |