2016年9月28日水曜日

[開發環境] 用 VirtualBox 5.0 在 Windows 7 x64 下使用 Intel Fortran Compiler 及 MPICH 建立 MPI 開發編譯及執行環境


這篇其實挺複雜的,再加上因為時間不怎麼多,所以就只記錄重點了。
這篇主要內容是一個指定要開 16 個 processes 的 fortran 程式,
然後用 MPI 來分散處理 16 個 processes。

要準備的東西

1. VirtualBox 5.0 以上的版本
2. Windows 7 x64 的 iso 檔
3. Intel Fortran Compiler 2016...這個是要錢的,但學生有免費的可以用
4. MPICH2 1.4.1p1
5. Visual Studio 2015...因為 Intel Fortran 跟 VS 有一腿,所以這也是必需品



建置步驟

1. 用 VirtrualBox 建立一台 Windows 7 x64 的虛擬機
2. 安裝 Visual Studio 2015
3. 安裝 Intel Parallel Studio XE 2016
4. 安裝 MPICH 1.4.1p1


用 VirtrualBox 建立一台 Windows 7 x64 的虛擬機
既然要做 MPI 當然就要有很多台電腦。
不過這次的需求沒那麼高,所以只建台虛擬機來用。
當然要建多台也是可以,做法都一樣,所以這邊就不做多台了。

1. 建立新的虛擬機器



↑ 按 [New] 建立一台虛擬機


↑ 隨便取個可以用的名字


↑ 幫它配置記憶體,這邊因為要用 1 台來處理 16 個 processes 所以記憶體就必須要給超大


↑ 選第二個,弄顆新的虛擬硬碟出來


↑ 為了方便就用 VDI 形式就好


↑ 用動態的大小可以避免一次占用掉太多的實體硬碟空間


↑ 中間右邊的按鈕可以選擇 vdi 映像檔存放的路徑,至於大小反正都動態了,就乾脆給大一點


↑ 按[設定]進行更多的設定


↑ 設定顯示用的記憶體大小能越大當然是越好


↑ 設定 CPU 核心數能越多也越好


2. 安裝 Windows 7 x64


就找一個 Windows 7 的 iso 檔自己裝吧...
這部分基本上比較簡單所以就讓我省略吧...w
本來是想這麼說啦...
可是後來想想還是把它補完好了OTL


↑ 找到要被安裝的windows ISO檔


↑ 然後啟動它


↑ 之後就會看到讀取的光棒 然後慢慢等


↑ 再來就會看到安裝 windows 的畫面了 正常應該可以直接下一步


↑ 然後應該也只有 [立即安裝] 的選項可以按了


↑ 慢慢等安裝程式啟動


↑ 然後把根本沒在看的合約打勾 就可以繼續下一步了


↑ 這是一台全新的電腦 所以只能選下面的[自訂]


↑ 接著要分割硬碟 按一下 [磁碟機選項 (進階)]


↑ 按一下 [新增]


↑ 因為我很懶惰不想再分割其他硬碟 所以就直接按 [套用] 了


↑ 然後按 [確定]


↑ 就會看到一個系統保留的空間跟一個空硬碟 然後按 [下一步]


↑ 到這裡就可以慢慢等了


↑ 等這裡跑完之後會自動重開機


↑ 來不及擷取畫面就被重開機了OTL


↑等安裝程式慢慢更新設定


↑ 等安裝程式慢慢啟動服務


↑ 等安裝完成


↑ 等它自動重開


↑ 重開機的過程都 [不需要] 人為介入操作


↑ windows 的開機畫面


↑ 第一次開機會看到的初始化畫面


↑ 等安裝程式檢查視訊效能


↑ 之後就會跳到輸入名稱的畫面了


↑ 然後隨便幫這台電腦取個名稱之後按 [下一步]


↑ 就會跳到輸入密碼的畫面


↑ 這邊建議要輸入密碼 因為之後 MPI 的執行環境有需要所以非輸入不可w


↑ 然後依個人喜好選擇要不要自動更新


↑ 接著設定時間日期


↑ 然後選擇網路型態


↑ 再來就慢慢等了


↑ windows 的歡迎畫面


↑ 然後等待進入桌面


↑ 然後進入桌面 安裝就完成了

接著就是讓 windows 進行自動更新了

一個很麻煩的東西叫做 IE

為了接下來的安裝需求

IE必須要更新到10以上才行



安裝 Visual Studio 2015


不管是用光碟還是ISO檔或是EXE執行安裝檔

總之把它點起來就是了


↑ 然後就會看到安裝啟動畫面


↑ 等它跑初始化


↑ 然後選 [自訂] 安裝


