c++使用mpich库编写并行程序

本文介绍了如何在C++中使用mpich库进行并行编程,从mpich的安装配置到并行环境的启动,详细讲解了一个简单的并行程序示例和矩阵乘法的并行实现。通过将矩阵A和C按行分块,B按列分块,并利用MPI进程间的通信进行数据交换,有效降低了内存开销。对于大规模矩阵运算,这种方法展示了并行计算的优势。
摘要由CSDN通过智能技术生成

1、官网下载mpich

网址:http://packages.ubuntu.com/trusty/mpich(本人使用Ubuntu)

2、解压安装mpich3

tar -xvzf XXXX.tar.gz
cd mpi3
./configure --prefix=/home/mpi3
make && make install

3、配置

vim ~/.baserc

export MPI_ROOT=/home/mpich3
export PATH=$MPI_ROOT/bin:$PATH
export MANPATH=$MPI_ROOT/man:$MANPATH

4、测试hello.c

#include <mpi.h>
#include <stdio.h>
#include <math.h>

int main (int argc, char **argv)
{
int myid, numprocs;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];

MPI_Init (&argc, &argv);
MPI_Comm_rank (MPI_COMM_WORLD, &myid);
MPI_Comm_size (MPI_COMM_WORLD, &numprocs);
MPI_Get_processor_name (processor_name, &namelen);
fprintf (stderr, "Hello World! Process %d of %d on %s\n", myid, numprocs, processor_name);
MPI_Finalize ();
return 0;
}

5、编译:mpicc -o hello hello.c(如果c++使用mpicxx)

6、 MPI应用一个管理器来管理运行MPI程序,这个管理器就是mpd,但是在正式开始运行mpd前还需要一个基于安全考虑的配置文件.mpd.conf,这个文件是要放在运行程序的用户的home目录下,本例子中就是/home/mpi/.mpd.conf,而且这个文件只能由这个用户读写,创建文件的命令是,

cd $HOME

touch .mpd.conf

chmod 600 .mpd.conf

然后在.mpd.conf文件中(如果没有这个文件需要创建一个)写入这么一行,secretword=******可以是任意的值,如果配置集群的话,这个值在参与计算的计算机上必需完全一致。如果是root用户的话,这个文件应该是/etc/mpd.conf

7、启动并行环境 mpdboot
第一次使用这个命令时,可能会出现错误,执行以下代码
cd 

touch .mpd.conf                  //
这是修改mpd配置文件的时间戳
chmod 600 .mpd.conf          //
这是修改配置文件的权限

运行程序: mpirun -np 4 ./hello
-np 
是指用几个进程模拟运行,这里用4
输出结果为:  (下面结果每台机器可能都不一样,是正常的)
Hello World! Process 1 of 4 on jack-laptop
Hello World! Process 3 of 4 on jack-laptop
Hello World! Process 2 of 4 on jack-laptop
Hello World! Process 0 of 4 on jack-laptop
想停止并行运行环境
mpdcleanup


利用mpi进行矩阵计算

1、问题描述

矩阵乘法问题描述如下:

  给定矩阵A和B,其中A是m*p大小矩阵,B是p*n大小的矩阵。求C = A*B。

求解这个问题最简单的算法是遍历A的行和B的列,求得C的相应元素,时间复杂度O(mnp),空间复杂度O(1)。

复制代码
// 矩阵乘法的C++实现
for(int i=0; i<m; i++){
    for(int j=0; j<n; j++){
        float temp = 0.0;
        for(int k=0; k<p; k++){
            temp += A[i*p + k] * B[k*n + j];
        }
        C[i*n + j] = temp;
    }
}
  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值