這篇其實挺複雜的,再加上因為時間不怎麼多,所以就只記錄重點了。
這篇主要內容是一個指定要開 16 個 processes 的 fortran 程式,
然後用 MPI 來分散處理 16 個 processes。
這篇主要內容是一個指定要開 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 所以記憶體就必須要給超大
2. 安裝 Windows 7 x64
就找一個 Windows 7 的 iso 檔自己裝吧...
這部分基本上比較簡單所以就讓我省略吧...w
本來是想這麼說啦...
可是後來想想還是把它補完好了OTL
↑ 之後就會看到讀取的光棒 然後慢慢等
↑ 再來就會看到安裝 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 website2. Intel Parallel Studio XE
3. Visual Studio
0 件のコメント:
コメントを投稿