安装安装OpenMPI来配合来配合C语言程序进行并行计算语言程序进行并行计算
主要介绍了安装OpenMPI来配合C语言程序进行并行计算的例子,MPI的全称是Message Passing Interface即标
准消息传递界面,可以用于并行计算,需要的朋友可以参考下
安装安装OPENMPI
由于是实验,也不进行多机的配置了,只在虚拟机里安装吧。多个机器的配置可以参考此文
最简单的方法,apt安装
sudo apt-get install libcr-dev mpich2 mpich2-doc
测试
hello.c
/* C Example */
#include <mpi.h>
#include <stdio.h>
int main (int argc, char* argv[])
{
int rank, size;
MPI_Init (&argc, &argv); /* starts MPI */
MPI_Comm_rank (MPI_COMM_WORLD, &rank); /* get current process id */
MPI_Comm_size (MPI_COMM_WORLD, &size); /* get number of processes */
printf( "Hello world from process %d of %d", rank, size );
MPI_Finalize();
return 0;
}
编译运行及显示结果
mpicc mpi_hello.c -o hello
mpirun -np 2 ./hello
Hello world from process 0 of 2
Hello world from process 1 of 2
正常出现结果表明没有问题,
看下openmpi的版本
mpirun --version
mpirun (Open MPI) 1.6.5
Report bugs to http://www.open-mpi.org/community/help/
MPI计算矩阵乘法计算矩阵乘法
通过opemMPI加速矩阵乘法运算。采用主从模式,0号是master,其他是child(或者叫worker,as you wish)。
基本思路
两个矩阵A,B进行乘法运算,则A的行 i 乘以B的列 j 得出的数是新矩阵(i,j)坐标的数值。A(MN) B(NK)最后矩阵是M*K的,实
验中M=N=K=1000,我也就没有明确区分MNK,全部用MATRIX_SIZE定义的。
最简单的思路就是每个worker分配(MATRIX_SIZE/(numprocess-1))个,然后如果有余下的,就分给余数对应的worker。比如
MATRIX_SIZE=10,numprocess=4 则实际的worker有3个,每个人分3行,最后的一行给id是1的。可以很简单的利用循环类
分配。最后Master收集所有的结果,并按照顺序组装起来就行。
每个worker的工作就是接收来自master的一行,和B矩阵运算,得出新一行的结果,然后发送回master
代码
多加了很多注释来解释,函数的说明下一节解释下。
#include <mpi.h>
#include <stdio.h>
#define MATRIX_SIZE 10
#define FROM_MASTER 1 //这里的类型可以区分消息的种类,以便区分worker发送来的结果
#define FROM_CHILD 2
#define MASTER 0
MPI_Status status;
int myid,numprocess;
//最终保存的结果
int ans [MATRIX_SIZE*MATRIX_SIZE];
int A[MATRIX_SIZE*MATRIX_SIZE],B[MATRIX_SIZE*MATRIX_SIZE];
//读取文件,注意读取文件要放在master里,不然会读两遍,出现错误