ACOVEA (Analysis of Compiler Options via Evolutionary Algorithm)是一個測試GCC的C和C++編譯器最佳編譯選項的程序。它的主頁是http://www.coyotegulch.com/products/acovea/。
本文主要是我安裝ACOVEA的經驗,因爲也發現了一些問題,所以記下來。
首先需要下載ACOVEA的安裝庫,當前最新的版本是libacovea-5.1.1.tar.gz,下載地址http://www.coyotegulch.com/distfiles/libacovea-5.1.1.tar.gz。
ACOVEA還依賴其他2個庫,Coyotl(A Collection of Interesting Classess)和Evocosm(A C++ Framework for Evolutionary Computing),主頁分別是:
http://www.coyotegulch.com/products/libcoyotl/index.html
和
http://www.coyotegulch.com/products/libevocosm/index.html
如果你沒有安裝,那麼最好也下載它們的安裝庫,下載地址分別是:
Coyotl
http://www.coyotegulch.com/distfiles/libcoyotl-3.1.0.tar.gz
Evocosm
(Unix/Linux)http://www.coyotegulch.com/distfiles/libevocosm-3.3.0.tar.gz
(Windows VS 2005)http://www.coyotegulch.com/distfiles/EvocosmSetup-3.3.0.msi
同時Coyotl庫又依賴了另一個庫PNG(Portable Network Graphics),主頁爲它的安裝庫可以在http://sourceforge.net/projects/libpng/下載得到。
我的Fedora 8什麼庫都沒有安裝,所以我就是從PNG開始安裝的。
1. 安裝PNG
我下載的是libpng-1.2.24,解壓後按照INSTALL文檔的指示進行安裝,其實只需要3個命令:
./configure
make check
make install
安裝完成後,應該在/usr/local/lib/下出現如下的幾個文件:
-rw-r--r-- 1 root root 650700 02-20 15:00 /usr/local/lib/libpng12.a
-rwxr-xr-x 1 root root 810 02-20 15:00 /usr/local/lib/libpng12.la
-rwxr-xr-x 1 root root 458585 02-20 15:00 /usr/local/lib/libpng12.so
-rwxr-xr-x 1 root root 458585 02-20 15:00 /usr/local/lib/libpng12.so.0
-rwxr-xr-x 1 root root 458585 02-20 15:00 /usr/local/lib/libpng12.so.0.24.0
-rw-r--r-- 1 root root 650700 02-20 15:00 /usr/local/lib/libpng.a
-rwxr-xr-x 1 root root 810 02-20 15:00 /usr/local/lib/libpng.la
-rwxr-xr-x 1 root root 458585 02-20 15:00 /usr/local/lib/libpng.so
-rwxr-xr-x 1 root root 468185 02-20 15:00 /usr/local/lib/libpng.so.3
-rwxr-xr-x 1 root root 468185 02-20 15:00 /usr/local/lib/libpng.so.3.24.0
2. 安裝Coyotl
安裝前必須保證PNG已經安裝成功。我下載的是libcoyotl-3.1.0,在進行安裝之前,我個人認爲需要對libcoyotl-3.1.0/libcoyotl/Makefile.in進行一個修改,把
LIBS = @LIBS@
修改成
LIBS = @LIBS@ -lpng
當然,如果你不修改,也能夠安裝成功,但是由於Coyotl使用了PNG的一些函數(通過包含PNG的頭文件),所以使用Coyotl庫的程序鏈接時就必須手動加上-lpng,而如果你現在創建Coyotl庫的時候就加上,可以在以後的程序裏省點事。
同樣按照INSTALL文檔指示,運行:
./configure
make
make check
make install
安裝完成後,在/usr/local/lib/下應該出現如下幾個文件:
-rwxr-xr-x 1 root root 325596 02-20 15:42 /usr/local/lib/libcoyotl-3.1.so.4
-rwxr-xr-x 1 root root 325596 02-20 15:42 /usr/local/lib/libcoyotl-3.1.so.4.0.0
-rw-r--r-- 1 root root 493528 02-20 15:42 /usr/local/lib/libcoyotl.a
-rwxr-xr-x 1 root root 852 02-20 15:42 /usr/local/lib/libcoyotl.la
-rwxr-xr-x 1 root root 325596 02-20 15:42 /usr/local/lib/libcoyotl.so
3. 安裝Evocosm
Evocosm必須在Coyotl之後進行安裝,我下載的是libevocosm-3.1.0。如果你在前面安裝Coyotl時修改了libcoyotl-3.1.0/libcoyotl/Makefile.in文件,那麼現在可以直接開始安裝了。如果沒有,那麼你需要修改libevocosm-3.1.0/funcopt/Makefile.in文件,把
LIBS = -L../libevocosm -lcoyotl -levocosm
修改成
LIBS = -L../libevocosm -lcoyotl -levocosm -lpng
即加上png庫。
參考它的INSTALL文檔,運行:
./configure
make
make check
make install
安裝完成後應該在/usr/local/lib/裏出現如下幾個文件:
-rwxr-xr-x 1 root root 159518 02-20 15:38 /usr/local/lib/libevocosm-3.1.so.1
-rwxr-xr-x 1 root root 159518 02-20 15:38 /usr/local/lib/libevocosm-3.1.so.1.0.0
-rw-r--r-- 1 root root 251530 02-20 15:38 /usr/local/lib/libevocosm.a
-rwxr-xr-x 1 root root 825 02-20 15:38 /usr/local/lib/libevocosm.la
-rwxr-xr-x 1 root root 159518 02-20 15:38 /usr/local/lib/libevocosm.so
4. 安裝ACOVEA
如果前面的安裝操作都已完成了,那麼可以開始安裝ACOVEA,我下載的是libacovea-5.1.1。按照它的INSTALL文檔指示,運行:
./configure
make
make check
make install
完成後可以用命令runacovea查看安裝是否成功,正常運行結果應該是命令說明:
Acovea 5.1.1 (compiled Feb 20 2008 16:09:50)
Evolving Better Software
Invented by Scott Robert Ladd ([email protected])
Coyote Gulch Productions (http://www.coyotegulch.com)
You didn't specify an input or configuration, so here's some help.
usage: runacovea -config {name} -input {name} [options]
essential options:
-config {config file name} (i.e., -config gcc34_opteron.acovea
-input {source base name} (i.e., -input almabench.c)
options for tuning the evolutionary algorithm:
-n {number of populations to create}
-p {size of each population}
-g {number of generations to run}
-sr {survival rate} (between 0.0 and 1.0)
-mr {mutation rate} (between 0.0 and 1.0)
-cr {crossover rate} (between 0.0 and 1.0)
-ir {immigration rate} (between 0.0 and 1.0)
-no-scaling (no fitness scaling)
-size (optimize for code size)
-retval (optimize for return value)
-seed {random number seed}
example:
runacovea -config gcc34_opteron.acovea -input huffbench.c
5. 安裝Expat
至此acovea雖然已經安裝成功了,但是它其實還需要Expat庫來讀取自己的配置文件,所以你還要保證系統安裝了Expat。Expat的主頁在http://expat.sourceforge.net/。安裝庫可以在http://sourceforge.net/projects/expat/下載。
我下載的是expat-2.0.1,參考它的README文檔,運行:
./configure
make
make install
安裝完成後,在/usr/local/lib/下應該有這幾個文件:
-rw-r--r-- 1 root root 385152 02-20 15:52 /usr/local/lib/libexpat.a
-rwxr-xr-x 1 root root 799 02-20 15:52 /usr/local/lib/libexpat.la
-rwxr-xr-x 1 root root 342906 02-20 15:52 /usr/local/lib/libexpat.so
-rwxr-xr-x 1 root root 342906 02-20 15:52 /usr/local/lib/libexpat.so.1
-rwxr-xr-x 1 root root 342906 02-20 15:52 /usr/local/lib/libexpat.so.1.5.2
6. 使用acovea
OK,現在萬事俱備,只欠東風了!
不過慢着,還有一件事情沒有做:把libacovea-5.1.1/config/和libacovea-5.1.1/benchmarks/下的所有文件分別複製到/usr/share/acovea/config/和/usr/share/acovea/benchmarks/下,前者是針對不同系統的配置文件,後者是測試程序。
現在可以開始看看怎麼使用acovea了,前面提到的runacovea程序就是答案。通過參考它的用法,我們知道只要告訴它適合自己機器的配置文件,和測試程序的代碼文件,就可以進行測試了。
首先根據自己機器的配置,選擇最接近的配置文件,比如我的OS是Fedora 8,運行在Intel奔騰4處理器下,GCC版本4.1.2,那麼我應該選擇的配置文件是
/usr/share/acovea/config /g++40_pentium4.acovea
如果你選擇的配置文件不正確,runacovea可能會異常退出。
然後選擇一個測試文件,比如/usr/share/acovea/benchmarks/huffbench.c。
運行命令:
runacovea -config g++40_pentium4.acovea -input huffbench.c
將開始自動測試過程,這個過程可能要耗費很長的時間。等acovea測試完成後,會輸出測試結果,以下是我的機器的測試結果:
Acovea completed its analysis at 2008 Feb 20 23:12:46
Optimistic options:
-fomit-frame-pointer (2.669)
-mieee-fp (1.843)
Pessimistic options:
-fno-guess-branch-probability (-2.288)
-fno-if-conversion (-2.34)
-fno-loop-optimize (-1.514)
-floop-optimize2 (-1.565)
-fforce-addr (-1.565)
-momit-leaf-frame-pointer (-2.288)
-ffloat-store (-1.772)
-funroll-loops (-2.34)
-fbranch-target-load-optimize (-2.03)
-fbranch-target-load-optimize2 (-1.772)
-mfpmath=387 (-1.668)
-mfpmath=sse,387 (-1.823)
Acovea's Best-of-the-Best:
g++ -lrt -lm -std=gnu99 -O1 -march=pentium4 -fno-merge-constants -fno-thread-jumps -fno-if-conversion2 -ftree-dce -ftree-ter -ftree-sra -ftree-copyrename -ftree-fre -fcrossjumping -foptimize-sibling-calls -fcse-follow-jumps -fgcse -fexpensive-optimizations -fpeephole2 -fschedule-insns -fschedule-insns2 -fregmove -fstrict-aliasing -freorder-blocks -fthread-jumps -fgcse-lm -fsched-interblock -freorder-functions -falign-jumps -falign-loops -finline-functions -funswitch-loops -fomit-frame-pointer -fno-inline -fpeel-loops -ftracer -funswitch-loops -funroll-all-loops -fmodulo-sched -fno-function-cse -fgcse-sm -freschedule-modulo-scheduled-loops -ftree-loop-im -ftree-loop-ivcanon -fivopts -ftree-vectorize -mieee-fp -maccumulate-outgoing-args -minline-all-stringops -mfpmath=sse -funsafe-math-optimizations -fno-signaling-nans -finline-limit=500 -o /tmp/ACOVEA4EB52431 /usr/share/acovea/benchmarks/huffbench.c
Acovea's Common Options:
g++ -lrt -lm -std=gnu99 -O1 -march=pentium4 -fexpensive-optimizations -freorder-blocks -fomit-frame-pointer -fno-inline -fpeel-loops -fno-function-cse -mieee-fp -mfpmath=sse -o /tmp/ACOVEA8DAEFB43 /usr/share/acovea/benchmarks/huffbench.c
-O1:
g++ -lrt -lm -std=gnu99 -O1 -march=pentium4 -o /tmp/ACOVEA9653AF8A /usr/share/acovea/benchmarks/huffbench.c
-O2:
g++ -lrt -lm -std=gnu99 -O2 -march=pentium4 -o /tmp/ACOVEAE542A6DD /usr/share/acovea/benchmarks/huffbench.c
-O3:
g++ -lrt -lm -std=gnu99 -O3 -march=pentium4 -o /tmp/ACOVEA7BAB5CDD /usr/share/acovea/benchmarks/huffbench.c
-O3 -ffast-math:
g++ -lrt -lm -std=gnu99 -O3 -march=pentium4 -ffast-math -o /tmp/ACOVEA0C34078A /usr/share/acovea/benchmarks/huffbench.c
-Os:
g++ -lrt -lm -std=gnu99 -Os -march=pentium4 -o /tmp/ACOVEA5E98DF52 /usr/share/acovea/benchmarks/huffbench.c
A relative graph of fitnesses:
Acovea's Best-of-the-Best: ****************************** (2.16909)
Acovea's Common Options: ********************************* (2.3961)
-O1: ************************************** (2.72188)
-O2: *********************************** (2.53983)
-O3: ************************************ (2.58571)
-O3 -ffast-math: ************************************ (2.59719)
-Os: ************************************************** (3.57661)
Acovea is done.
7. 總結
安裝Acovea的過程相對來說比較複雜,需要許多的庫支持,所以我覺得有必要把所有需要的庫集中到一起,然後寫一個命令來自動安裝所有的東西。所以我寫了如下的一個makefile,只要一個make命令就可以按照所有的庫和Acovea,前提是所有需要的文件都在當前目錄下:
PNG_LIBDIR:=libpng-1.2.24/
COYOTL_LIBDIR:=libcoyotl-3.1.0/
EVOCOSM_LIBDIR:=libevocosm-3.1.0/
EXPAT_LIBDIR:=expat-2.0.1/
ACOVEA_LIBDIR:=libacovea-5.1.1/
TARGET:=/usr/local/bin/runacovea
all : $(TARGET)
png :
@cd $(PNG_LIBDIR) ; chmod +x configure ; ./configure ; $(MAKE) check ; $(MAKE) install
coyotl :
@cd $(COYOTL_LIBDIR) ; chmod +x configure ; ./configure ; $(MAKE) ; $(MAKE) check ; $(MAKE) install
evocosm :
@cd $(EVOCOSM_LIBDIR) ; chmod +x configure ; ./configure ; $(MAKE) ; $(MAKE) check ; $(MAKE) install
expat :
@cd $(EXPAT_LIBDIR) ; chmod +x configure ; ./configure ; $(MAKE) ; $(MAKE) install
acovea :
@cd $(ACOVEA_LIBDIR) ; chmod +x configure ; chmod +x install-sh ; ./configure ; $(MAKE) ; $(MAKE) check ; $(MAKE) install
$(TARGET) : png coyotl evocosm expat acovea
.PHONY : all png coyotl evocosm expat acovea
最後,在http://groups.google.com/group/dl-coder/files有安裝acovea的所有庫文件的集合acovea-5.1.1-collections.rar。