减少并行程序中的循环的块的无锁调度的制作方法

文档序号:6569287阅读:161来源:国知局
专利名称:减少并行程序中的循环的块的无锁调度的制作方法
技术领域
本发明 一般涉及共享存储器并行程序。
背景技术
共享存储器并行程序包括在共享地址空间中并发执行的多个线 程。例如,不同的线程可能同时计算一列数字的不同部分的总和。
循环是程序中的重复。循环可^L嵌套。将多个线程应用于循环的 执行的一种常见方法是在线程上划分循环迭代。通过让线程并发执行 各种循环迭代,可比单个线程执行所有迭代更快地执行该循环。
共享存储器并行程序可采用各种编程语言来编写。OpenMP是可 用于指定以Fortran、 C或C+十编程语言编写的程序的共享存储器并行 性的一组编译指令、库例程和环境变量的规范。例如参见从OpenMP 体系结构小组可得到的OpenMP规范C/C十+版本2.0(2002年3月)。
与给定循环迭代及其相应循环索引有关的术语"迭代索引"表示 在顺序执行循环时在给定循环迭代之前的迭代次数。例如,在顺序执 行循环时,待执行的第一循环迭代可能具有迭代索引零。待顺序执行 的第二循环迭代可能具有迭代索引一,依此类推。如果并行执行循环
迭代,则循环迭代仍然映射到相同的"迭代索引"。迭代索引无需从 零开始,但是可应用相对于零基定义的常数偏移量。迭代索引无需以 一的递增来进行,而是还可通过以另一个常数值的递增来进行。


