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.
2 則留言:
"Makefile 最常見是用在 Compiler Program 上..."=>compile program? compiler language?
拍謝,打的太習慣了,是 Compile 沒錯 XD。
張貼留言