ADS

2007年11月1日 星期四

make in parallel -- option "-j"

這陣子一直有聽到make 後面加上"-j"這樣的傳說
以下是我個人survey後的小小心得,並未作實際實驗確認

首先看一下make的版本:
(在linux底下是可以直接打的,如果你用cygwin請確認你的make路徑已經設定好)

make –v
GNU Make 3.80
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

根據reference 1.
你的GNU make版本必須大於等於3.79才有支援parallel operation, 你剛下完make -v發現不支援,請跳過這篇文章吧!...XD


Parallel compile option:
Make –j N
Option “-j” 是指jobs的意思
當然後面的N是需要指定的,
如果不指定,直接使用"make -j"會讓系統盡可能用它可以調配的資源(推測可能make結束之前整部電腦是hang住狀態)

關於N的指定,有好幾種說法:

說法1-
如果是Dou Core(雙核)或是有HT技術的P4,請用"-j 2",
Quo Core(四核)請用"-j 3"

說法2-
請參閱Ref.3
RAM(MB為單位)/8 + 1為 N的數量
如果有1GB RAM-> 1024/8+1=129
所以可以開"-j 129",真...真的嗎?

說法3-
請參閱Ref.4
N的數值是CPU數量+1
2核用"-j 3", 3核用"-j 4"...

說法4-
直接去GNU.org找的,總該比較正確了吧?請參閱Ref.2
它說,如果你的系統有支援parallel execution,-j是可以讓你限定同時可以開多少job的,
有點像是thread的感覺(無責任亂講,我沒修過OS...@_@)
如果直接打'-j'而沒有任何數字,系統的確會盡可能的搾乾資源達到最高的job數,
所以'-j N'後面的N是為了限制job數量的(如果不用'-j',系統預設是'-j 1'...XD)
*另外裡面也有說DOS並不支援,但是我不知道裝了cygwin的DOS這樣到底能不能work.(來裝linux吧~~(招手))

無責任亂講-
我的想法是,根據我的傳統觀念,
一個CPU在同一個時間點,實際上只能執行一個thread,
'-j N'的N用CPU數量+1,'可能'比較有效率, 當然要注意當前系統的loading吧?
有機會我想試試看直接開'-j'或是開'-j 193'(實驗室桌機有1.5GB RAM...A_A)
或是有人可以回覆我測試心得嗎?

Ref.1(在0.3Building in parallel這一段)
http://gcc.gnu.org/install/build.html
Ref.2(5.7.3 Communicating Options to a Sub-make一開始第五段左右的位置)
http://www.gnu.org/software/automake/manual/make/Options_002fRecursion.html
Ref.3(請找"編譯加速")
http://fanqiang.chinaunix.net/a1/b1/20010427/161025_b.html
Ref.4(請搜尋"-j")
http://www.study-area.org/tips/palm.html

1 則留言:

DragLi 提到...

嗯...答案揭曉了,
在DOS+cygwin的狀態下的確是不能用的,
會顯示jobserver not support...只能用"-j 1"
殘唸~
而且純加"-j"在cygwin底下compile會產生很奇怪的錯誤, 推測是因為racing所引起的~