↑ 勾選 [通用 windows 應用程式開發工具]


↑ 勾選 [程式語言]

完成後按 [下一步]


↑ 確認要安裝的項目 然後按 [安裝]


↑ 因為 UAC 沒關掉 所以就會跳出這個 選 [是] 繼續安裝


↑ 然後就慢慢等待了

通常快的話大概半小時到一小時

如果是使用 online 即時下載的話,會依照網路速度變得更久

慢一點的電腦大概可以跑個3~4個小時,甚至更久


↑ 最後就安裝完成了

雖然說是完成,但並沒有說安裝成功...

不過那不要緊,總之就是安裝完了w


安裝 Intel Parallel Studio XE 2016



↑ 把 Intel Parallel Studio XE 2016 安裝檔點起來,然後又是UAC... 只好同意它了


↑ 然後選擇一個解壓縮的路徑

基本上有把下面那個選項打勾的話,只要不是硬碟不夠大或其他問題

對結果來說應該都不會有影響

反正它裝完之後就會自己把這些檔案給砍了XD


↑ 然後就慢慢等...


↑ 安裝畫面

解壓縮完之後會有一小段空白時間

安裝程式會自動被叫起來 所以可以不用理它

然後這個安裝畫面下方的灰色地方

裡面有支根本看不見的綠色光棒的進度條...= =

等它跑完初始化就會開始準備安裝了


↑ 跑完綠色的進度條之後就變成文字了


↑ 安裝引導指南會告訴你有什麼可以裝

但你在這個步驟什麼事也沒得做

所以只能按下一步Σ(゚Д゚)


↑ 安裝程式會進行系統需求評估

他說可能需要重開機

不過其實根本不用理它 只要下一步就好XD


↑ 然後同意這個根本不可能花時間去看的同意書


↑ 接著就要輸入序號了 輸入完按下一步


↑ 這時候就會看到一個藍色點點的圈圈在你的螢幕上一直轉呀轉呀轉的


↑ 之後就會問你要不要幫助他們改善程式 傳送一些不知名的數據給他們

基於開發者的立場,通常沒什麼特殊狀況的話 就選同意吧...


↑ 然後安裝程式會告訴你 它會裝些什麼東西 跟 它要裝去哪裡

這時候可以選擇客製化安裝

自行選擇有需要的部分

不過反正只是一般使用,所以就很偷懶的讓它預設不管了XD


↑ 接著它會告訴你 它要安裝一個 Open Source 的 GDB

然後不用理它 直接下一步


↑ 總共要安裝 144 個元件

這個步驟要花上非常久的時間


↑ 經過了很長一段時間 總算是裝好了


安裝 MPICH 1.4.1p1


至於為什麼 MPICH 有那麼多的版本卻要選擇這版

其實單純又是因為我懶XD

因為這版的安裝是有執行檔可以直接一直按下一步的

比較新的版本後面就沒有執行檔可以這樣按了

比較新的版本都要自己重建

要不然就是要自己手動把檔案搬來搬去

所以雖然 MPICH 已經都有 3.X 了

反正功能性並沒有太大的影響

所以就直接用懶人方法了XD


↑ 把安裝執行檔點起來


↑ 然後歡迎畫面就下一步吧...


↑ 非常多的程式訊息 不過應該沒什麼人會想看 所以就直接下一步吧...


↑ 又是一個不可能看得同意書 就再下一步吧...


↑ 沒什麼需求就讓它維持預設的密碼就好了

這邊它會跟你說 如果你不是 admin 的話就把安裝檔給結束掉不要安裝了= =


↑ 然後選擇安裝路徑

安裝路徑基本上為了開發方便

所以採用原本的預設值

不然每台都裝不一樣的位置之後會很麻煩...0.0


↑ 確認安裝之後就按下一步


↑ 然後就會跳到安裝畫面了


↑ 這時候討人厭的 UAC 又跳出來了 反正也只能同意它了XD


↑ 然後等它的灰色棒棒跑完


↑ 然後防火牆就生氣了0.0

基本上 MPI 就是要走網路通訊

所以也只能乖乖地讓這支程式允許通過防火牆XD


↑ 裝完之後就把它關了

整篇最重要的地方


安裝到這裡基本上就算全部完成了

接著就是要檢查跟設定一些東西

大部分的情況下如果安裝沒有出錯的話

並不需要再安裝其他的套件才對

這時候就可以開始編譯程式了

這次用的編譯程式叫做 mpif77

實際上 mpif77 並不算是編譯器

頂多只能稱作編譯腳本指令而已

而 mpif77 是個基於 OpenMPI 用來編譯 fortran 程式的指令

mpif77 實際上是去呼叫 mpifc 這個 script 把 fortran compiler 給叫起來


