SkySquire 是個萬用小刀,讓你可以輕鬆修改其他程式預設行為。
今天如果要修改一個 open source project 的編譯參數,你會怎麼做?
你會試著去了解所有的編譯過程,修改 Makefile 或者是各式各樣的設定檔?相信我,這是一件繁瑣而且可怕的事情,非常容易出錯而無法察覺。我們曾經花了兩個月研究 MESA 的效能變化,卻發現編譯器優化的參數沒有辦法傳遞到整個 project 當中;也曾發現 open source project 當中的編譯器的優化參數其實從來沒有被 Makefile 傳遞過。為了解決參數傳遞問題,我們也曾經大改 Android 的 nijia,好讓我們能夠針對不同的檔案下不同的編譯參數。
研究 building system, 如 automake, CMake, nijia, bazel,在一開始是讓人興奮的。隨著時間過去,人會老,心會老,時間值得花在更美好的事物上。
所以我們開放了 SkySquire,幫助你不用再去深入檢查各種 building system,就可以確保參數有被正確傳遞給編譯器。
你可以利用 SkySquire 來改變 gcc/clang 預設的編譯參數,使其預設就加上 -O3 等等的優化參數。省去麻煩事,讓你多點時間陪陪最愛的人。
安裝 SkySquire
請與我們接洽取得 SkySquire 的安裝檔。他是免費的,依法需要有辦法讓人拒絕合約,所以在「不同意」的按鈕還沒有設計好之前,只好先用 email 來操作。只要有寄信就會有。
透過 rpm 安裝
$ sudo rpm -ivh ./skysquire-1.0-1.rpm
透過 deb 安裝
$ sudo dpkg -i ./skysquire-1.0-1.deb
安裝之後,SkySquire 的可執行檔會被安裝在 /usr/bin 底下,至於 README 等文件會被安裝在 /usr/share/skysquire 底下。
要驗證是否安裝成功,只需要執行
$ skysquire -h
應該會看到如下的內容:
Usage:
skysquire -mark-high [path of compiler]
...
Skymizer Evaluator version 1.0.3
http://www.skymizer.com
恭喜你,已經安裝成功。
SkySquire 使用方式
SkySquire 最常用的使用方式,是將編譯器設定在高水位與低水位,用來驗證是否能夠進行編譯器優化。
將編譯器設定在高/低水位
假設我們要設定的編譯器,是系統的 gcc,路徑在 which gcc
底下。又由於是要修改系統的 gcc,所以我們會需要 root 權限,利用 sudo 來取得 root 權限。
設定高水位
$ sudo skysquire -mark-high `which gcc`
設定低水位
$ sudo skysquire -mark-low `which gcc`
每次設定完,應該都會看到類似的訊息:
----------------------------------------
high-mark -O3
----------------------------------------
這就表示你已經設定好了高水位
列出當前的設定
可以使用 -l
或者 -list
參數列出當前的設定:
$ skysquire -l -verbose=3
應該會看到類似這樣的訊息:
/// */// ......... /// ....... ... ... .... .... ... ......... ......... ... ... ///////// /// //// /// *//////*////,//// */// ///////// ///////// ///*/// /// /// //// /// */// /// /// /// */// //// /// /// //// ///////// /////// ///./// /// /// /// */// ///// ///////// /// /// /// ///. ////// /// /// /// */// .//// /// /// ///////// /// ///* //// /// /// /// */// ///////// ///////// /// ///// Copyright (c) 2017 Skymizer Taiwan, Inc. ------------------------------------------------------------------------ • high-mark -O3 locate in file://usr/bin/gcc ------------------------------------------------------------------------
-l/-list
只會列出使用者自己的設定。如果有多個使用者同時設定相同的編譯器,則該編譯器會按照不同使用者的設定來執行。也就是說,如果使用者 A 將 gcc 設定在高水位,使用者 B 將 gcc 設定在低水位,則彼此不會互相干擾。
清除編譯器的設定
清除設定的方式也蠻簡單的,只要執行 -unmark
即可清除設定。
$ sudo skysquire -unmark `which gcc`
多使用者清除編譯器設定可能會造成問題,要清除設定之前請確認沒有其他人也有設定該編譯器。
如果不確定編譯器是否有其他人也設定了,可以利用下列指令來暫停設定:
$ sudo evaluate -tool `which gcc` -mark
任意的設定參數
使用 -tool
與 -mark
可以對某一工具,任意的設定其預設的參數。舉例來說,下列指令將系統的 gcc 都加上 -fno-inline
參數:
$ sudo evaluate -tool `which gcc` -mark -fno-line
在 -mark
之後的所有字串,都會被當作是要設定的參數,因此必須要先下 -tool
才能下 -mark
。
顯示更多的資訊
如果你想要 SkySquire 顯示更多的資訊,如被設定的工具位置,設定的參數等等,你可以透過 -verbose
和 -v
來調整 verbose level。
$ sudo skysquire -verbose=3
-v
出現的次數就相當於 verbose level,舉例來說,下面指令將 verbose level 設定為 3
$ sudo skysquire -v -v -v
-quiet
會把 verbose level 設定為 0。
以 echo 作為例子
我們要利用 echo 來說明 SkySquire 內部做了什麼。下列是我們的 echo 的 script:
#!/bin/bash
echo "I got $*";
這個 script 做的事情就是列出他所收到的所有 script。
今天我們要在執行 echo.sh 的時候就自動加上 number one!
這個參數。執行下列指令
$ evaluate -tool ./echo.sh -mark number one!
這樣當我們執行 echo.sh
的時候,就相當於執行 echo.sh [orignal options] number one!
$ ./echo.sh Skymizer
I got Skymizer number one!
我們可利用 skysquire -list
來檢查使用者所有被包裝的 tool
$ skysquire -list /// */// ......... /// ....... ... ... .... .... ... ......... ......... ... ... ///////// /// //// /// *//////*////,//// */// ///////// ///////// ///*/// /// /// //// /// */// /// /// /// */// //// /// /// //// ///////// /////// ///./// /// /// /// */// ///// ///////// /// /// /// ///. ////// /// /// /// */// .//// /// /// ///////// /// ///* //// /// /// /// */// ///////// ///////// /// ///// Copyright (c) 2017 Skymizer Taiwan, Inc. ------------------------------------------------------------------------ • high-mark -O3 locate in file://usr/bin/gcc • echo.sh number one! locate in file://home/luba/examine/echo.sh ------------------------------------------------------------------------
FAQ
- 使用 SkySquire 和使用 alias 有什麼不同?
alias 只能夠在前方加參數,而 SkySquire 能夠在後方加參數。不幸的是,編譯器的參數通常都是後面的可以蓋掉前面的。所以有許多人用 alias 卻不知道自己已經陷入悲劇當中。
-
有其他地方使用類似的技術嗎?
MPICH 當中的 MPI CC 就是用類似的技巧來修改 compiler 參數。這種方法實際上是很普遍且常見於各式的 open source project 當中。我們只不過是把這工具是放出來而已。