利用工作需求反馈在处理器之间进行工作划分的方法和系统的制作方法

文档序号:6484910阅读:106来源:国知局
利用工作需求反馈在处理器之间进行工作划分的方法和系统的制作方法
【专利摘要】根据一个实施例的方法包括下列操作:将包括顶级任务的二进制代码载入第一处理器上的存储器,所述顶级任务具有相关联的范围;基于所述范围确定所述顶级任务是否可分成多个子任务;对于子任务中的每个子任务,确定给定的子任务是否可分成多个子子任务;并且如果给定的子任务是不可分的,执行给定的子任务;否则,如果给定的子任务是可分的,将给定的子任务分成多个子子任务。
【专利说明】利用工作需求反馈在处理器之间进行工作划分的方法和系统
【技术领域】
[0001]本公开涉及工作划分,并且更具体地,涉及利用工作需求反馈进行工作划分。
【背景技术】
[0002]在具有多个处理器的计算机系统上,并行处理可以通过把与任务相关联的工作负载分配给处理器来使得能够减少执行那个任务所需要的时间。在以这种方式利用基于循环的或递归的并行性来提高性能的程序中,在减少与跨多个处理器的工作分解和分配相关联的开销的需要对增加潜在的并行性用于改进的负载平衡和处理器的利用的期望之间存在有冲突。这个冲突常常通过粒度的选择来解决,粒度是可以受益于并行性的工作量上的下限。粒度是限制将要应用于任务的细分数量的截止点。
[0003]然而,存在有对于这个方法的许多限制。可能难以选择适当的粒度,并且最佳粒度级可以在任务之间并且甚至在给定的任务内变化。如果工作负载跨任务是不平衡的,则对于具有显著工作的子任务来说可能是有效的小粒度可以对于具有更少工作的其它子任务引起过多的开销。备选地,适合具有更轻工作负载的子任务的更大粒度可以导致具有更大工作负载的子任务的过载、负载不平衡和处理资源的利用不足。
【专利附图】

