2010-03-02 28 views
19

從手冊頁:make「-j」選項實際上如何工作?

-j [作業],--jobs [=作業] 指定的作業(命令)的數量,以同時運行。 如果有多個-j選項, 最後一個是有效的。如果-j 選項爲 而沒有參數,則make不會限制可同時運行的作業數 。

我知道它使用圖形依賴關係來知道哪些規則是獨立的。

我想知道這個圖是如何構建的,並瞭解使用的標準是什麼。

謝謝。

回答

21

依賴關係圖的基礎,正如人們所期望的那樣,爲每個Makefile目標列出的先決條件。 make將生成一個圖,其中目標和先決條件是頂點,並且從先決條件到其目標有一個有向邊。通過這種方式,傳入邊的數量可以告訴你一個目標有多少個先決條件。如果它沒有傳入邊緣,那麼它沒有先決條件。

例如,.c.h文件的頂點將沒有傳入邊緣。這些文件是您的源文件,不需要構建。

然後它在圖上執行topological sort以確定執行順序。來自Wikipedia:

拓撲排序(拓撲順序)的規範應用是在調度一系列作業或任務;拓撲排序算法首先在20世紀60年代早期在項目管理中用於調度的PERT技術(Jarnagin 1960)中進行了研究。作業由頂點表示,如果作業x必須在作業開始之前完成(例如,洗衣服時,洗衣機必須在衣服乾燥之前完成),則從x到y存在邊緣。然後,拓撲排序給出執行作業的順序。

拓撲排序的要點是找到沒有傳入邊的頂點(無相關性)並將其放在第一位。然後從圖中刪除它們。現在,您將擁有一組沒有傳入邊的新頂點(無相關性)。那是下一個。等到完成。(如果你在沒有這樣的頂點時達到某個點,那麼依賴關係圖包含一個循環,這是一個錯誤條件。)

在一個典型的Makefile中,這意味着您將首先構建源文件(無需任何做完了)。然後依賴這些源文件的對象文件。然後從這些目標文件構建的庫和可執行文件。

在正常的非並行操作下,make只會在每次迭代中選擇一個目標並構建它。當它並行時,它將盡可能多地抓取依賴較少的目標並且並行地構建它們,直到允許的同時作業的數量爲止。

因此,當make得到,例如,對象文件的步驟,它將有大量的圖形中的所有沒有傳入邊緣的頂點。它知道它可以並行構建目標文件,因此它將分叉n副本gcc以構建目標文件。

3

我懷疑你所期望的東西比實際存在的更神奇。 Makefiles包含如下行:

target: prereq1 prereq2 prereq3 ... 

這定義了系統中文件之間的關係;在圖表中,線上的每個由空白分隔的單詞隱式地在圖中聲明節點,並且在冒號左側的每個節點和冒號右側的每個節點之間創建有向邊,從後者指向前者。

從那裏遍歷圖的一個簡單的問題來找到沒有傳入邊的節點並執行與這些節點相關的命令,然後從那裏回溯「上」圖。

希望有所幫助。

+0

並行性是如何實際完成的?我認爲它不是'openmpi' .... – kilojoules