聯(lián)系我們 - 廣告服務(wù) - 聯(lián)系電話:
您的當(dāng)前位置: > 關(guān)注 > > 正文

【并行開(kāi)發(fā)】mpjdaemon批處理命令中的問(wèn)題分析

來(lái)源:CSDN 時(shí)間:2023-01-12 10:23:21

在前面的兩個(gè)PART中,我們分別搭建了并行開(kāi)發(fā)環(huán)境,并小試牛刀實(shí)踐了簡(jiǎn)單的并行開(kāi)發(fā)。

當(dāng)然在這個(gè)過(guò)程中,出現(xiàn)這樣或那樣的問(wèn)題是在所難免的,這一部分我們就來(lái)討論一下其中可能會(huì)遇到的問(wèn)題。

問(wèn)題1:當(dāng)我們搭建好開(kāi)發(fā)環(huán)境后,我們需要試用一下mpjdaemon批處理命令,此時(shí)可能遇到的一個(gè)問(wèn)題是: Port is not available,如下圖所示。


(資料圖片僅供參考)

問(wèn)題在于端口不可用。我們根據(jù)提示找到配置文件mpjexpress.conf所在的文件夾,然后用記事本把它打開(kāi),如下所示。可見(jiàn),默認(rèn)情況下port.1=10000,port.2=10001。

此時(shí),我們只需對(duì)端口進(jìn)行調(diào)整,例如修改為下面這種結(jié)果(當(dāng)然,應(yīng)該保證8888和8889并沒(méi)有被占用)

修改完成后保存文件,問(wèn)題即得到解決。

問(wèn)題2:注意到我們把解壓后的MPJ Express文件存于路徑“D:\mpj-v0_43”下,并相應(yīng)的將環(huán)境變量MPJ_HOME賦值為D:\mpj-v0_43。如果我們將文件存于路徑“D:\Program Files\mpj-v0_43”下,并相應(yīng)的修改環(huán)境變量賦值,將會(huì)有什么變化?

這似乎是一個(gè)看起來(lái)完全不是問(wèn)題的問(wèn)題,但是一旦我們這樣做了,當(dāng)再使用mpjdaemon批處理命令時(shí),就會(huì)遇到下面這種情況。

結(jié)果顯示報(bào)錯(cuò)了!

Error: Unable to access jarfile D:\Program

系統(tǒng)沒(méi)有辦法訪問(wèn)相應(yīng)的jar文件。但是為什么?這是因?yàn)镻rogram Files這個(gè)文件夾的名字不合法。這種文件夾的名字在Windows中當(dāng)然沒(méi)有任何問(wèn)題,對(duì)于我們?nèi)粘5拇蠖鄶?shù)應(yīng)用開(kāi)發(fā)而言這也不會(huì)成為一個(gè)問(wèn)題。但是在MPJ Express中,文件夾的名字中間是不能包含有“空格”的。我們都知道,在控制臺(tái)中輸入一條指令時(shí),空格通常是用來(lái)間隔操作符與操作數(shù)的,或者可以認(rèn)為空格也是有意義的,因此MPJ Express中的批處理命令在解析一個(gè)帶有空格的路徑名的時(shí)候就會(huì)產(chǎn)生混亂。這就是問(wèn)題所在。所以只要我們把MPJ Express文件的存放路徑稍作調(diào)整即可消除此類問(wèn)題。

此外,在命令行中查看當(dāng)前環(huán)境變量設(shè)置情況的一個(gè)簡(jiǎn)單方法是使用echo指令,例如

問(wèn)題3:上一個(gè)問(wèn)題除了會(huì)發(fā)生在控制臺(tái)操作界面上以外,在Eclipse中也會(huì)出現(xiàn)。回想在PART2中,我們?cè)O(shè)置VM arguments參數(shù)時(shí)是這樣寫(xiě)的

-jar D:/mpj-v0_43/lib/starter.jar

-np 4

可見(jiàn)我們使用了一個(gè)絕對(duì)路徑!而更多的時(shí)候我們都習(xí)慣于寫(xiě)相對(duì)路徑,此時(shí)用戶需要在菜單欄中選擇"Window",然后在下拉菜單中選擇"Preferences",如下所示。

然后在從左側(cè)的列表中選擇“String Substitution”,并新建一個(gè)“變量替換”,如下所示。

完成上述步驟后,我們就可以使用形如下面這種情況的相對(duì)路徑了。

-jar ${MPJ_HOME}/lib/starter.jar

這里我們需要注意,MPJ_HOME的值仍然不能等于一個(gè)有空格的路徑,否則就會(huì)出現(xiàn)下面這個(gè)錯(cuò)誤,原理與問(wèn)題2相同,這里不再贅述。

問(wèn)題4:最后我們討論一下在命令下編譯運(yùn)行并行程序的方法。

首先編輯下列代碼并將其存入一個(gè)名為HelloWorld.java的文件中。

import mpi.*;

public class HelloWorld{

public static void main(String[] args)  throws Exception

{

MPI.Init(args);

int me = MPI.COMM_WORLD.Rank();

int size = MPI.COMM_WORLD.Size();

System.out.println            ("Hi from " + me + " of " + size + "\n");

MPI.Finalize();

}

}

編譯指令示例: javac -cp .;%MPJ_HOME%/lib/mpj.jar HelloWorld.java

執(zhí)行指令示例: mpjrun.bat -np 4 HelloWorld  a //其中a是一個(gè)任意指定的參數(shù)

執(zhí)行結(jié)果,如下所示。

上面這種情況是執(zhí)行并行計(jì)算的第一種場(chǎng)景,即在多核配置下執(zhí)行MPJ Express 程序。

我們通過(guò)mpjrun.bat -np 后面的數(shù)字來(lái)指定核的數(shù)量。

另外一種場(chǎng)景是在集群(Cluster)配置下執(zhí)行MPJ Express 程序。

集群配置: 如果開(kāi)發(fā)人員期望在分布式內(nèi)存平臺(tái)(包括集群和計(jì)算機(jī)網(wǎng)絡(luò))上執(zhí)行并行JAVA程序,那么他們就會(huì)采樣這種配置場(chǎng)景。

對(duì)于這種集群配置,一共有四種選項(xiàng),如下:

1) niodev - 使用 Java NIO Sockets

2) mxdev - 使用 Myrinet eXpress (MX) library for Myrinet networks

3) hybdev - 針對(duì)多核處理的集群

4) native - 使用一個(gè) native MPI library (curretly only tested under MS-MPI for Windows)

具體使用時(shí)寫(xiě)一個(gè)名為"machines"的文件,并在其中指定用于并發(fā)執(zhí)行的所有主機(jī)名或IP地址。

執(zhí)行方法

對(duì)于 niodev, hybdev and mxdev

1) 開(kāi)啟守護(hù): mpjdaemon.bat -boot

- 你將需要在每一個(gè)開(kāi)啟守護(hù)的機(jī)器上手動(dòng)地執(zhí)行該命令。

2) 執(zhí)行指令示例: mpjrun.bat -np 4 -dev niodev HelloWorld

-- 其中 -dev 里面的 device可以是 niodev, hybdev 或 mxdev

3) 終止守護(hù)指令: mpjdaemon.bat -halt

對(duì)于 native

1) 編譯 JNI wrapper library(具體編譯方法請(qǐng)參見(jiàn)MPJ Express的相關(guān)幫助文檔)

2) 執(zhí)行指令示例: mpjrun.bat -np 4 -dev native HelloWorld

全文完。

責(zé)任編輯:

標(biāo)簽:

相關(guān)推薦:

精彩放送:

新聞聚焦
Top