2012-07-03 256 views
17

有誰知道是否可以用gcc來編譯MPI?我需要使用gcc,沒有mpicc如何用gcc編譯MPI?

+0

這是可能的,但你爲什麼要?通常情況下,封裝的編譯器(這裏是mpicc)更方便,並且會以某種方式進行優化。 – Hbcdev

回答

0

mpicc已經使用gcc作爲後端

+1

奇怪,我的'mpicc'使用'icc'作爲後端... –

0

是的,你當然可以編譯MPI程序沒有mpicc包裝的便利性。在大多數實現中,mpicc是一個shell腳本(或類似的),用於設置環境變量,查找和鏈接各種庫,以及其他所有可以放入Makefile的東西。

我建議你找到mpicc腳本的一個實例,解構它。

21

mpicc只是圍繞某一套編譯器的包裝。大多數實現都有他們的mpicc包裝理解一個特殊選項,如-showme(Open MPI)或-show(Open MPI,MPICH和派生),它提供了包裝器傳遞給後端編譯器的完整選項列表。

例如,在打開MPI,包裝是讀純文本的配置文件和構建是在編譯器進一步通過命令行選項C++程序。 mpicc -showme顯示這種選項的完整列表:

$ mpicc -showme 
icc 
-I/opt/MPI/openmpi-1.5.3/linux/intel/include 
-I/opt/MPI/openmpi-1.5.3/linux/intel/include/openmpi 
-fexceptions 
-pthread 
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib 
-Wl,-rpath,/opt/MPI/openmpi-1.5.3/linux/intel/lib 
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib 
-L/opt/MPI/openmpi-1.5.3/linux/intel/lib 
-lmpi 
-ldl 
-Wl,--export-dynamic 
-lnsl 
-lutil 

(這是真的,我在這裏拆分以提高可讀性單行)英特爾C編譯器icc作爲後端

它特定的情況下,編譯器,但我們也有使用GCC的變體。你也可以用mpicc -showme:compile獲得所需COMPLE階段(通常稱爲CFLAGS)選項列表:

$ mpicc -showme:compile 
-I/opt/MPI/openmpi-1.5.3/linux/intel/include 
-I/opt/MPI/openmpi-1.5.3/linux/intel/include/openmpi 
-fexceptions 
-pthread 
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib 

還有,你需要傳遞給連接器(稱爲LDFLAGS)選項列表與mpicc -showme:link

$ mpicc -showme:link 
-fexceptions 
-pthread 
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib 
-Wl,-rpath,/opt/MPI/openmpi-1.5.3/linux/intel/lib 
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib 
-L/opt/MPI/openmpi-1.5.3/linux/intel/lib 
-lmpi 
-ldl 
-Wl,--export-dynamic 
-lnsl 
-lutil 

這些可以使用,例如在Makefile,像這樣:

... 
CFLAGS += $(shell mpicc -showme:compile) 
LDFLAGS += $(shell mpicc -showme:link) 
... 

據我所知-showme:compile-showme:link是特定於Open MPI和其他實現只有當-show叫給的選項的完整列表。

我仍然認爲直接使用mpicc會更好,因爲如果它發生MPI設置中的某些內容發生更改,它將立即反映在包裝中,而您必須手動更改構建腳本/ Makefile(除非使用-showme:compile-showme:link自動獲取選項)。

2

mpicc -compile_info的MPICH。

0

是的,你可以實際使用gcc。但在我的情況下(在Ubuntu)mpicc只是GCC的包裝,在這裏被命令mpicc -showme的輸出:

gcc -I/usr/lib/openmpi/include/openmpi/opal/mca/event/libevent2021/libevent -I/usr/lib/openmpi/include/openmpi/opal/mca/event/libevent2021/libevent/include -I/usr/lib/openmpi/include -I/usr/lib/openmpi/include/openmpi -pthread -Wl,-rpath -Wl,/usr/lib/openmpi/lib -Wl,--enable-new-dtags -L/usr/lib/openmpi/lib -lmpi 

雖然Open MPI docs

開放MPI團隊強烈建議您只需使用Open MPI的「包裝器」編譯器來編譯您的MPI應用程序。也就是說,不是使用(例如)gcc編譯你的程序,而是使用mpicc。

我們重複上述說法:Open MPI團隊強烈建議使用包裝編譯器來編譯和鏈接MPI應用程序。 如果您發現自己說「但我不想使用包裝編譯器!」,請幽默我們並嘗試它們。看看他們是否適合你。一定要讓我們知道他們是否不適合你。許多人基於他們的「包裝編譯器吸!」!在20世紀90年代中期由於執行不力的封裝編譯器對不良行爲的心態。這些日子好多了,包裝器編譯器幾乎可以處理任何情況,並且比您嘗試手動對Open MPI特定的編譯器和鏈接器標記進行硬編碼更可靠。這就是說,使用包裝器編譯器可能會產生一些問題 - 例如嵌套多個項目的多個包裝器編譯器的情況非常少。因此,Open MPI提供了一種解決方法,以找出編譯MPI應用程序所需的命令行標誌。

這個答案對您有用。