版权声明:博主原创文章属私人所有,未经允许 不可转发和使用 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
可以看到自己写的 广播方式还是多花费了些时间