星期一, 3月 28, 2011

How to execute command in parallel ?

We have two main idea to execute command in parallel.

  • Makefile
  • xargs -P

Makefile

Makefile 最常見是用在 Compiler Program 上,但是如果單純看成一個指令相依的執行器,倒是真的蠻方便的 XD,這個方法不是沒有缺點,就是整個 Makefile 的內容我傾向使用寫程式一直 print XD,當然有空可以好好的研究 Makefile 本身的撰寫方式。舉個例子來說

all: echo0 echo1 echo2 echo3
echo0:
	echo "0"
echo1:
	echo "1"
echo2:
	echo "2"
echo3:
	echo "3"

這時候我們只要在 shell 下執行

make -f filename -j4

4 代表最多可以同時執行 4 process,通常這得看你的 cpu 個數,如果不知道呢。我通常是採用一個偷作弊方式。我會把 command 打成

make -f filename -j`grep processor /proc/cpuinfo | wc -l`

看的懂的話就會知道,這其實是一個很投機取巧的方式,我嘗試使用 sysctl 去尋找相關參數,但是不盡人意,所以暫時還是用這樣子的方式。

用這個方法的好處是,Makefile 的彈性很高,壞處嗎 ... 我都使用 Pyhton 快速生出我要的 Makefile,如果有什麼變動,就要執行 Python,然後再生一次再 run 一次 (這肯定是我事前沒規畫好 XD),可以執行多個指令,如果 Makefile 撰寫的好,做到簡單的中止程式之後繼續是有可能的 (試想想跳電的時候 XD)。

xargs -P

這本身也是一個不錯的方式,不過格式比較死 XD 先看一個簡單的例子。

echo {1..1024} | xargs -n 1 -P 4 echo

這個例子本身會印出 1~1024,不一定是照正常順序, -P 指的是 process 個數, -n 指的是一次讀一行做為 xargs 本身的參數,這個方式的好處是,pipe 完之後就接塞給 xargs 去執行,做一些簡單的事就不用這麼麻煩撰寫一個 Makefile,壞處是,xargs 是固定給同一個 command 餵參數,所以也不能做太複雜的事(當然你可以說餵的是 bash XD)。有一個簡單的惡搞例子 XD

find . -type f -name "*.cpp" | xargs -n 1 -P 4 g++ -g -o -Wall

其實這一行只是單純的編譯 *.cpp 然後一次最多可以 4 個 process 同時進行 XD。當然我們也可以寫一個檔案如下 ...

a.cpp
b.cpp
c.cpp
...

那麼我們就可以把上述的指令改成 ...

xargs -n 1 -P 4 g++ -g -o -Wall < input_filename

暫時做一個破爛的筆記 XD 有空再來想想更好玩的技巧 XD? 會寫這篇的原因是,我只是想用很單純的方式把 CPU 用完,而且,跑實驗數據的時候我還蠻需要這個招式的 XD。

---
A simple note.