2012-09-05 41 views
3

我有一個makefile,編譯並運行一個相當大的程序集,以產生輸出。有些程序是單線程的,有些使用OpenMP在多個CPU內核上運行。相當一部分任務需要很長時間才能運行,所以傳遞一個「-j」選項以使單線程程序能夠並行運行會很有用。但是,OpenMP任務已經使用了所有可用的CPU核心(以及相當多的RAM),因此它們應該一次運行一個。運行使用單線程和多線程食譜的混合

是否有一個標誌可以附加到在makefile中使用OpenMP的任務,以防止其他任務與其並行運行,同時允許其他任務在其他時間並行運行?我認爲.NOTPARALLEL特殊目標完全禁用了所有的並行性。

+2

http://savannah.gnu.org/patch/?5108正是我正在尋找的,但還沒有被納入GNU make。歡迎進一步的想法。 – user1649641

回答

0

我能想到的三種可能性:

1)做,如果他們彼此依賴,不會並行運行的任務。 所以你可以嘗試通過向你想單獨運行的目標添加虛假依賴來欺騙make。例如,聲明您的OpenMP目標取決於所有串行目標的輸出。 2)你也許也可以將你的Makefile分成兩個不同的:一個用於OpenMP目標,不會並行運行,另一個用於串行運行。這意味着您在OpenMP和串行目標之間沒有交叉依賴關係。

3)拆分編譯和運行。按照你的意願使用bash腳本來運行。

+0

1是不合需要的,並且會造成破壞,並且會導致食譜在不必要時重新運行。使用makefile的重點是隻重建那些已經改變的。 – user1649641

+0

2 - 告訴我更多關於此的信息 - 不幸的是,某些串行配方確實取決於某些OpenMP配方,反之亦然。 – user1649641

+0

3 - 然後我不會有辦法在make的控制下構建整個批次,確保只重建已更改的配方。 – user1649641