1. 集群基本命令:假如集群IP为:172.0.0.1
登陆:ssh 账户@ip ; 然后会提示输入密码,输入即可登陆。
上传文件:scp test.c 账户@ip:/home/账户 ;也会提示输入密码,输入即可上传。
查看集群启动节点情况 :mpdtrace
启动节点: mpdboot -n 4 -f mpd.host ; 其中4 为要启动节点的个数。
2. MPI 编译运行命令
编译:mpicc -o test test.c
运行分俩种情况:
在集群节点上运行:mpirun -np 4 ./test (如何要读文件的话,在后面加上文件名) ; 其中4表示在4个节点上运行。
在本地单机上运行:mpiexec.hydra -f /home/user/hosfle -n 4 ./test (file 可选)
另外:对于在本机上MPI , 首先下载 mpich2-1.3.2p1.tar.gz 然后进行解压安装以及配置环境变量,最后在本机上创建 /home/user/hostfile 文件,然后里面加入 127.0.0.1:4 ,就可以在本机上用进程来模拟集群节点来测试程序了。
3. MPI 函数
(1)
int MPI_Gatherv(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int *recvcounts, int *displs, MPI_Datatype recvtype, int root, MPI_Comm comm)
MPI_Gatherv(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, root, comm) IN sendbuf 发送消息缓冲区的起始地址(可变) IN sendcount 发送消息缓冲区中的数据个数(整型) IN sendtype 发送消息缓冲区中的数据类型(句柄) OUT recvbuf 接收消息缓冲区的起始地址(可变,仅对于根进程) IN recvcounts 整型数组(长度为进程组的大小), 其值为从每个进程接收 的数据个数(仅对于根进程) IN displs 整数数组,每个入口i表示相对于recvbuf的位移,此位 移处存放着从进程i中接收的输入数据(仅对于根进程),即各个进程传输数据的位置偏移。 IN recvtype 接收消息缓冲区中数据类型(仅对于根进程)(句柄) IN root 接收进程的序列号(句柄) IN comm 通信子(句柄),即参与发送和接收的全部进程集合,可用 MPI_COMM_WORLD (代表全部)。
功能描述:每个进程(包括根进程)将其发送缓冲区中的内容发送到根进程,根进程根据发送这些数据的进程的序列号将它们依次存放到自已的消息缓冲区中.其结果就象一个组中的n个进程(包括根进程在内)都执行了一个调用MPI_Send(),同时根进程执行了n次调用 MPI_Recv();
更多详见:http://micro.ustc.edu.cn/Linux/MPI/MPICH/mpi45.htm#fig4.2
(2)
int MPI_Reduce(void* sendbuf, void* recvbuf, int count,
MPI_Datatype datatype, MPI_Op op, int root,
MPI_Comm comm)
MPI_REDUCE(sendbuf,recvbuf,count,datatype,op,root,comm) IN sendbuf 发送消息缓冲区的起始地址(可变) OUT recvbuf 接收消息缓冲区中的地址(可变,仅对于根进程) IN count 发送消息缓冲区中的数据个数(整型) IN datatype 发送消息缓冲区的元素类型(句柄) IN op 归约操作符(句柄) IN root 根进程序列号(整型),0,1,2等 IN comm 通信子(句柄),进程组集合
其中op 操作可以是:
MPI_MAX 最大值 MPI_MIN 最小值 MPI_SUM 求和 MPI_PROD 求积 MPI_LAND 逻辑与 MPI_BAND 按位与 MPI_LOR 逻辑或 MPI_BOR 按位或 MPI_LXOR 逻辑异或 MPI_BXOR 按位异或 MPI_MAXLOC 最大值且相应位置 MPI_MINLOC 最小值且相应位置
更多详见:http://micro.ustc.edu.cn/Linux/MPI/MPICH/mpi49.htm
(3)
int MPI_Bcast( void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm )
(4) MPI_Barrier(MPI_COMM_WORLD);