图1是实现本发明的一实施例的基于处理器的系统的示意图; 图2示出根据一个实施例、用于确定下一个块中的初始迭代索引和迭代次数的装置;以及
图3示出本发明的一个实施例的流程图。
具体实施例方式
OpenMP规范包含调度子句,它规定如何将循环的迭代划分为称 作块的毗连非空子集以及如何在线程之间分配这些块。块是循环迭代 的毗连子集,并且可具有定义那个块的范围的初始迭代和最终迭代。 块的大小是它包含的迭代次数。 一种调度方法可用来确定何时将块分 配给线程以及将块分配给哪一个线程。OpenMP允许程序员指定若干 调度方法其中之一。在静态调度方法中,将循环迭代划分为相同大小 的块,并且将块分配给线程,而不管各块涉及多少工作量。在动态调 度方法中,将循环迭代划分为相同大小的块,并且将各"t妄连块分配给 下一个线程,该下一个线程完成处理它^皮分配的前一个块。在指导调 度方法中,将循环迭代划分为大小递减的块,使得接连分配的块的块 大小逐渐减小,并且将各接连块分配给下一个线程,该下一个线程完 成处理它纟皮分配的前一个块。
迭代索引与循环索引之间的关系允许根据其中一个直接计算另一个。
与给定块有关的术语"块索引"可表示在给定块之前分配的块的 数量,因此,要分配的第一块可能具有块索引零。在本发明的一实施 例中,所使用的块索引无需从零开始,但是可应用相对于零基定义的 常数偏移量。在一个实施例中,块索引无需以一的递增来进行,而是 还可通过以另一个值的递增来进行。
当程序执行指导调度时,可在某个接连线程请求下一組迭代时将 属于某个块的迭代的毗连集合分配给该接连线程。最小块大小可以至 少为一。线程可请求并获得某个块,然后执行该块的迭代。线程重复 这些步骤,直到没有剩下待分配的迭代。为了获得大小逐渐减小的接 连块,可将接连块的大小限制为与未分配迭代的次数成正比。使块大小和未分配迭代的次数相关的常数可以是线程数量,使得将块大d 、确 定为等于未分配迭代的次数除以线程数量乘另 一个常数。在确定块大 小时可采用整数舍入。在从上述计算确定的大小比最小块大小更小时, 可将最小块大小用于该块大小。块不能包括该循环中不存在的迭代, 因此,最后 一个块中的实际迭代次数可能比最小块大小更小。
在指导调度方法的一个实施例中,可通过共享变量来表示已经分
配的迭代次数,并且可通过以下步骤来执行块的分配读取共享变量, 以便获得已经分配的迭代次数;在某个算术计算中使用那个值,以便 确定待分配的下一个块的初始和最终迭代;以及然后将已更新值回写 到共享变量,从而反映新的块分配。所存储的实际值可以不是已经分 配的迭代次数。例如,它可以是尚未分配的迭代次数。如果两个线程 试图并发执行上述步骤,则它们可能以获取同一个块结束,使得两次 执行同一个块。可使用锁定来防止这类情况。线程可在读取共享变量 之前获取锁定,并在对该共享变量进行写操作之后将该锁定释放。中 间算术计算可能涉及若干指令,特别是除法,它可能需要大量时间。 锁定的使用可能降低循环执行的速度,因为等待获得另一个块的各线 程必须等待轮到它获取该锁定,并且算术计算可能增加线程保持该锁 定的时间长度,因此增加其它线程的等待时间。
为了提高速度,本发明的一些实施例可允许线程确定待分配的下 一个块的初始和最终迭代索引,而无需保持锁定,并且无需使用需要 采用涉及除法的冗长计算来进行更新的共享变量。
图1示出基于多处理器的系统100的一个实施例。基于多处理器 的系统100可包括编译器115。编译器可以是0^++编译器、Fortran 编译器或者可创建具有循环145或多个循环的编译程序140的任何编 译器。或者,程序可以被解释而不被编译,或者是它们的某种组合(例 如"及时"编译器)。在编译器创建程序140之后,基于多处理器的系 统100可运行程序140。在程序140中初始化循环145时,可将循环 145的块分配^^线程105。当线程105完成对于分配给线程105的块的操作时,线程105可 请求下一个块。可在多处理器或其它多线程系统上执行线程105。在 基于多处理器的系统100上,处理器可执行线程的操作。在处理器上 执行的线程105的操作可包括使用块迭代计算器160根据共享块索引 135来确定块的初始或最终循环索引。
请求下一个块的线程105可根据块中的初始迭代索引和迭代次数 来确定待分配的下一个块的初始和最终迭代。可根据共享块索引135 的值、循环中迭代125的总数以及例如线程数量等的其它参数由封闭 式方程确定块中的初始迭代索引和迭代次数。
共享块索引135可驻留在存储器的共享位置或者共享寄存器中。 块迭代计算器160可在循环145开始时初始化共享块索引,并且每当 线程105请求块时,块迭代计算器160均可使用递增器130来自动读 取并递增共享块索引135的值。
自动读取并递增变量表示读取该变量的值、将该值递增给定常数、 然后将新值回写到该变量,其方式是,任何可观测结果都好像是由另 一个线程对同一个变量的其它任何访问严格地在读取步骤之前或者在 写入步骤之后发生,但不是在读取步骤与写入步骤之间发生。例如, 如果两个线程执行原子读取,并且以递增值二对初始值为零的变量进 行递增,则最终值必须为四。若没有对可观测结果的上述限制,则有 可能让最终值成为二。
例如,可通过可向Intel②(位于加利福尼亚的圣克拉拉)购买的采用 Intel 32位体系结构的处理器和Itanium⑧处理器中存在的取和加 (fetch-and-add)指令来进行对共享变量的原子读取及递增。
增量不一定为一。取决于计算机系统的性质,增量可以是不同于 一的值。例如,如果由于其它某个目的而需要字的低阶位,则递增二 可能是有利的。
一旦块迭代计算器160已经获得块索引,则块迭代计算器160可 确定下一个块的初始和最终循环索引,而无需等待其它线程。当线程完成处理该块时,该线程可请求另一个块。
无需使用与所分配的前一个块有关的循环或迭代索引信息即可确 定下一个块的初始和最终循环索引,v(人而减少确定初始和最终循环索 引的等待时间。
可采用与使用直接支持自动读取和递增的处理器指令不同的方法
来执行自动读取和递增共享块索引135的值的步骤。例如,锁定可在 读取和递增块索引135之前被获取,并在已经将新值回写到块索引之 后被释放。
图2示出用于确定在处理多个块中的一个循环时待分配给线程的 下一个块的初始迭代索引和迭代次数的装置的一实施例。当线程105 请求待分配的下一个块时,线程105可使用图2的实施例。可将图2 的装置用作块迭代计算器160来确定下一个块的初始和最终迭代索 引。该装置可包括第一存储器200,它可存储可在初始化循环之前预 先计算的常数。可由执行该循环的所有线程来共享第一存储器,或者 各线程可具有副本。在一个实施例中,在预先计算了常数之后,递增 器205可使索引递增。递增器205可自动读取并递增索引的值。递增 器205可根据系统要求来使索引递增任何数量。例如,递增器205可 使索引递增一。
在递增器205已经使索引递增之后,第一比较器210可将所检索 的索引值与循环常数之一进行比较。如果所检索的索引值小于该常数, 则第一计算器215可确定待分配给线程105的下一个块中的初始迭代 索引和迭代次数。如果所检索的索引值大于或等于该常数,则第二计 算器220可确定待分配给线程105的下一个块的初始迭代索引。
一旦由第二计算器220确定了待分配给线程的下一个块的初始迭 代索引,第二比较225就可将初始迭代与循环中的迭代总数进行比较。 如果初始迭代索引小于循环中的迭代总数,则第三计算器230可确定 下一个块中的迭代次数。如果初始迭代索引大于或等于循环中的迭代 总数,则已经分配了所有块,并且该装置可以不返回值。 一旦由第一、第二或第三计算器215、 220或230确定了待分配的下一个块中的初始 迭代索引和迭代次数,这些值就可存储在第二存储器235中。
图3示出确定待分配给线程的下一个块的初始迭代索引和迭代次 数的方法的一实施例的流程图。图3的方法可通过硬件、软件或固件 来实现。在该方法通过软件实现时,执行该方法的指令可存储在计算 机可读介质中。在一个实施例中,该方法在300通过预先计算常数a、 c和Sc,开始。在一个实施例中,常数a可等于l-l/(2n),其中的n可 以是线程数量。在一个实施例中,常数c可能等于ceil(loga((2k+l)n/T)), 其中,k可以是用户指定的块中的最小迭代次数,n可以是线程数量, 以及T可以是循环中的迭代总数。在这里,函数"ceil(x)"表示等于或大 于x的最小整数。在一个实施例中,常数Sc,可等于floor((l-ae)T)。在 这里,函数"floor(x)"表示等于或者小于x的最大整数。虽然通过公式 定义了常数,但是一些实施例不限于这些公式。在使用指导调度器来 执行循环时,可指定参数k,其中k是块可包含的最小迭代次数。当 剩余迭代次数小于k时,在一个块中仍然可分配剩余迭代,使得可特 别允许那个块的大小比k更小。
在已经预先计算常数a、 c、 Sc,之后,可在305自动读取并增加索 引,其中,可根据实现该方法的系统的要求来使索引递增一或者另一 数量。读取值i可以是直接在该递增前的值。读取值i用于确定块中的 初始迭代和迭代次数,因为在线程确定它的下一个块时,可由其它线 程使索引递增多次。随后,可将变量i与常数c进行比较,310。如果 变量i小于c,则在315,可根据floor((l-ai)T)和Ci来确定下一个未分 配块的初始迭代索引,可根据floor((l-ai")T)-floor((l-ai)T)来确定待分 配的迭代次数。相对于先前分配块的大小的下一个未分配块中的迭代 次数的增加可使用针对Si和Ci的^^式来进行。可在335返回待分配的 下一个块的初始迭代索引Si和迭代次数Q。下一个块中的初始迭代索 引和迭代次数可用来确定待分配的下一个块的初始和最终循环索引。 然后可将下一个块分配给线程。在310中i大于或等于c时,可根据Sc,+(i-c)k来确定下一个未分配块的初始迭代索引Si, 320。在325,可 将在320确定的起始迭代索引Si与循环中的迭代总数T进行比较。如 果Si小于T,则在330,可根据min(T-Sbk)来确定待分配的迭代次数 Ci。可将初始迭代索引Si和迭代次数d返回(335)并分配给线程。在 325中Si大于或等于T时,因为在340没有剩下待分配的迭代,所以 循环可结束。
如果没有^l丸行菱形框310中在索引与c之间的比较,^f吏得无条件 地按照路线"是",则框315的所得计算结果可能产生小于k乃至零 的迭代次数的值而仍然有至少k个未分配迭代。通过在菱形框310执 行校验可防止这种异常。菱形框325的校验可确定循环是否已经结束 或者是否还有需要分配的迭代。
在方法300中,在实施例开始时,对于各循环可计算一次所计算 的常数。在多线程系统中,线程均可独立计算常数。通过不等待一个 线程完成计算并将常数的值发送给其它线程,允许各线程计算常数可 提高系统的速度。如果在先前已经完成同一个循环之后对该循环重新 初始化,则线程可重新计算常数。
在305,原子读取和递增步骤可使共享块索引递增。这个指令可 阻止其它线程在完成索引的递增之前访问该索引。使用原子操作、如 取和加、比较和交换或者取和减,可避免可能产生于保持锁定的瓶颈。 因为 一次只有一个线程可保持锁定,所以其它线程必须等待轮到它们 获取该锁定。如杲拥有锁定的线程被中断,或者在保持锁定的同时执 行长计算,则这可能产生长延迟。原子操作的一个优点在于,由于操 作的不可分和不可中断的性质,其它线程在操作期间不能访问变量, 因而不需要锁定。为了获得自动读取和递增块索引的效果,使用不可 分和不可中断指令的一个备选方案是获取锁定,执行非原子读取,之 后进行非原子递增,然后释^:该锁定。这仍然允许操作能够比保持锁 定的同时执行除法运算时更快地完成。
本说明书中提到的"一个实施例"或"一实施例"表示结合该实施例描述的具体特征、结构或特性包含在本发明所包含的至少 一个实 现中。因此,短语"一个实施例"或"在一实施例中"的出现不一定 都表示同一个实施例。此外,具体特征、结构或特性可通过与所述具 体实施例不同的其它适当形式来创立,并且所有这类形式均可包含在 本申请的权利要求书中。
虽然结合有限的实施例对本发明进行了描述,但是本领域的技术 人员会从中知道大量的修改和变更。所附权利要求书意在涵盖落入本 发明的真正精神和范围内的所有这类修改和变更。
权利要求
1.一种方法,包括根据索引来确定块的初始迭代和最终迭代这两者中的至少一个。
2. 如权利要求l所述的方法,还包括将所述索引存储在共享变量中。
3. 如权利要求l所述的方法,还包括使所述索引递增。
4. 如权利要求3所述的方法,还包括通过不可分和不可中断的 操作来执行所述递增。
5. 如权利要求l所述的方法,还包括使所述索引递增一。
6. 如权利要求l所述的方法,还包括将所述块分配给线程。
7. 如权利要求l所述的方法,还包括根据所述块中的初始迭代 和一些迭代来确定所述最终迭代。
8. 如权利要求l所述的方法,还包括根据所述块中的最终迭代 和一些迭代来确定所述初始迭代。
9. 一种包含指令的计算机可读介质,所述指令在^支执行时佳羞于 处理器的系统能够执行以下操作根据索引来确定块的初始迭代和最终迭代这两者中的至少一个。
10. 如权利要求9所述的计算机可读介质,还存储在纟皮执行时使 所述基于处理器的系统能够执行以下操作的指令将所述索引存储在 共享变量中。
11. 如权利要求9所述的计算机可读介质,还存储在被执行时使 所述基于处理器的系统能够执行以下操作的指令使所述索引递增。
12. 如权利要求11所述的计算机可读介质,还存储在被执行时使 所述基于处理器的系统能够执行以下操作的指令通过不可分和不可 中断的操作来执行所述递增。
13. 如权利要求9所述的计算机可读介质,还存储在纟皮执行时使 所述基于处理器的系统能够执行以下操作的指令使所述索引递增一。
14. 如权利要求9所述的计算机可读介质,还存储在被执行时4吏 所述基于处理器的系统能够执行以下操作的指令将所述块分配给线 程。
15. 如权利要求9所述的计算机可读介质,还存储在被执行时使 所述基于处理器的系统能够执行以下操作的指令根据所述块中的初 始迭代和一些迭代来确定所述最终迭代。
16. 如权利要求9所述的计算机可读介质,还存储在被执行时使 所述基于处理器的系统能够执行以下操作的指令根据所述块中的最 终迭代和一些迭代来确定所述初始迭代。
17. —种装置,包括 共享存储器并行程序;以及调度器,耦合到所述共享存储器并行程序,用于根据索引来确定 块的初始迭代和最终迭代这两者中的至少 一个。
18. 如权利要求17所述的装置,包括耦合到所述调度器的递增器, 用于使所述索引递增。
19. 如权利要求17所述的装置,包括产生指令的所述共享存储器 并行程序。
20. 如权利要求19所述的装置,包括处理所述指令的处理器。
21. 如权利要求17所述的装置,包括根据所述块中的初始迭代和 一些迭代来确定所述最终迭代的调度器。
22. 如权利要求17所述的装置,包括根据所述块中的最终迭代和 一些迭代来确定所述初始迭代的调度器。
23. —种系统,包括共享存储器并行程序;调度器,耦合到所述共享存储器并行程序,用于根据索引来确定块的初始迭代和最终迭代这两者中的至少一个;以及 编译器,产生处理所述块的指令。
24. 如权利要求23所述的系统,包括耦合到所述调度器的递增器,用于使所述索引递增。
25. 如权利要求23所述的系统,包括处理所述指令的处理器。
26. 如权利要求23所述的系统,包括根据所述块中的初始迭代和 一些迭代来确定所述最终迭代的调度器。
27. 如权利要求23所述的系统,包括根据所述块中的最终迭代和 一些迭代来确定所述初始迭代的调度器。
全文摘要
可通过将循环迭代划分为大小递减的块,在并行处理器上执行循环。通过减少线程在确定待分配给线程的下一组迭代时所花费的时间,可实现速度的提高。可根据共享变量中存储的块索引来确定下一组迭代。使用共享变量使线程能够并发地执行操作,以便减少另一个线程使共享变量递增的时间段的等待时间。
文档编号G06F9/45GK101292225SQ200680039160
公开日2008年10月22日 申请日期2006年10月23日 优先权日2005年10月21日
发明者A·罗比森, G·哈布, J·奇亚 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1