漫谈并发编程:用MPI进行分布式内存编程(入门篇)

本文是一篇关于MPI的入门教程,通过安装、HelloWorld程序和梯形积分法示例,介绍MPI的基本概念和核心接口。讨论了MPI作为消息传递库,如何在并行计算中进行进程间通信,提供了串行程序与MPI程序的对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0x00 前言

本篇是MPI的入门教程,主要是为了简单地了解MPI的设计和基本用法,方便和现在的Hadoop、Spark做对比,并尝试理解它们之间在设计上有什么区别。

身处Hadoop、Spark这些优秀的分布式开发框架蓬勃发展的今天,老的分布式编程模型是否没有必要学习?这个很难回答,但是我更倾向于花一个下午的时候来学习和了解它。

关于并发和并行编程系列的文章请参考文章集合

文章结构

  1. 举个最简单的例子,通过这个例子让大家对MPI有一个基本的理解。
  2. 解释一些和MPI相关的概念。
  3. 列举一些MPI的常用函数,以及基本用法
  4. 通过两个例子详细说明MPI的用法

0x01 举个栗子

安装

建议在Ubuntu上安装,不过笔者尝试一下,报了各种错。正好Win10可以安装一个Linux的bash,就安装了一下,用起来和原生Linux没什么区别,挺方便。

一句搞定。

sudo apt-get install libcr-dev mpich2 mpich2-doc

helloworld

MPI的c语言版helloworld。这是一个最简单的版本,相当于是每个进程都打印一下helloworld。

该例子中的一些方法以及概念在后面都会解释,而且会有两个比这个功能更全一点的例子来帮助理解。

#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\n", rank, size );
  MPI_Finalize();
  return 0;
}

运行

先编译,如果有for循环的话,记得加上后面的参数。

mpicc mpi_hello.c -o hello -std=c99

再运行:

$ mpirun -np 5 ./hello
Hello world from process 0 of 5
Hello world from process 1 of 5
Hello world from process 2 of 5
Hello world from process 3 of 5
Hello world from process 4 of 5

总结

从上面的简单例子可以看出 一个MPI程序的框架结构可以用下图表示 把握了其结构之后,下面的主要任务就是掌握MPI提供的各种通信方法与手段。

安装时遇到的问题

来一个我在Ubuntu16.04下遇到的错误,实在不想解决这些乱七八糟的,就跳过了。

$sudo apt-get install libcr-dev mpich2 mpich2-doc
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package mpich2 is not available, but
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值