【附图说明】
[0004]随着下面的【具体实施方式】进行以及当参考附图(其中相同的附图标记描绘相同的部分)时,要求保护的主题的实施例的特征和优势将变得显而易见,并且其中:
图1图示了与本公开一致的一个示范性实施例的系统硬件框图;
图2图示了与本公开一致的一个示范性实施例的系统逻辑框图;
图3图示了与本公开一致的一个示范性实施例的操作的流程图;以及 图4图示了与本公开一致的一个示范性实施例的操作的流程图。
[0005]虽然下面的【具体实施方式】将以对说明性的实施例作出的参考来进行,但是对于本领域技术人员来说,其许多的备选、修改和变化将是显而易见的。
【具体实施方式】
[0006]1.介绍
通常,本公开提供了用于基于递归的任务划分和处理器利用反馈而在多个处理器当中的任务的运行时间负载平衡的方法和系统。任务可以定义为需要进行的、通过在处理器上执行一个或多个指令来完成的、应用于相关联的数据的任何类型的工作。任务可以包括用户提供的代码或内部代码或两者的组合。一些(而不是所有)类型的任务能够被分成子任务,其中的每一个可以在不同处理器上被并行执行。这可导致性能改进,因为作为并行执行每个子任务的结果通常将会更快地完成工作。然而,由于与例如划分任务、执行处理器间通信和同步以及将每个子任务的部分结果重新装配成总结果相关联的开销导致在某种程度上将会限制实际性能改进。
[0007]可以在细分的下一个更低级重复将工作分成子任务的过程,因为可以将子任务进一步分成更小的子子任务等等。理论上,可以通过随后的更低级无限地向下重复任务细分的这个过程。将任务细分成大量愈来愈小的子子任务的优势是可以在大量处理器上更均匀地分配这些子子任务用于互相并行执行,由于负载平衡导致提供了性能的总增加。然而,存在有对于实际上可以达到的细分级的限制。首先,最终将存在有其中由于子子任务的小尺寸和/或它的组件指令(components instructions)必须被连续执行的事实而导致子子任务是不可分的点。其次,因为子子任务变得更小,它们执行的有用工作的量(根据定义,任务得要执行的工作)可减少,而与子子任务相关联的开销可保持基本不变,即与子子任务的大小无关。因此,在某个点,没有从进一步细分中获得效率,并且实际上性能可能会降低,因为与专用于有用的工作的处理时间相比,更多的处理时间专用于开销。第三,存在有在其上可以分配子子任务的有限数量的处理器,所以在某个点,进一步细分停止增加可以执行的并行执行的量。
[0008]下面将更详细描述将任务分成子任务的重复过程(也称为递归分解)。递归的一个示例是其中可执行代码的单元(例如子程序)调用它自己的技术。递归分解可以由应用于任务的子程序来完成以创建更小的子任务。分解子程序的每次调用创建递归的新的级或深度。这可以导致无限循环,如果在子程序中不存在当被满足时防止调用分解的更多级的条件测试的话。结束条件可以是子子任务不再是可分的或递归级已经超过深度阈值。
[0009]2.定义
任务可以定义为需要利用相关联的数据来进行的任何类型的工作,其通过在处理器上执行一个或多个指令来完成。任务可以包括用户提供的代码和数据或者内部代码和数据或者两者的组合。任务可以在其执行期间创建其它任务,例如它可以被分成子任务并且子任务可以被进一步细分成子子任务等等。
[0010]派生(spawning)指由第一处理器提供任务用于在另一个处理器上执行。派生可以将该任务放入与第一处理器相关联的或与另一个处理器相关联的本地任务池中或者放入全局任务池中。
[0011]术语范围可以定义为用户提供的工作描述符,其规定了工作是否是可分的并且如果是这样的话,如何分割它。例如,顶级范围可以简单地是1-100,其可分成范围1-50和51-100。
[0012]范围池是存储器中用于保存范围的存储区域。与在任何给定处理器上运行的任务相关联的范围池对于那个处理器来说是专用的。
[0013]递归深度是在某个数量的细分或拆分之后达到的递归级。它可以用相对项或绝对项来规定。例如,绝对深度可以始于从描述将要进行的工作的整个范围的第一顶级范围计数的级,并且随着每个递归拆分以连续方式增加。相对深度可以始于从子任务内的第一级范围计数的级,例如当范围池用来为一个任务存储多个范围时。
[0014]最大递归深度或递归深度阈值(RDm)是在当前递归深度(CRD)超过阈值时对进一步的递归范围拆分的限制。
[0015]术语需求指另一个处理器可用于执行任务的指示。这个信息可以通过信令任务、任务池的检查、或者全局标记或计数器来提供。[0016]信令任务可以是待处理的具有相关联范围的普通子任务;但是正在第二处理器上被执行,它还提供反馈给发起这个信令任务的处理器。
[0017]3.实施例
本公开的实施例提供了动态并自动划分和调度任务的能力以通过在任务之间提供与工作分解相关联的更低的开销和更好的负载平衡来提高多处理环境中的性能。
[0018]负载平衡是跨多个处理器的任务的分配以改进处理器的利用。如先前描述的,在与跨多个处理器的任务细分和分配相关联的开销与通过增加并行性来改进负载平衡的期望之间存在有冲突。解决这个冲突的一种方法是在运行时间之前选择粒度,粒度是限制将应用于任务的细分数量的截止点或下限。然而,选择合适的粒度是困难的,因为最佳粒度级从一个任务到下一个任务可以是不同的并且可以在给定的任务内变化,即在运行时间期间从一个子任务到下一个子任务可以变化。固定的、预先选择的粒度可以导致一些子任务过载,而其它子任务遭受过多的开销,导致处理资源的利用不足或浪费。
[0019]本公开的实施例基于递归任务划分来使得能够在多个处理器当中任务的运行时间负载平衡,消除了过多任务的创建和对于固定的、预先选择的粒度的要求。在递归的顶级,负载平衡器的初始调用对任务起作用并且可以将任务细分成两个或更多个子任务,如果可能的话。然后,可以将子任务中的每个子任务转到负载平衡器的新的递归调用。取决于可用性,可以在其它处理器上执行负载平衡器的这些新的调用。可以将这个递归过程重复到更低的递归级,直到满足结束条件为止。结束条件可以是子子任务不再是可分的或递归级已经超过深度阈值。基于变化的处理器可用性,深度阈值可以是动态可调的。
[0020]图1图示了在高层与本公开一致的一个示范性实施例的系统硬件框图100。系统100可以包括许多处理器:P1 104、P2 112、P3 108、P4 116, -PN 118。这些处理器可以是分立的处理单元或者它们可以是多处理器核102的一部分。每个处理器可以包括本地存储器,其对于那个处理器来说可以是专用的。还可以提供并且通过一个或多个总线120访问共享存储器122、磁盘存储器124和输入/输出(I/O)设备126。在一些实施例中,处理器Pl 104可以配置成在任务106上执行负载平衡操作。处理器Pl 104可以将任务106细分110成将要在处理器Pl 104上执行的新的子任务。处理器Pl 104还可以将与任务106相关联的工作的一部分派生130成新的子任务(例如114)用于在另一个处理器(例如P4 116)上执行。派生可以至少部分基于处理器可用性,其可以是下面将要更全面描述的对工作的需求的形式。
[0021]图2图示了与本公开一致的一个示范性实施例的系统逻辑框图200。在一些实施例中,在过程中可以存在初始阶段(为了简单起见在这里未示出),其中在许多可用处理器之间分割顶级任务(如果可能的话)。框202示出了在第一处理器上执行已经被分配给第一处理器的整个顶级任务或细分任务中的一个细分任务。这个执行的第一级222可以被认为是递归级O (当规定为相对深度时)。范围204与这个顶级任务相关联。范围204被提供为工作的子集的描述符并且在这个递归级,范围204识别N个潜在的工作项(I到N)。
[0022]在下一个更低的递归级224,范围204被递归地拆分成子范围(这里是206和220)。拆分不需要限于如这个示例中的对半拆分,而是在一些实施例中可以包括从2到N变动的多路拆分。每个子范围覆盖N个工作项的一半。子范围206覆盖项I到N/2,而子范围220覆盖项N/2+1到N。可以创建并派生214包括子范围220的新的信令任务。如果另一个处理器218是空闲的,它可以获取信令任务并执行信令任务。在执行期间,信令任务可以指示对工作的需求216,并且可以以和处理器202对范围204所做的相同方式来处理子范围220,如下面所描述的。虽然在这个图中未示出,任何数量的附加处理器可用于处理新的信令任务,所述新的信令任务可以响应于先前指示的需求而在递归级222、224、226中的每个之处被创建。否则,如果空闲的处理器是不可用的,子范围220可以稍后被第一处理器202处理,而不指示需求。
[0023]范围池212对于处理器202来说可以是专用的并且对于其它处理器来说是不可见的。在更低的递归级226,子范围206可以进一步被递归细分成更小的子范围208,其中每个细分的一半被存储在范围池212中。在最低的递归级228,当子范围210不可以再细分时或者递归深度已经超过阈值时或者范围池212已经超过它的容量时,执行与那个子范围210相关联的工作。除非工作需求216被指示,将以相同的方式进一步拆分和执行存储在范围池212中的其它子范围。
[0024]如果需求216被指示,则可以为来自范围池212的范围创建新的信令任务,通常其中最顶部的递归级是可用的。在以和214类似的方式创建并提供任务用于被其它处理器执行之后,将这个范围排除在范围池之外。
[0025]响应于许多不同的情形,可以动态调整确定递归深度的限制的递归深度阈值。响应于从另一个处理器218接收需求反馈216,可以在给定的处理器202上在当前执行的任务中调整递归深度阈值。如下面所解释的,作为被第二处理器218执行的结果,还可以在信令任务中调整所述阈值。另外,可以在作为需求反馈的结果被创建的任务中调整所述阈值。所述阈值调整可以是使阈值的值增加任何合适的量。
[0026]图3图示了与本公开一致的一个示范性实施例的操作的流程图300。在操作310,包括顶级任务的二进制代码被载入第一处理器上的存储器。顶级任务具有描述可以如何细分任务的相关联的范围,如果细分是可能的话。在操作320,基于范围来进行关于任务是否可分成多个子任务的确定。在操作330,对于子任务中的每个子任务,进行关于给定的子任务是否可分成多个子子任务的确定。在操作340,如果给定的子任务是不可分的,则执行它,否则将它分成多个子子任务。
[0027]在一些实施例中,进行关于第二处理器是否具有对工作的需求的确定,并且如果是这样的话,响应于那个需求,在第二处理器上执行多个子任务中的一个或多个子任务。在其它处理器上确定工作需求可以通过派生设置指示对工作的需求的标记的信令任务来完成,如果那个信令任务被另一个处理器执行的话。在一些实施例中,信令任务可以在设置标记之后结束。在其它实施例中,信令任务还可以包括将被执行的子任务并且信令任务将保持活动以执行那个子任务。当信令任务还执行子任务时,可能需要调整递归深度阈值以避免过度递归。
[0028]动态调整的递归深度阈值可以确定处理器工作需求的测试的频率和工作的粒度。更大的阈值导致产生更小范围的更深的递归级。在初始阶段期间,过程可以对粗的片(slice)(大的子任务粒度)起作用,但是当响应于来自其它处理器的检测的需求而增大阈值时,会减小粒度并且会与空闲的处理器共享工作。响应于各种类型的任务,这个动态粒度调整使得能够减少开销和增加利用。递归深度阈值不要求任务得要解决的根本问题或者任务的性质或特性的先验知识。在一些实施例中,递归深度阈值初始被设为tog2(P*U*V),其中P表示可用处理器的总数,U表示每处理器初始创建的子任务的数量,以及V表示每子任务将要执行的处理器需求检查的期望数量。在一些实施例中,U和V可以被选为4、8、16或32并且可以基于操作经验来微调。[0029]图4图示了与本公开一致的一个示范性实施例的操作的流程图400。在操作402,为负载平衡器提供递归进入点。在操作404,获得与当前任务相关联的范围(R)。还获得当前递归深度(CRD)。取决于递归级(CRD),当前任务可以是顶级任务或子任务。在操作406,确定R是否可以被拆分或细分。在操作424,其中R是不可分的,则处理R并且执行与R相关联的工作。然后在操作426,当前任务结束它的执行。
[0030]在操作410,其中R是可分的,R被细分成两部分:Ra^P Rb。在操作412,Re被移至或存储在范围的池中。所述池可以是对于当前任务来说是专用的存储装置。然后,使R等于Ra ,并且递增CRD。在操作414,确定CRD小于递归深度阈值<RDTO)并且R是可分的
条件。如果条件为真,所述方法返回到操作410。如果条件不为真,则在操作416,处理R并且执行与R相关联的任务。在操作418,确定任何其它空闲的处理器是否可用。如果空闲的处理器是不可用的,则过程在操作420继续。如果空闲的处理器是可用的(或要求工作),则在操作428,递增RDth。在操作430,从范围的池中取出新的R。在一些实施例中,在先入先出(FIFO)基础上执行所述取出。在操作432,用新的R和当前递归深度(CRD)派生新的负载平衡器以便可用于在空闲的处理器上执行。然后过程在操作420继续,其中确定范围的池是否是空的。如果所述池是空的,则在操作434,当前任务结束。如果当前任务是最后的任务,则过程完成。如果所述池不是空的,则在操作422,从范围的池中取出新的R。在一些实施例中,在后入先出(LIFO)基础上执行所述取出。然后所述方法返回到操作406。
[0031]在一些实施例中,作为范围池的备选,在一个处理器的本地任务池中可以存在派生的子任务的分组。这些派生的任务可以在可包括参考计数器和递归深度阈值的组对象中被计数。如果任务被另一个处理器从组中窃取,则可以为整个组增加递归深度阈值,从而影响组中剩余的任务,并且可以基于窃取的任务在另一个处理器上创建新的组。当任务开始时,相对于阈值来检查递归深度并且执行进一步的任务拆分,如果可能的话,或者执行任务。
[0032]在一些实施例中,为了操作的简单起见,以工作的更少适应的或减少的粒度为代价,可以消除递归深度阈值和相关联的测试。在这种情况下,当子任务不再是可分的时候递归结束。
[0033]下面是与本公开一致的伪代码的一个实施例的说明性示例。伪代码的行1-12可操作用来定义任务之间同步的标记类。行14-21可操作用来定义组合范围和递归深度的结构。递归负载平衡器任务始于行23。如果范围是不可分的,行25-28可操作用来立刻处理范围。行31-36可操作用来创建标记和信令任务以在处理器之间传递工作需求。行40可操作用来设置递归深度阈值。行43-45可操作用来创建与当前递归深度相关联的范围和专用范围池。行46-86可操作用来实现递归的负载平衡器任务的主处理循环。行52-56可操作用来递归地将当前范围拆分成两个子范围、将一个子范围存储在专用范围池中并且利用另一个子范围重复,直到范围是不可分的或者超过递归深度阈值为止。行60可操作用来处理当前范围。行63-70可操作用来递归地派生另一个处理器上的新的负载平衡器任务,如果那个处理器已经做出对工作的需求的话,并且行63-70可操作用来将以FIFO顺序从专用范围池取出的范围提供给那个新的任务。行71-78可操作用来复位工作需求信令机制并且递增深度阈值。行81-83可操作用来以LIFO顺序从专用池中取出范围并且重复循环。行90-95可操作用来实现工作需求信令机制。
【权利要求】
1.一种方法,包括: 将包括顶级任务的二进制代码载入第一处理器上的存储器,所述顶级任务具有相关联的范围; 基于所述范围确定所述顶级任务是否可分成多个子任务; 对于所述子任务中的每个子任务,确定给定的子任务是否可分成多个子子任务;以及如果所述给定的子任务是不可分的,执行所述给定的子任务;如果所述给定的子任务是可分的,将所述给定的子任务分成所述多个子子任务。
2.如权利要求1所述的方法,还包括确定第二处理器是否具有对工作的需求。
3.如权利要求2所述的方法,还包括响应于所述对工作的需求,在所述第二处理器上执行所述多个子任务中的一个或多个子任务。
4.如权利要求2所述的方法,其中所述确定所述第二处理器具有对工作的需求通过派生信号任务来执行,其中如果所述信号任务被所述第二处理器窃取,所述信号任务设置指示所述对工作的需求的标记。
5.如权利要求1所述的方法,其中所述子子任务被进一步分割直到超过细分阈值为止。
6.如权利要求1所述的方法,其中所述细分阈值初始被设置为log2(P*U*V>,其中P表示可用处理器的总数,U表示在所述可用处理器中的每个上创建的子任务的初始数量,以及V表示被所述子任务中的每 个子任务执行的对处理器工作需求的检查的数量。
7.如权利要求6所述的方法,其中基于处理器可用性来动态调整所述细分阈值。
8.一种非暂时计算机可读存储介质,其具有存储在其上的指令,所述指令在被处理器执行时导致以下操作,包括: 将包括顶级任务的二进制代码载入第一处理器上的存储器,所述顶级任务具有相关联的范围; 基于所述范围确定所述顶级任务是否可分成多个子任务; 对于所述子任务中的每个子任务,确定给定的子任务是否可分成多个子子任务;以及如果所述给定的子任务是不可分的,执行所述给定的子任务;如果所述给定的子任务是可分的,将所述给定的子任务分成所述多个子子任务。
9.如权利要求8所述的非暂时计算机可读存储介质,还包括确定第二处理器是否具有对工作的需求。
10.如权利要求9所述的非暂时计算机可读存储介质,还包括响应于所述对工作的需求,在所述第二处理器上执行所述多个子任务中的一个或多个子任务。
11.如权利要求9所述的非暂时计算机可读存储介质,其中所述确定所述第二处理器具有对工作的需求通过派生信号任务来执行,其中如果所述信号任务被所述第二处理器窃取,所述信号任务设置指示所述对工作的需求的标记。
12.如权利要求8所述的非暂时计算机可读存储介质,其中所述子子任务被进一步分割直到超过细分阈值为止。
13.如权利要求8所述的非暂时计算机可读存储介质,其中所述细分阈值初始被设置为l0g2(P*U*V>,其中P表示可用处理器的总数,U表示在所述可用处理器中的每个上创建的子任务的初始数量,以及V表示被所述子任务中的每个子任务执行的对处理器工作需求的检查的数量。
14.如权利要求13所述的非暂时计算机可读存储介质,其中基于处理器可用性来动态调整所述细分阈值。
15.—种系统,包括: 多个处理器; 存储器,配置成托管(host)将在所述多个处理器上执行的负载平衡器代码,其中当在所述处理器上执行所述负载平衡器代码时,所述负载平衡器代码引起所述处理器: 将包括顶级任务的二进制代码载入第一处理器上的存储器,所述顶级任务具有相关联的范围; 基于所述范围确定所述顶级任务是否可分成多个子任务; 对于所述子任务中的每个子任务,确定给定的子任务是否可分成多个子子任务;以及如果所述给定的子任务是不可分的,执行所述给定的子任务;如果所述给定的子任务是可分的,将所述给定的子任务分成所述多个子子任务。
16.如权利要求15所述的系统,其中所述负载平衡器代码还引起所述处理器确定第二处理器是否具有对工作的需求。
17.如权利要求16所述的系统,其中所述负载平衡器代码还引起所述处理器响应于所述对工作的需求而在所述第二处理器上执行所述多个子任务中的一个或多个子任务。
18.如权利要求16所述的系统,其中所述负载平衡器代码还引起所述处理器派生信号任务,其中如果所述信号任务被所述第二处理器窃取,所述信号任务设置指示所述对工作的需求的标记。
19.如权利要求15所述的系统,其中所述负载平衡器代码还引起所述处理器进一步分割所述子子任务直到超过细分阈值为止。
20.如权利要求15所述的系统,其中所述细分阈值初始被设置为log2(P*U*V>,其中P表示可用处理器的总数,U表示在所述可用处理器中的每个上创建的子任务的初始数量,以及V表示被所述子任务中的每个子任务执行的对处理器工作需求的检查的数量。
【文档编号】G06F9/46GK103748559SQ201180073152
【公开日】2014年4月23日 申请日期:2011年8月5日 优先权日:2011年8月5日
【发明者】A.A.马拉克霍夫, A.库卡诺夫 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1