在之前的一篇博文中(Linux下mpi环境配置与执行步骤(Ubuntu为例) ),有讨论过如何使用MPI在两个不同的机器上执行程序,在那篇博文中使用了超级用户权限。不幸的是,有些情况下,我们不能拥有操作系统的超级用户权限,导致我们不能修改除用户目录以外的目录,因此写这篇博文讨论如何使用普通用户来实现mpi程序的编译和双机器执行。如果知道了如果双机器执行,多机器道理是相通的。

此文针对没有多少linux经验的读者,只要你会打开终端,这个问题可以被很好的解决。

前提

假设有两台机器,两台机器的主机名称分别为A、B,并且知道两台机器的IP(如果你不知道,请咨询管理员),假设A机器的IP为192.168.1.5,机器B的ip为192.168.1.6;

假设在两台机器上有同一个用户名为讲述方便,暂时假设这个用户名为demo;

假设两台机器上安装了完全相同的mpi版本。

不满足假设条件,请绕行。

步骤

完成无需超级用户mpi程序的编译和执行,分以下几步:

1、设置两台机器上PATH,使得在两台机器上分别可以执行mpicc --version命令。

2、设置两台机器相互之间可以免密码登陆。

3、执行自己的程序

1、设置两台机器上的PATH

假设你现在在A机器上,使用的是demo账户。

打开终端(Terminal),执行如下命令:

mpicc --version

如果上面的命令得到类似如下结果,直接可以去第2步:

gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

如果得到类似如下结果,则继续。

mpicc: command not found

打开终端,执行如下命令

echo "export PATH=`locate mpicc | grep -v '^/home/' | grep -E '/mpicc$' | sed 's/\/mpicc$//'`:$PATH" >> ~/.bashrc

关闭终端,打开一个新的终端,再执行mpicc --version看看结果是否正确,如果还是不正确,这里就暂时不写此种情况下的解决方案了(穷尽所有情况太麻烦了)。

执行如下命令来登陆B机器(前提中假设了B机器的IP为192.168.1.6),在提示输入密码的时候,输入用户的密码,因为我们假设用的是demo用户,你此时要输入的是demo的密码。注意密码并不显示,输入完成后,直接敲击回车即可。

ssh demo@192.168.1.6

如果成功登陆,执行如下命令:

echo "export PATH=`locate mpicc | grep -v '^/home/' | grep -E '/mpicc$' | sed 's/\/mpicc$//'`:$PATH" >> ~/.bashrc

然后执行exit命令退出机器B。

2、设置两台机器之间相互无密码登陆。

仍然假设现在用的是机器A(IP为192.168.1.5),打开终端,执行如下命令

ssh-keygen -t rsa

上面的命令在执行的时候可能要等待你的输入,不要输入任何内容,直接敲击回车即可。

执行如下命令:

ssh demo@192.168.1.6 mkdir -p .ssh

执行上述命令后,会等待你输入demo在机器B(假设的IP为192.168.1.6)上的密码,输入密码后,敲击回车。

执行如下命令:

cat .ssh/id_rsa.pub | ssh demo@192.168.1.6 'cat >> .ssh/authorized_keys'

执行如下命令,以登陆B机器:

ssh demo@192.168.1.6

继续执行如下命令:

ssh-keygen -t rsa

遇到让输入yes或者no的地方是如yes或者y。遇到其他情况的等待输入,一律敲击回车。

cat .ssh/id_rsa.pub | ssh demo@192.168.1.5 'cat >> .ssh/authorized_keys'

最后执行如下命令,以推出机器B

exit

完成上面的命令后,就可以实现demo用户在两个机器之间无密码相互登陆了。

3、执行自己的程序

仍然假设你在A机器上,ip的相关假设继续保持。

将程序拷贝到A机器上,对于没有linux经验的读者,请特别注意你拷贝的程序在哪个目录下,如果你不能在终端下找到自己的程序,那么这一切你都白做了。

假设你的程序拷贝到了A机器的/home/demo/目录下,那么你打开终端之后,执行 cd ~/ 即可进入这个目录。

在终端中进入源代码目录后,如果你的程序有Makefile,直接执行make命令即可(一般人写的makefile,这样执行会产生可执行文件的,如果不是一般人写的,请咨询写makefile的人)。

由于我们使用的两个机器是独立的,他们之间没有共享磁盘,你若要使用mpi在两个机器上执行,你必须将在A机器上生成的可执行程序拷贝到B机器上。如果你不了解mpi的执行方式,请保证在两个机器上的可执行程序存放在同一个目录下。

为方便,你可以把程序放到用户根目录(~/ 就是用户根目录),然后再拷贝到B机器上。

拷贝程序的命令如下(假设你的程序叫main.exe)

scp ~/main.exe demo@192.168.1.6:~/

下面你要新建一个文本文件,这个文本文件第一行写A机器的IP,第二行写B机器的IP。文件名随意,最好使用英文。

我门假设的A、B两个机器的IP分别是192.168.1.5和 192.168.1.6,所以我们的文件中可以这样写

192.168.1.5
192.168.1.6

假设我门命名这个文件为hosts,并且保存在~/目录下,那么我门就可以打开终端,启动我们的程序了。

cd ~/
mpiexec -f ./hosts -n 2 ./main.exe

结束语

