MPI 之 点对点通信的一个实例

MPI 之 点对点通信的一个实例目标:通过MPI实现100次点对点通信,并计算平均每次的通信时间。代码如下:/**点对点通信100次,计算平均通信时间,并观察传输数据量大小和传输时间关系数据量变化采用动态内存方式从4kb增加到400M,每次增大400kb**/#include<stdio.h>//标准输入输出头文件#include<stdlib.h>//标准库#incl…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

目标:通过MPI 实现100次 点对点通信,并计算平均每次的通信时间。

代码如下:

/**点对点通信100次,计算平均通信时间,并观察传输数据量大小和传输时间关系
   数据量变化采用动态内存方式  从4kb增加到400M,每次增大400kb
**/

#include<stdio.h>//标准输入输出头文件
#include<stdlib.h>//标准库
#include<mpi.h>//mpi的接口


int main(int argc,char *argv[])
{


  int i, j, k, my_rank, nprocs;
  double  data_size;
  double start_time, end_time, time_cost, average_time;
  int *p;// 动态分配内存,存放int型数据 1个int 4个字节(Byte)
  
  
   
  MPI_Init(&argc,&argv);//启动并行环境
  MPI_Comm_size(MPI_COMM_WORLD, &nprocs);//获取总进程数 
  MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);//获取本地进程编号 
  MPI_Status status; 
 
 for (i=1; i<=1e5; i=i+1e2)
 {  
    p = (int*)malloc( (sizeof(int)*1000)*i); //分配i个内存空间,每个大小为sizeof(int)*1000 即4000B=4kb, 分配的内存内随机赋值
    if(!p) 
       { 
         printf("动态分配内存失败!\n");  
         exit(1); 
        } 
    if(my_rank==0){printf("开始传送 %d×4kb/400M 数据\n",i);}
     
     start_time=MPI_Wtime();//获取墙上时间
    //来回传输100次
     for(k=1;k<=100;k++)
     {
      if(my_rank==0)
        {
          MPI_Send(p, i, MPI_INT, 1, k, MPI_COMM_WORLD);
          printf("第%d回合: %d发送数据完成……\n",k,my_rank);
        }
      if(my_rank==1)
        {
          MPI_Recv(p, i, MPI_INT, 0, k, MPI_COMM_WORLD, &status);
          MPI_Send(p, i, MPI_INT, 0, k, MPI_COMM_WORLD);
          printf("第%d回合:%d接收发送数据完成……\n",k,my_rank);
         }
      if(my_rank==0)
        {
          MPI_Recv(p, i, MPI_INT, 1, k, MPI_COMM_WORLD, &status);
          //MPI_Send(p, i, MPI_INT, 1, k, MPI_COMM_WORLD);//不能再MPI_Send,与上面突,死锁。
          printf("第%d回合succeed! \n", k);
         }
       } 
       end_time=MPI_Wtime();
       time_cost=end_time-start_time;
       average_time=time_cost/100;
       data_size=i/1e3;//转换为M为单位

      //创建experiment_data.txt文件,将数据写入
      FILE *fp;
      fp=fopen("experiment_data.txt","a+");
      fprintf(fp,"%lf,%lf\n",data_size, average_time);
      fclose(fp);
      free(p);

      if(my_rank == 0)
      printf("%f M 数据包发送接收完成 \n", data_size);
      printf("来回传输一次时间为 %lf \n ",average_time);

   }
  
     MPI_Finalize();//结束并行环境
     return 0;     
}
 

运行结果:

experiment_data.txt文件

下面将数据用matlab可视化

如何利用matlab读取txt文件并将数据可视化参看我的另一篇博文。

下图是可视化结果:y轴是时间(单位 s),x轴是数据大小(单位M)

                                     MPI 之 点对点通信的一个实例

 

可以看到,随着数据的增大,时间整体上呈现线性增长。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159986.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SMOTE算法代码实现

    SMOTE算法代码实现类别不平衡问题类别不平衡问题,顾名思义,即数据集中存在某一类样本,其数量远多于或远少于其他类样本,从而导致一些机器学习模型失效的问题。例如逻辑回归即不适合处理类别不平衡问题,例如逻辑回归在欺诈检测问题中,因为绝大多数样本都为正常样本,欺诈样本很少,逻辑回归算法会倾向于把大多数样本判定为正常样本,这样能达到很高的准确率,但是达不到很高的召回率。类别不平衡问题在很多场景中存在,例如欺诈检测,风控识…

    2022年6月17日
    29
  • idea汉化插件「建议收藏」

    idea汉化插件「建议收藏」汉化包地址:链接:https://pan.baidu.com/s/1Qkon6fqG-xBE6bUJqyFz6w提取码:fadq该汉化包支持版本:idea2018效果:将界面英文转为中文1.安装好idea之后,找到lib文件目录,将汉化包复制粘贴进去2.复制粘贴完成后重启idea…

    2022年6月10日
    207
  • mac goland 2021.12激活码_在线激活

    (mac goland 2021.12激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html3YVYA7ZZGQ-eyJsaWN…

    2022年3月30日
    150
  • 交换机基础配置教程[通俗易懂]

    交换机基础配置教程[通俗易懂]一、带外管理网络的管理控制信息与用户网络的承载业务信息在不同的逻辑信道传送,也就是设备提供专门用于管理的宽带console口:专门用来管理的,并不传输数据,接入一根console线,是一个扁平电缆,另外一端是一个串行接口,用来接入电脑或笔记本上,近端管理时我们会使用console线进行近端管理,设备要做密码恢复时,时必须要进行近端管理的,只有通过console空才能进行密码恢复。以太网口:以太网口用来传输数据管理信息和数据传输是隔离的,所以我们称之为带外管理初次配置:通过console口进行配置,需

    2022年9月15日
    4
  • NV12格式介绍[通俗易懂]

    NV12格式介绍[通俗易懂]YV12和NV12都是YUV420平面格式中的一种,其中YV12格式在我所接触的项目中使用得比较多,而NV12是Intel制定的的格式,在Intel的平台显示和支持性能最值,NV12是用于DirectXVA的首选4:2:0像素格式。  关于YV12和NV12的内存布局格式说明如下:1.YV12格式内存布局为2.NV12格式内存布局为3…

    2022年9月15日
    2
  • 消息钩子的反拦截

    消息钩子的反拦截首先声明一下,标题所指的钩子是消息钩子,而不是API钩子(一种对API地址的替换技术)。若标题使您误解,请不要继续阅读。      消息钩子在Windows编程中有着非常广泛的应用,它可以任意拦截Windows系统,这个以消息为驱动的系统中的绝大多数消息类型。一方面这给编程者带来了巨大的灵活性,另一方面也埋下了巨大隐患,大多数窃密软件都使用这种方法。此篇文章给您提供一种钩子的反拦截方

    2022年7月25日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号