↑ mpif77 路徑

mpif77 的預設安裝路徑會在

C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2016.3.207\windows\mpi\intel64\bin


既然都裝好了

所以就直接抓起來編譯看看

切換到執行編譯的工作路徑下

然後開始編譯

這邊又是因為我很懶

在打這篇文章之前就已經試了大概上百次了

所以實在不想要一直重打指令

所以就直接把編譯指令寫成 bat 檔了w

基本上編譯指令大概是

mpif77 -fc=ifort -o outputname f_file1 f_file2 ....


中間因為有些特殊需求

所以加了 /F這個指令

/F 後面接的 0x 值 指的是要將 stack 開到多大

這隻程式不知道為什麼聽說要吃很大的 stack 所以直接使用 /F 指令來擴增 stack 記憶體空間

後面的 /trackback 跟 /check:all 都是用來 debug 用的指令

這樣錯誤的時候才會輸出錯誤訊息可以方便知道程式死在哪裡

然後這邊馬上就遇到錯誤了


↑ 找不到 ifort

這時候 windows 竟然抱怨說找不到最重要的編譯器 ifort ...= ="

沒辦法只好把環境變數打開來看看


↑ 預設狀態的 Path 值

突然發現原來 ifort 的路徑並沒有被加進去

只好手動把 ifort 的路徑加到 Path 裡面

ifort 的預設路徑在

C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2016.3.207\windows\bin\intel64


加完之後再重來一次

這時候又出現了另外一個問題


↑ 這次變成 找不到 link 了

而這個 link 是 VC 的執行檔

這也是為什麼要連帶安裝 VS 的其中一個原因


↑  link 的預設路徑

link 的預設路徑在

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin


同樣把上面這個路徑加進 path 這個變數裡面

然後再重新編譯一次

結果還是出現錯誤...Σ( ̄□ ̄|||)


↑  找不到 ifconsol.lib

這次換成 lib 找不到了


↑ 沒有該有的 libraries 路徑

把所有的變數翻了一輪後發現

竟然沒有我要的 lib 變數Σ(゚Д゚)

所以只好手動新增一個名為 LIB 的變數

然後再把路徑給指定進去

這邊追加 intel compiler 的 libraries 路徑


↑ 追加 LIB 變數路徑

再一次的重新編譯

然後還是錯誤...OTL

這次換成缺少 VC 的 libraries 路徑了@@"

只好再手動追加進 LIB 變數


↑ 追加 LIB 變數路徑

又重新編譯一次

當然還是錯誤...

這次換成 kernel32.lib 找不到了

這個 lib 是 Microsoft 的 SDK library 之一


↑ 缺少 kernel32.lib

所以一樣補上 LIB 路徑

kernel32.lib 的預設路徑在

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib\x64



↑ kernel32.lib 預設路徑


↑ 把路徑加到 LIB 裡

當然又只好再重新編譯了

想當然事情絕對不會那麼單純

一如往常的它又出錯了(´・ω・`)

這次變成 libucrt.lib 找不到了

這個 lib 是屬於 Windows kits 的 lib

預設在

 C:\Program Files (x86)\Windows Kits\10\Lib\<version>\ucrt\x64


↑ 安裝的時候出現了多種版本

然後很神奇的是它有很多個版本

每個版本可能都有些差異

但那對這次的作業來說並沒有太大的影響

所以挑一個你喜歡的版本就好

這邊挑比較新的版本


↑ 找到 libucrt.lib 這個路徑

然後同樣把它加到 LIB 變數裡面


↑ ucrt 路徑

這時候再重新編譯一次

終於...


↑ 編譯完成產生執行檔

雖然還是出現了很多警告

不過至少它終於順利編完了(*´▽`*)

到這邊應該就沒問題了!


檢查


接著使用 VS 內建的開發工具檢查 stack 記憶體的空間大小

指令

dumpbin /headers <exe_file>



↑ dumpbin header 執行結果

從結果來看 stack 被指定成我們要的大小了

stack 要多大就給多大

執行


然後就是實際執行了

因為使用的這版 MPI 是比較舊的版本

所以還是使用 mpiexec 來執行

指令看起來會像是

mpiexec -machinefile <machinefile> -np <num_proc> <exe_dir>



↑ 實際執行結果

程式看起來可以正常的運作

所以應該是沒有什麼太大的問題了


問題

目前還沒有時間解決這些問題

只是暫時找方法把它迴避掉而已

等有時間再來補這段XD

1. forrtrl: severe (47): write to READONLY file
2. forrtrl: severe (170): stack overflow


相關來源

1. MPICH download website

2. Intel Parallel Studio XE

3. Visual Studio