mpi第五站 - 自定义mpi中的广播 和 MPI_Bcast 的性能差距比较

版权声明:博主原创文章属私人所有,未经允许 不可转发和使用 https://blog.csdn.net/a1066196847/article/details/89709720

main.cpp

#include <iostream>
#include <vector>
#include <cstdlib>
#include <time.h>
#include <mpi.h>
using namespace std;

void my_bcast(void* data, int count, MPI_Datatype datatype, int root, MPI_Comm communicator){
    int world_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);

    if(world_rank == root){
        //如果是源进程的话,就要发送数据给到其他所有的进程
        for(int i=0; i<world_size; i++){
            if(i != world_rank){
                // 要发送count这么多的data,data的数据类型是datatype,要发送到i进程,数据的tag是0
                MPI_Send(data, count, datatype, i, 0, communicator);
            }
        }
    }else{
        //如果不是源进程,那么最终目的就只剩一个了,就是接收
        MPI_Recv(data, count, datatype, root, 0, communicator, MPI_STATUS_IGNORE);
    }
}

int main(int argc, char** argv) {
    if(argc != 3){
        cout << "Usage: compare_bcast num_elements, num_trials" << endl;
        exit(1);
    }
    int num_elements = atoi(argv[1]);
    int num_trials = atoi(argv[2]);

    MPI_Init(NULL, NULL);
    int world_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);

    // 定义两个变量,用来记录我的广播所花费的时间、MPI系统自带广播所花费的时间
    double total_my_bcast_time = 0.0;
    double total_mpi_bcast_time = 0.0;
    // 创建一个大小为num_elements的动态数组
    int* data = new int[num_elements];

    // 然后开始用我的函数、系统自带的函数,开始发送data,并计算时间
    for(int i=0; i<num_trials; i++){
        // 开始计算我的时间,先给加个锁
        MPI_Barrier(MPI_COMM_WORLD);
        total_my_bcast_time -= MPI_Wtime();
        my_bcast(data, num_elements, MPI_INT, 0, MPI_COMM_WORLD);
        // 再次加一把锁,知道所有的进程都执行完毕
        MPI_Barrier(MPI_COMM_WORLD);
        total_my_bcast_time += MPI_Wtime();

        // 开始计算MPI自带的发送时间
        MPI_Barrier(MPI_COMM_WORLD);
        total_mpi_bcast_time -=MPI_Wtime();
        MPI_Bcast(data, num_elements, MPI_INT, 0, MPI_COMM_WORLD);
        MPI_Barrier(MPI_COMM_WORLD);
        total_mpi_bcast_time += MPI_Wtime();
    }

    // 打印时间信息
    if(world_rank == 0){
        cout << "Data Size = " << data << " Trials = " << num_trials << endl;
        cout << "Avg total_my_bcast_time = " << total_my_bcast_time/num_trials << endl;
        cout << "Avg total_mpi_bcast_time = " << total_mpi_bcast_time/num_trials << endl;
    }
}

$ mpirun -np 5 ./main.out 1000 10
Data Size = 0xb795a0 Trials = 10
Avg total_my_bcast_time = 9.5129e-06
Avg total_mpi_bcast_time = 7.86781e-06
可以看到自己写的 广播方式还是多花费了些时间

猜你喜欢

转载自blog.csdn.net/a1066196847/article/details/89709720
mpi
今日推荐