如何在 Oracle Solaris 11 上编译和运行 MPI 程序

如何在 Oracle Solaris 11 上编译和运行 MPI 程序,第1张

要使用 OMPT,需要在系统上安装和缺友运行 Oracle Solaris 11。除了安装过程中使用的 root 权限之外,运行任何 OMPT 实用程序通常无需任何其他特殊权限。

如果您想编译 MPI 程序,则需要安装 Oracle Solaris Studio 12.1 或更高版本游毕。在运行 MPI 程序的节点集群上,可以在其中一个节点上安装 Oracle Solaris Studio 并仅在该节点上编译 openmpi-15 程序包,但在所有节点上都安装该程序包。

要获取 OMPT,请安装 openmpi-15 程序包,该程序包由一个映像包管理系统 (IPS) 信息库托管,您的系统上应配置有该信息库。要验证是否配置了 IPS 信息库,请运行 pkg publisher 命令。

如果尚未 配置 IPS 信息库,请在尝试添加 openmpi-15 程序包之前配置它。否则,程序包添加将失败。

系统应配置了网络访问(如果是通过网络访问 IPS 信息库)或本地配置的从同一系统提供服务的 IPS 信息库。

本文示例使用了本地配置的 IPS 信息库,如 pkg publisher 命令的以下输出所示,该输出指示 IPS 信息库通过 HTTP 托管在 localhost 上。

root@solarix:/usr/share/distro_const# pkg publisher

PUBLISHER TYPE STATUS URI

solaris origin online http://localhost/

验证配置了信息库之后,以 root 身份运行 pkg install openmpi-15 命令添加该分发构造器程序包。然后从 IPS 信息库下载 openmpi-15 程序包并立即安装。

pkg install openmpi-15 命令显示进程的状态伏磨槐,如清单 1 所示,这样便于观察进度。

清单 1:pkg install openmpi-15 命令的输出

root@solarix:~# pkg install openmpi-15

Creating Plan

Packages to install: 2

Create boot environment: No

DOWNLOAD PKGS FILESXFER (MB)

service/picl 0/2 0/1430 0.0/11.9[K

developer/openmpi-15 1/2 1430/143011.9/11.9[K

Completed 2/2 1430/143011.9/11.9[K

PHASEACTIONS

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 Packages2/2

安装完 openmpi-15 程序包之后,只需在 PATH 变量中包括 /usr/openmpi/ompi-15/bin,然后就一切准备妥当。

使用 OMPT 编译 MPI 程序

使用 OMPT 编译 MPI 程序有两种方式。您可以使用程序包中包含的编译器包装器(mpicc、mpiCC、mpif77 和 mpif90)或者直接调用编译器。

因为需要包含的 include、library 和 run 路径,建议采用第一种方法。包装器将其不了解的所有选项都传给 Oracle Solaris Studio 编译器,因此您应能够使用包装器实用程序替换 makefile 中编译器的所有实例。

以清单 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

}

还可以执行两阶段的编译和链接:

mpicc -c hello.c

mpicc hello.o -o hello.x

如果要直接执行编译器而不使用包装器,可以通过向包装器提供 -showme 选项来确定包装器使用的选项:

mpicc -showme hello.c -o hello.x

使用 OMPT 运行 MPI 程序

编译完可执行文件并与 OMPT 库链接之后,可以单独运行该程序或使用并行作业启动器实用程序 mpirun 来运行。

要单独运行程序,只需运行该可执行文件,就跟普通非并行可执行文件一样。但是,随后将由该程序来负责调用相应的 MPI API(如 MPI_Comm_spawn 或 MPI_Comm_spawn_multiple)来生成 MPI 作业的其他进程。

要一开始就创建运行多个进程的 MPI 作业,请使用 mpirun 实用程序。例如,如果您要使用总共 8 个进程在 2 个节点上运行我们的示例 MPI 程序,可以使用以下命令:

mpirun -np 8 -host hostname1,hostname2 hello.x

有几个选项可以与 mpirun 一起用来控制绑定、布局、输出重定向等等。通过执行 mpirun -h 或 man mpirun 可以获取有关这些选项的更多信息。

MPI(message passing interface),游握悄是一个消息传递接口。MPI的函数总共有287个。

想实现一个MPI并行计算的程序的话,只要掌握MPI的工作机理和6个简单的MPI函数便可以了,本文介绍4个简单MPI函数:MPI_INIT、MPI_COMM_RANK、MPI_COMM_SIZE和MPI_FINALIZE。

注意:以下调用格式为Fortran格式,大部分教程都是C语言的MPI介绍,这里以及以后的文章都是以Fortran为基础,尤其要注意Fortran不分大小写。

先给出一个最简单的Hello_world的Fortran + MPI的程序,在此基础上来分析MPI的4个最简单的函数——MPI_INIT、MPI_COMM_RANK、MPI_COMM_SIZE和MPI_FINALIZE。

MPI_Init用来初始化MPI执行环境,建立多个MPI进程之间的联系,为后续通信做准备。

MPI_Finalize则是结束MPI执行环境。

MPI_Comm_rank就是来标识各个MPI进程的,告诉调神渣用该函数的进程“我是谁?”。

MPI_COMM_SIZE用来标识相应进程组中有多少个进程。

2.1. 将以上内容保存为hello_world.f90,上传到服务器的文件夹/home/xldeng/mpi里面:

2.2. 编译hello_world.f90为hello_world,并用ls查看内容:

2.3. 使皮基用服务器里面的命令来调用不同的节点上面的核来计算:

3.1 . 注意程序中的一个小细节:

含义为调用mpi的库函数,因为使用的是Intel MPI + Fortran90,所以调用的方式为:use mpi。Fortran77可能需要 include "mpif.h"。

3.2 . 在2.2节中的mpiifort是ifort的并行使用方法,检验mpiifort的用法:which mpiifort或者是mpiifort -v。

3.3 . 在2.3节中的说明:本程序的运行平台为服务器上,所以使用的是 MPI使用指南 | 武汉大学超算中心 中提供的提交方法。如果在单台服务器上面,可以使用如下命令:

来运行程序。

我会。

入门的话推荐你学习下MPI编程,

目前并行计算基本上有:MPI、OPENMP、OPENCL、OPENGL、CUDA

你只是想体验的话用OPENMP最省事了,一句话就可以达陵埋到并行的效果

代码我可以给你,但你要配好环境。先给你裸敲一个hello world的MPI程序吧

#include<stdio.h>

#include<mpi.h>

int main (int argc,char *argv[])

{

    int mypid ,numprocs

    MPI_Init(&argc,&argv) // 并行开始

    MPI_Comm_size(MPI_COMM_WORLD,&numprocs) //获取进程数

    MPI_Comm_rank(MPI_COMM_WORLD,&mypid) //获取本进程ID号

    printf("hello world! i am %d process of %d processes",mypid,numporcs)

    MPI_Finalize() //并行结束

}

这就是MPI版的hello world 程序,你需要在编译的时候确定同时打开几个进程,比如说4个,程序可能运行结果为:

hello world! i am 2 process of 4 processes

hello world! i am 1 process of 4 processes

hello world! i am 0 process of 4 processes

hello world! i am 3 process of 4 processes

为什么说可能呢,因为四个进程同时在执行上局汪散面的那段代码,哪个进程先结束哪个就先输出就这个道理。

想学并行编程的话桐氏,建议你在linux下学习。

望采纳


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12302371.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存