【问题标题】:How does the make "-j" option actually work?make "-j" 选项实际上是如何工作的?
【发布时间】:2010-03-02 22:19:54
【问题描述】:

来自手册页:

-j [工作], --jobs[=工作] 指定同时运行的作业(命令)的数量。 如果有多个 -j 选项, 最后一个有效。如果 -j 选项是 不带参数给出,make 不会限制作业的数量 可以同时运行。

我知道它使用图依赖来了解哪些规则是独立的。

我想知道这个图表是如何构建的,并了解使用的标准是什么。

谢谢。

【问题讨论】:

    标签: makefile


    【解决方案1】:

    正如人们所期望的那样,依赖关系图基于为每个 Makefile 目标列出的先决条件。 make 将构建一个图,其中目标和先决条件是顶点,并且从先决条件到它们的目标有一条有向边。通过这种方式,传入边的数量告诉您目标有多少个先决条件。如果它没有传入边,那么它没有先决条件。

    例如,.c.h 文件的顶点将没有传入边。这些文件是您的源文件,不需要构建。

    然后它在图上执行topological sort 以确定执行顺序。来自维基百科:

    拓扑排序(拓扑顺序)的规范应用是调度一系列作业或任务;拓扑排序算法是在 1960 年代初期在项目管理中用于调度的 PERT 技术的背景下首次研究的(Jarnagin 1960)。作业由顶点表示,如果作业 x 必须在作业 y 开始之前完成,则从 x 到 y 有一条边(例如,洗衣服时,洗衣机必须在我们把衣服晾干之前完成)。然后,拓扑排序给出了执行工作的顺序。

    拓扑排序的要点是找到没有传入边(无依赖关系)的顶点并将它们放在首位。然后将它们从图表中删除。现在您将拥有一组没有传入边(无依赖关系)的新顶点。接下来就是这些了。以此类推,直到完成。 (如果你曾经到达没有这样的顶点的点,那么依赖图包含一个循环,这是一个错误条件。)

    在典型的 Makefile 中,这意味着您将首先构建源文件(无需执行任何操作)。然后是依赖于这些源文件的目标文件。然后是从这些目标文件构建的库和可执行文件。

    在正常的非并行操作下,make 将在每次迭代中简单地选择一个目标并构建它。当它是并行时,它将尽可能多地获取无依赖性目标并并行构建它们,最多允许同时工作的数量。

    所以当make 到达目标文件步骤时,它会在图中有大量没有传入边的顶点。它知道它可以并行构建目标文件,因此它分叉出 ngcc 的副本来构建目标文件。

    【讨论】:

      【解决方案2】:

      我怀疑你期待的东西比这里实际存在的更神奇。 Makefile 包含以下行:

      target: prereq1 prereq2 prereq3 ...
      

      这定义了系统中文件之间的关系;用图的说法,行上的每个空格分隔的单词都隐含地声明了图中的一个节点,并且在冒号左侧的每个节点和冒号右侧的每个节点之间创建了一条有向边,从后者指向前者。

      从那里开始,只需遍历图以查找没有传入边的节点并执行与这些节点关联的命令,然后从那里“向上”处理图。

      希望对您有所帮助。

      【讨论】:

      • 并行性实际上是如何完成的?我认为不是openmpi....
      猜你喜欢
      • 2010-12-06
      • 1970-01-01
      • 2021-01-21
      • 2011-09-27
      • 2021-12-16
      • 2013-03-14
      • 2021-03-23
      • 2011-02-11
      • 2017-07-31
      相关资源
      最近更新 更多