要使用 OMPT,需要在系統(tǒng)上安裝和運(yùn)行 Oracle Solaris 11。除了安裝過程中使用的 root 權(quán)限之外,運(yùn)行任何 OMPT 實(shí)用程序通常無需任何其他特殊權(quán)限。
成都創(chuàng)新互聯(lián)公司從2013年開始,先為桐鄉(xiāng)等服務(wù)建站,桐鄉(xiāng)等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為桐鄉(xiāng)企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
如果您想編譯 MPI 程序,則需要安裝 Oracle Solaris Studio 12.1 或更高版本。在運(yùn)行 MPI 程序的節(jié)點(diǎn)集群上,可以在其中一個(gè)節(jié)點(diǎn)上安裝 Oracle Solaris Studio 并僅在該節(jié)點(diǎn)上編譯 openmpi-15 程序包,但在所有節(jié)點(diǎn)上都安裝該程序包。
要獲取 OMPT,請(qǐng)安裝 openmpi-15 程序包,該程序包由一個(gè)映像包管理系統(tǒng) (IPS) 信息庫托管,您的系統(tǒng)上應(yīng)配置有該信息庫。要驗(yàn)證是否配置了 IPS 信息庫,請(qǐng)運(yùn)行 pkg publisher 命令。
如果尚未 配置 IPS 信息庫,請(qǐng)?jiān)趪L試添加 openmpi-15 程序包之前配置它。否則,程序包添加將失敗。
系統(tǒng)應(yīng)配置了網(wǎng)絡(luò)訪問(如果是通過網(wǎng)絡(luò)訪問 IPS 信息庫)或本地配置的從同一系統(tǒng)提供服務(wù)的 IPS 信息庫。
本文示例使用了本地配置的 IPS 信息庫,如 pkg publisher 命令的以下輸出所示,該輸出指示 IPS 信息庫通過 HTTP 托管在 localhost 上。
root@solarix:/usr/share/distro_const# pkg publisher
PUBLISHER TYPE STATUS URI
solaris origin online
驗(yàn)證配置了信息庫之后,以 root 身份運(yùn)行 pkg install openmpi-15 命令添加該分發(fā)構(gòu)造器程序包。然后從 IPS 信息庫下載 openmpi-15 程序包并立即安裝。
pkg install openmpi-15 命令顯示進(jìn)程的狀態(tài),如清單 1 所示,這樣便于觀察進(jìn)度。
清單 1:pkg install openmpi-15 命令的輸出
root@solarix:~# pkg install openmpi-15
Creating Plan
Packages to install: 2
Create boot environment: No
DOWNLOAD PKGS FILES XFER (MB)
service/picl 0/2 0/1430 0.0/11.9[K
developer/openmpi-15 1/2 1430/1430 11.9/11.9[K
Completed 2/2 1430/1430 11.9/11.9[K
PHASE ACTIONS
Install Phase 1639/1639
PHASE ITEMS
Package State Update Phase 1/2
Package State Update Phase 2/2
Image State Update Phase 1/2
Image State Update Phase 2/2
PHASE ITEMS
Reading Existing Index 1/8
Reading Existing Index 5/8
Reading Existing Index 8/8
Indexing Packages 2/2
安裝完 openmpi-15 程序包之后,只需在 PATH 變量中包括 /usr/openmpi/ompi-15/bin,然后就一切準(zhǔn)備妥當(dāng)。
使用 OMPT 編譯 MPI 程序
使用 OMPT 編譯 MPI 程序有兩種方式。您可以使用程序包中包含的編譯器包裝器(mpicc、mpiCC、mpif77 和 mpif90)或者直接調(diào)用編譯器。
因?yàn)樾枰?include、library 和 run 路徑,建議采用第一種方法。包裝器將其不了解的所有選項(xiàng)都傳給 Oracle Solaris Studio 編譯器,因此您應(yīng)能夠使用包裝器實(shí)用程序替換 makefile 中編譯器的所有實(shí)例。
以清單 2 作為示例 MPI 程序,可以使用一行命令編譯程序:
mpicc hello.c -o hello.x
清單 2:示例 hello.c 程序
#include stdio.h
#include mpi.h
int main(int argc, char **argv) {
int np, me;
MPI_Init(argc,argv);
MPI_Comm_size(MPI_COMM_WORLD,np);
MPI_Comm_rank(MPI_COMM_WORLD,me);
printf("hello from %d of %d\n", me, np);
MPI_Finalize();
return 0;
}
還可以執(zhí)行兩階段的編譯和鏈接:
mpicc -c hello.c
mpicc hello.o -o hello.x
如果要直接執(zhí)行編譯器而不使用包裝器,可以通過向包裝器提供 -showme 選項(xiàng)來確定包裝器使用的選項(xiàng):
mpicc -showme hello.c -o hello.x
使用 OMPT 運(yùn)行 MPI 程序
編譯完可執(zhí)行文件并與 OMPT 庫鏈接之后,可以單獨(dú)運(yùn)行該程序或使用并行作業(yè)啟動(dòng)器實(shí)用程序 mpirun 來運(yùn)行。
要單獨(dú)運(yùn)行程序,只需運(yùn)行該可執(zhí)行文件,就跟普通非并行可執(zhí)行文件一樣。但是,隨后將由該程序來負(fù)責(zé)調(diào)用相應(yīng)的 MPI API(如 MPI_Comm_spawn 或 MPI_Comm_spawn_multiple)來生成 MPI 作業(yè)的其他進(jìn)程。
要一開始就創(chuàng)建運(yùn)行多個(gè)進(jìn)程的 MPI 作業(yè),請(qǐng)使用 mpirun 實(shí)用程序。例如,如果您要使用總共 8 個(gè)進(jìn)程在 2 個(gè)節(jié)點(diǎn)上運(yùn)行我們的示例 MPI 程序,可以使用以下命令:
mpirun -np 8 -host hostname1,hostname2 hello.x
有幾個(gè)選項(xiàng)可以與 mpirun 一起用來控制綁定、布局、輸出重定向等等。通過執(zhí)行 mpirun -h 或 man mpirun 可以獲取有關(guān)這些選項(xiàng)的更多信息。
可在第三方軟件中,如pl/sql中編譯。
1、打開pl/sql軟件并登錄到指定數(shù)據(jù)庫。
2、點(diǎn)擊左上方像紙片的按鈕,然后點(diǎn)擊“sql窗口”
3、在彈出窗口中編寫自定義函數(shù)。
4、編寫完畢后,直接點(diǎn)擊左上角像齒輪的按鈕(即執(zhí)行按鈕),就可以編譯了。
包只是作為 程序的一個(gè)載體而已,你要運(yùn)行,當(dāng)然是去調(diào)用它!
包里面可以包含函數(shù)、過程等,你可以開發(fā)程序時(shí)候調(diào)用包里面的這些程序!沒有聽說過包怎么運(yùn)行的道理!
就像電視機(jī)(包)可以用來看電視,但是你不去打開它(調(diào)用包),它就沒有作用!
樓下的明顯誤導(dǎo)別人啊,包何來參數(shù)之說?只有包里面的程序才有參數(shù),調(diào)用包里面過程的方法如下:
begin
exec 包名.過程名();
end;
函數(shù)的調(diào)用就不用我寫了吧!
emp表是oracle安裝包里的example,它屬于scott,確認(rèn)一下這個(gè)表是否存在:
select owner,object_type from dba_objects where object_name='EMP';
如果這個(gè)表存在,出現(xiàn)這個(gè)錯(cuò)誤,有以下幾個(gè)原因:
1.這個(gè)包的所有者沒有對(duì)emp表的select權(quán)限
2.雖然有權(quán)限,但在引用它的時(shí)候必需明確這個(gè)表的schema,也就是上面那個(gè)查詢的owner,你應(yīng)該用scott.emp
包頭
create or replace package package_name is
prcedure p1;
prcedure p2(v1 in char, v2 in date);
end package_name;
包體
create or replace package body package_name is
prcedure p1 is
begin
--代碼省略
end p1;
prcedure p2(v1 in char, v2 in date) is
begin
--代碼省略
end p2;
end package_name;
//通過編寫的連接類創(chuàng)建一個(gè)連接
dbconn db = new dbconn();
Connection con1 = db.conn;
String callSQL1 = new String();
ResultSet rs1 = null;
//創(chuàng)建一個(gè)CallableStatement變量st1來調(diào)用存儲(chǔ)過程信息
CallableStatement st1 = null;
try {
st1 = con1.prepareCall("{ call p(?,?,?,?) }");
st1.setString(1, "參數(shù)1");
st1.setString(2, "參數(shù)2");
st1.setString(3, "參數(shù)3");
st1.registerOutParameter(4,Types.INTEGER); //此處4 代表第一個(gè)"?" 則表示存儲(chǔ)過程返回的值 這里要注意Types的類型,當(dāng)需要有返回值時(shí)
st1.execute();
System.out.println(st1.getInt(4));//輸出存儲(chǔ)過程的返回值,當(dāng)有返回值時(shí)
} catch (Exception error) {
try {
con1.rollback(); //操作不成功則回退
} catch (Exception ex9) {
ex9.printStackTrace();
}
out.print("系統(tǒng)出錯(cuò)" + error.getMessage());
} finally {
try {
if (st1 != null) {
st1.close();
}
} catch (Exception error) {
}
db.disconnect();
}