前言
前段时间写了“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;
GDAL
MPI实例优化:中值滤波并行加速

本文介绍了如何通过将点对点通信改为集合通信,优化MPI中值滤波程序,实现并行加速。在MPI_Scatter()和MPI_Gather()的帮助下,当进程数小于等于8时,加速比接近线性增长。然而,随着进程数增加,通信时间占比增大,导致20个进程运行时总时间增加。文章作者将继续分享MPI相关知识,并提供了联系方式。
最低0.47元/天 解锁文章
545

被折叠的 条评论
为什么被折叠?