如果你是linux新手(不知道怎么使用终端的都是新手),一定要严格执行每一个命令,按照说明一步步执行。注意命令中的下划线,短线,英文点 .,大小写字母,/,~等。这篇博文暂时写完了,剩下的就是祝你好运了。

无需超级用户mpi多机执行的更多相关文章

  1. 无需超级用户mpi多机运行

    在之前的一篇博文中(Linux下mpi环境配置与运行步骤(Ubuntu为例) ),有讨论过怎样使用MPI在两个不同的机器上运行程序,在那篇博文中使用了超级用户权限.不幸的是.有些情况下,我们不能拥有操 ...

  2. CentOS下添加Root权限用户(超级用户)方法

    1.添加普通用户[root@server ~]# useradd chenjiafa   //添加一个名为chenjiafa的用户[root@server ~]# passwd chenjiafa   ...

  3. ssh无密码登录多台机器,并让所有远程机执行相同命令

    问题集锦 其实标题的内容就是很常见的集群操作,当有一个脚本或者一个命令需要很多个机器同时(或者说接近同时)执行时,就涉及到几个问题: 怎么通知每个主机? 每个主机收到通知后,怎么让主机执行命令? 怎么 ...

  4. 在 Linux 中使用超级用户权限

    在你想要使用超级权限临时运行一条命令时,sudo 命令非常方便,但是当它不能如你期望的工作时,你也会遇到一些麻烦.比如说你想在某些日志文件结尾添加一些重要的信息,你可能会尝试这样做: $ echo & ...

  5. 联通GWH-01路由猫超级用户登录方法

    . . . . . 今天回老家,家里用的是联通GWH-01路由猫,上海贝尔的.用路由器背面说明上面写的user用户登录之后,发现只能查看却无法设置.为了开启无线路由功能,只好在网上查找超级用户,是cu ...

  6. Linux系统下超级用户密码的修改

    1)重启系统:在虚拟机刚启动界面,不停地按上下键,停止系统的自动引导(界面底部有提示) 2) 按 e 进入编辑模式 3) 编辑内容如下:完成后按Ctrl+x    (具体编辑内容为下图:删除倒数第三行 ...

  7. Hadoop-2.2.0中文文档—— Common - 超级用户模拟别的用户

    简单介绍 此文档描写叙述了一个超级用户怎样在安全的方式下以还有一用户的名义提交作业或訪问hdfs. Use Case 下一部分描写叙述的的代码演示样例对此用户用例是可用的. 一个username为's ...

  8. Linux学习笔记——1.超级用户

    以超级用户工作:su su命令允许临时变换到任何一用户标识(如果拥有口令的话),并挂起当前shell,为新用户开启一个新的shell. su <user> 将当前用户标识harley变换为 ...

  9. Azure Linux 云主机使用Root超级用户登录

    Azure的Linux虚拟机是可以灵活使用root超级用户的管理员权限的: 1:使用sudo passwd root指令设置超级用户root密码: 使用创建Linux时设置的用户名和密码登陆,使用su ...

随机推荐

  1. [LeetCode] Range Addition II 范围相加之二

    Given an m * n matrix M initialized with all 0's and several update operations. Operations are repre ...

  2. [LeetCode] Longest Line of Consecutive One in Matrix 矩阵中最长的连续1

    Given a 01 matrix M, find the longest line of consecutive one in the matrix. The line could be horiz ...

  3. 第一届“百度杯”信息安全攻防总决赛_Upload

    题目见i春秋ctf训练营 看到fast,就想抓个包看看,以前有道题是打开链接直接来了个跳转,当然这题不是 查看返回包,发现一个好东西 拿去base64解码看看 感觉给出的字符串能继续解码,果然解码后得 ...

  4. POJ2135:Farm Tour

    题意:给定一个无向图,从1走到n再从n走回1,每个边只能走一遍,求最短路 题解:可以定义一个源点s,和一个汇点t s和1相连容量为2,费用为0, t和n相连容量为2,费用为0 然后所用的边的容量都定为 ...

  5. ●UVa 1589 Xiangqi(模拟)

    ●赘述题意 给出一个中国象棋残局,告诉各个棋子的位置,黑方只有1枚“将”,红方有至少2枚,至多7枚棋子,包含1枚“帅G”,和若干枚“车R”,“马H”,“炮C”.当前为黑方的回合,问黑方的“将”能否在移 ...

  6. Python3 中 random模块

    Python中的random模块用于生成随机数. 下面具体介绍random模块的功能: 1.random.random() #用于生成一个0到1的 随机浮点数:0<= n < 1.0 im ...

  7. 一起来Fit TDMA over WiFi(2)

    3 收发流程分析与改进 收发流程分析涉及到具体代码,属于SDK驱动内容,不能完全公开,仅供参考,本系列文档中涉及到具体功能或代码时,请在自己的驱动代码中查找. QCA驱动从9.5开始,将原来的htc的 ...

  8. C语言中#define的用法

    今天整理了一些#define的用法,与大家共享! 1.简单的define定义 #define MAXTIME 1000 一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写 if(i& ...

  9. Linux下解决无法远程连接数据库问题

    起因 今天在ubuntu16.04环境下通过mysql workbench访问远程数据库时,发现无法连接问题,解决思路及方法记录如下,不足之处,请多指教. 问题 通过workbench输入密码访问时报 ...

  10. super 关键字