前言
距上次更新MPI系列博客4个多月,该段时间甚少接触MPI。最近指导师弟进行毕设实验时再次用到,因此还是有必要记录下学习MPI的过程。我上篇博客(MPI集群环境搭建)已经详细介绍了MPI集群搭建的详细流程,当时是在VMware下创建了两个Ubuntu14.04虚拟机,后来我基于实验室OpenStack(关于OpenStack的搭建,后续有时间的话我会另作介绍)平台新建了两个Ubuntu16.04节点,搭建过程基本一致。节点参数如下:
博客概要
本文直接结合具体实例(对tiff影像进行中值滤波)来学习MPI通信函数和并行策略(该实例采用数据并行,任务并行的话后面有机会再介绍)。算法流程如下(MPI是进程级的,下面所说的节点即一个个进程):
安装GDAL
GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库,本文用它来读取影像。
1.apt-get命令安装:
sudo apt-get install libgdal-dev
2.源码安装(为了后期配置更合理,推荐该方式。我一般都是采用该种安装方式)
下载源文件(GDAL),然后解压(tar -zxvf gdal-2.2.2.tar.gz
)
./configure
make
make install
可以指定安装路径,那样的话记得配置环境变量(Linux下源码安装,建议直接参考官网)
我们知道mpi执行时必须保证每个节点都有相同的执行程序,每个节点(进程)执行什么都在程序中写好了。如果只有主节点需要用到GDAL的话是不是其他节点就不用安装GDAL了?我在每个节点都安装了GDAL,所以这个我没有进行试验,我的想法是其他节点是不用安装GDAL的(这段完全在自言自语)
代码实现
#include <gdal_priv.h>
#include <iostream>
#include "mpi.h"
using namespace std;
void _medianfilter(const unsigned char* image, unsigned char* result, int width, int height);//中值滤波
int main(int argc, char *argv[])
{
time_t start, stop, start1, stop1;//使用time_t函数计时
start = time(NULL);
MPI_Status status;
const char *inPath = "/home/ubuntu/data/GF1_WFV3_E115.7_N28.9_20170729_L1A0002514125.tiff";//原始影像路径
const char *outPath = "/home/ubuntu/data/gdal_out.tiff";//输出路径
int nImgSizeX, nImgSizeY, bandcount;
int rank, size;
int interval;