SkySquire 使用教學

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 來操作。只要有寄信就會有。

little.sky@skymizer.com

透過 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

  1. 使用 SkySquire 和使用 alias 有什麼不同?

    alias 只能夠在前方加參數,而 SkySquire 能夠在後方加參數。不幸的是,編譯器的參數通常都是後面的可以蓋掉前面的。所以有許多人用 alias 卻不知道自己已經陷入悲劇當中。

  2. 有其他地方使用類似的技術嗎?

    MPICH 當中的 MPI CC 就是用類似的技巧來修改 compiler 參數。這種方法實際上是很普遍且常見於各式的 open source project 當中。我們只不過是把這工具是放出來而已。

參考資料

  1. SkySquire介紹
  2. 使用SkySquire評估Skymizer Intelligent Compiler優化的可能性

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *