MPI实例之中值滤波二

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

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

前言

前段时间写了“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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值