前言
前段时间写了“MPI实例之中值滤波”,当时测试出来的结果显示并行时间是超过串行时间的,这是因为程序在进程通信上花费太多时间。后来我将点对点通信修改为集合通信,通信时间大大减少。
代码
修改后的代码如下:
#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;//使用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 *inPath = "/home/ubuntu/data/1.bmp";
//const char *outPath = "/home/ubuntu/data/2.bmp";
const char *outPath = "/home/ubuntu/data/gdal_out.tiff";//输出路径
int nImgSizeX, nImgSizeY, bandcount;
int rank, size;
int interval;//每个进程分到的影像高度,该程序直接按影像高度分块
int i, j;
//开辟内存
unsigned char **pImgData;//主节点存储影像数据
pImgData = NULL;
unsigned char **data;//各节点存放数据
data = NULL;
unsigned char **result;//各节点存储结果数据
result = NULL;
unsigned char **final_data;
final_data = NULL;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);//rank是进程号
MPI_Comm_size(MPI_COMM_WORLD, &size);//size是执行程序时使用的进程数
if (!rank) {
//主进程(这里是0号进程)
//打开图像
GDALDataset *poDataset;
GDALAllRegister();
poDataset = (GDALDat