多台計算機一起編譯
1. 兩台win7電腦如何實現並行運算
.首先確定需要的硬體組件和資源。您將需要一個頭節點,至少有十幾個相同的計算節點,乙太網交換機,配電裝置和機架。確定的電力需求,散熱和空間要求。又決定您要為您的專用網路IP地址,命名為節點,您要安裝的軟體包,你想要什麼樣的技術提供的並行計算能力(更多關於這個版本)。雖然硬體不能隨意下載,所有軟體中列出的是免費的,大部分都是開源的。 (2)/建立計算節點。您將需要組裝的計算節點,或獲得預構建伺服器。更多的計算節點,建立更強大的超級計算機!選擇一台伺服器機箱,空間,冷卻和能源效率最大化。或者,你可以用十幾個這樣用的,過時的伺服器 - 其整體將超過其部分的總和還為您節省了相當大的一次性現金。為整個系統一起玩的很好,所有的處理器,網路適配器和主板應該是相同的。當然,不要忘了內存和存儲每個節點和至少一個光碟驅動器的頭節點。
3.伺服器安裝到機架上。從底部開始,機架不是最重。你需要一個朋友來幫助你這一點 - 高密度伺服器可以非常重,並引導他們到機架上的導軌有困難的。
4.以上的伺服器機箱中安裝的乙太網交換機。利用這一時刻對交換機進行配置:允許9000個位元組的巨型幀大小,設置IP地址的靜態地址,您在步驟1中決定,並關閉不必要的路由協議,如SMTP偵聽。
5.安裝的PDU(電源分配單元)。您可能需要根據您的節點可能需要多少電流在最大負載,220伏的高性能計算。
6.一切都安裝,就可以開始配置過程。 linux是事實上的OS為HPC集群不僅是科學計算的理想環境,但將它安裝到數百甚至上千個節點,它不花費一件事。試想一下,所有這些節點上安裝Windows的成本會是多少呢?首先安裝最新版本的主板BIOS和固件,這應該是相同的所有節點上。您的首選的Linux發行版,安裝在每個節點上,一個圖形用戶界面的頭節點。受歡迎的選擇,包括的CentOS,OpenSUSE中,紅帽企業Linux和SLES。本文作者強烈建議用Rocks集群分布。除了安裝所有必要的工具,計算群集功能,岩石許多情況下本身的節點,速度非常快,使用PXE引導和Red Hat的腳開始「程序」分派「使用一個很好的方法。
7.安裝的消息傳遞介面,資源管理器,以及其他必要的庫。如果你沒有安裝岩石在上一步中,你將不得不手動設置必要的軟體,以使並行計算的機制。首先,你將需要一台攜帶型的bash的管理系統,如Torque資源管理器,它允許你分手,並分發到多台機器的任務。對扭矩的毛伊島集群調度完成安裝。接下來,您將需要安裝的消息傳遞介面,獨立的計算節點上的各個進程必須共享相同的數據。 OpenMP是一個沒有腦子。不要忘了多線程數學庫和編譯器來構建並行計算程序。我提到,你應該只安裝岩石?
8.網路計算節點。頭節點的計算節點,而這又必須將返回的結果,以及發送消息給對方發送計算任務。速度越快越好。接線吧!使用專用的乙太網網路連接在集群中的所有節點。頭節點也可以作為一個NFS,PXE,DHCP,TFTP,NTP伺服器通過乙太網網路。從公共網路,確保廣播數據包不與其他網路的干擾,在你的區域網,就必須將這個網路。
9.測試群集。過去的事情做之前,你可能要釋放所有用戶的計算能力是測試它的性能。的HPL(高性能Lynpack)的基準測量的集群的運算速度是一個受歡迎的選擇。您需要將自己從源碼編譯所有可能的優化編譯器提供你所選擇的體系結構。當然,你必須從源代碼編譯為您的平台與所有可能的優化選項。例如,如果使用的是AMD的CPU,編譯與Open64的與0fast優化水平。 TOP500在世界上最快的500台超級計算機集群的比較,比較的結果!
提示
使用Ganglia監控節點上的計算負載。 IPMI可以提供的KVM-over-IP,遠程電源循環,多一個大型的集群管理的一件輕而易舉的事。對於非常高的網路速度,到InfiniBand網路介面。准備,但支付較高的價格。
2. 為什麼要用openmp+mpi混合編程技術求π
MPI(MPI是一個標准,有不同的具體實現,比如MPICH等)是多主機聯網協作進行並行計算的工具,當然也可以用於單主機上多核/多CPU的並行計算,不過效率低。它能協調多台主機間的並行計算,因此並行規模上的可伸縮性很強,能在從個人電腦到世界TOP10的超級計算機上使用。缺點是使用進程間通信的方式協調並行計算,這導致並行效率較低、內存開銷大、不直觀、編程麻煩。
OpenMP是針對單主機上多核/多CPU並行計算而設計的工具,換句話說,OpenMP更適合單台計算機共享內存結構上的並行計算。由於使用線程間共享內存的方式協調並行計算,它在多核/多CPU結構上的效率很高、內存開銷小、編程語句簡潔直觀,因此編程容易、編譯器實現也容易(現在最新版的C、C++、Fortran編譯器基本上都內置OpenMP支持)。不過OpenMP最大的缺點是只能在單台主機上工作,不能用於多台主機間的並行計算!
如果要多主機聯網使用OpenMP(比如在超級計算機上),那必須有額外的工具幫助,比如 MPI + OpenMP 混合編程。或者是將多主機虛擬成一個共享內存環境(Intel有這樣的平台),但這么做效率還不如混合編程,唯一的好處是編程人員可以不必額外學習MPI編程。
3. 如何加快linux android 的編譯速度
項目越來越大,每次需要重新編譯整個項目都是一件很浪費時間的事情。Research了一下,找到以下可以幫助提高速度的方法,總結一下。
1. 使用tmpfs來代替部分IO讀寫
2.ccache,可以將ccache的緩存文件設置在tmpfs上,但是這樣的話,每次開機後,ccache的緩存文件會丟失
3.distcc,多機器編譯
4.將屏幕輸出列印到內存文件或者/dev/null中,避免終端設備(慢速設備)拖慢速度。
tmpfs
有人說在Windows下用了RAMDisk把一個項目編譯時間從4.5小時減少到了5分鍾,也許這個數字是有點誇張了,不過粗想想,把文件放到內存上做編譯應該是比在磁碟上快多了吧,尤其如果編譯器需要生成很多臨時文件的話。
這個做法的實現成本最低,在Linux中,直接mount一個tmpfs就可以了。而且對所編譯的工程沒有任何要求,也不用改動編譯環境。
mount -t tmpfs tmpfs ~/build -o size=1G
用2.6.32.2的Linux Kernel來測試一下編譯速度:
用物理磁碟:40分16秒
用tmpfs:39分56秒
呃……沒什麼變化。看來編譯慢很大程度上瓶頸並不在IO上面。但對於一個實際項目來說,編譯過程中可能還會有打包等IO密集的操作,所以只要可能,用tmpfs是有益無害的。當然對於大項目來說,你需要有足夠的內存才能負擔得起這個tmpfs的開銷。
make -j
既然IO不是瓶頸,那CPU就應該是一個影響編譯速度的重要因素了。
用make -j帶一個參數,可以把項目在進行並行編譯,比如在一台雙核的機器上,完全可以用make -j4,讓make最多允許4個編譯命令同時執行,這樣可以更有效的利用CPU資源。
還是用Kernel來測試:
用make: 40分16秒
用make -j4:23分16秒
用make -j8:22分59秒
由此看來,在多核CPU上,適當的進行並行編譯還是可以明顯提高編譯速度的。但並行的任務不宜太多,一般是以CPU的核心數目的兩倍為宜。
不過這個方案不是完全沒有cost的,如果項目的Makefile不規范,沒有正確的設置好依賴關系,並行編譯的結果就是編譯不能正常進行。如果依賴關系設置過於保守,則可能本身編譯的可並行度就下降了,也不能取得最佳的效果。
ccache
ccache工作原理:
ccache也是一個編譯器驅動器。第一趟編譯時ccache緩存了GCC的「-E」輸出、編譯選項以及.o文件到$HOME/.ccache。第二次編譯時盡量利用緩存,必要時更新緩存。所以即使"make clean; make"也能從中獲得好處。ccache是經過仔細編寫的,確保了與直接使用GCC獲得完全相同的輸出。
ccache用於把編譯的中間結果進行緩存,以便在再次編譯的時候可以節省時間。這對於玩Kernel來說實在是再好不過了,因為經常需要修改一些Kernel的代碼,然後再重新編譯,而這兩次編譯大部分東西可能都沒有發生變化。對於平時開發項目來說,也是一樣。為什麼不是直接用make所支持的增量編譯呢?還是因為現實中,因為Makefile的不規范,很可能這種「聰明」的方案根本不能正常工作,只有每次make clean再make才行。
安裝完ccache後,可以在/usr/local/bin下建立gcc,g++,c++,cc的symbolic link,鏈到/usr/bin/ccache上。總之確認系統在調用gcc等命令時會調用到ccache就可以了(通常情況下/usr/local /bin會在PATH中排在/usr/bin前面)。
安裝的另外一種方法:
vi ~/.bash_profile
把/usr/lib/ccache/bin路徑加到PATH下
PATH=/usr/lib/ccache/bin:$PATH:$HOME/bin
這樣每次啟動g++的時候都會啟動/usr/lib/ccache/bin/g++,而不會啟動/usr/bin/g++
效果跟使用命令行ccache g++效果一樣
這樣每次用戶登錄時,使用g++編譯器時會自動啟動ccache
繼續測試:
用ccache的第一次編譯(make -j4):23分38秒
用ccache的第二次編譯(make -j4):8分48秒
用ccache的第三次編譯(修改若干配置,make -j4):23分48秒
看來修改配置(我改了CPU類型...)對ccache的影響是很大的,因為基本頭文件發生變化後,就導致所有緩存數據都無效了,必須重頭來做。但如果只是修改一些.c文件的代碼,ccache的效果還是相當明顯的。而且使用ccache對項目沒有特別的依賴,布署成本很低,這在日常工作中很實用。
可以用ccache -s來查看cache的使用和命中情況:
cache directory /home/lifanxi/.ccachecache hit 7165cache miss 14283called for link 71not a C/C++ file 120no input file 3045files in cache 28566cache size 81.7 Mbytesmax cache size 976.6 Mbytes
可以看到,顯然只有第二編次譯時cache命中了,cache miss是第一次和第三次編譯帶來的。兩次cache佔用了81.7M的磁碟,還是完全可以接受的。
distcc
一台機器的能力有限,可以聯合多台電腦一起來編譯。這在公司的日常開發中也是可行的,因為可能每個開發人員都有自己的開發編譯環境,它們的編譯器版本一般是一致的,公司的網路也通常具有較好的性能。這時就是distcc大顯身手的時候了。
使用distcc,並不像想像中那樣要求每台電腦都具有完全一致的環境,它只要求源代碼可以用make -j並行編譯,並且參與分布式編譯的電腦系統中具有相同的編譯器。因為它的原理只是把預處理好的源文件分發到多台計算機上,預處理、編譯後的目標文件的鏈接和其它除編譯以外的工作仍然是在發起編譯的主控電腦上完成,所以只要求發起編譯的那台機器具備一套完整的編譯環境就可以了。
distcc安裝後,可以啟動一下它的服務:
/usr/bin/distccd --daemon --allow 10.64.0.0/16
默認的3632埠允許來自同一個網路的distcc連接。
然後設置一下DISTCC_HOSTS環境變數,設置可以參與編譯的機器列表。通常localhost也參與編譯,但如果可以參與編譯的機器很多,則可以把localhost從這個列表中去掉,這樣本機就完全只是進行預處理、分發和鏈接了,編譯都在別的機器上完成。因為機器很多時,localhost的處理負擔很重,所以它就不再「兼職」編譯了。
export DISTCC_HOSTS="localhost 10.64.25.1 10.64.25.2 10.64.25.3"
然後與ccache類似把g++,gcc等常用的命令鏈接到/usr/bin/distcc上就可以了。
在make的時候,也必須用-j參數,一般是參數可以用所有參用編譯的計算機CPU內核總數的兩倍做為並行的任務數。
同樣測試一下:
一台雙核計算機,make -j4:23分16秒
兩台雙核計算機,make -j4:16分40秒
兩台雙核計算機,make -j8:15分49秒
跟最開始用一台雙核時的23分鍾相比,還是快了不少的。如果有更多的計算機加入,也可以得到更好的效果。
在編譯過程中可以用distccmon-text來查看編譯任務的分配情況。distcc也可以與ccache同時使用,通過設置一個環境變數就可以做到,非常方便。
總結一下:
tmpfs: 解決IO瓶頸,充分利用本機內存資源
make -j: 充分利用本機計算資源
distcc: 利用多台計算機資源
ccache: 減少重復編譯相同代碼的時間
這些工具的好處都在於布署的成本相對較低,綜合利用這些工具,就可以輕輕鬆鬆的節省相當可觀的時間。上面介紹的都是這些工具最基本的用法,更多的用法可以參考它們各自的man page。
5.還有提速方法是把屏幕輸出重定向到內存文件或/dev/null,因對終端設備(慢速設備)的阻塞寫操作也會拖慢速度。推薦內存文件,這樣發生錯誤時,能夠查看。