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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JavaScript、js文件、Node.js、静态文件

    JavaScript、js文件、Node.js、静态文件1、JavaScript认知JavaScript(简称“JS”)是一种解释型的脚本语言。广泛用于Web应用开发,对页面事件做出响应。通常JavaScript脚本是通过嵌入在HTML页面中来实现自身的功能的,也可以写成单独的js文件。JavaScript与Java名称上的近似,但是两种完全不同的语言。2、JavaScript特点2.1、动态性。JavaScript是一种采用事件驱动的脚本语言,它不需要经过Web服务器就可以对用户的输入做出响应。在访问一个网页时,鼠标在网页中进行鼠标点击或上下移、窗

    2022年10月30日
    0
  • Pytest(6)重复运行用例pytest-repeat「建议收藏」

    Pytest(6)重复运行用例pytest-repeat「建议收藏」前言平常在做功能测试的时候,经常会遇到某个模块不稳定,偶然会出现一些bug,对于这种问题我们会针对此用例反复执行多次,最终复现出问题来。自动化运行用例时候,也会出现偶然的bug,可以针对单个用例,

    2022年7月29日
    4
  • 2021-2027年中国视频监控设备行业市场需求预测与投资战略规划分析报告[通俗易懂]

    2021-2027年中国视频监控设备行业市场需求预测与投资战略规划分析报告[通俗易懂]【报告类型】产业研究【报告价格】4500起【出版时间】即时更新(交付时间约3个工作日)【发布机构】智研瞻产业研究院【报告格式】PDF版本报告介绍了中国视频监控设备行业市场行业相关概述、中国视频监控设备行业市场行业运行环境、分析了中国视频监控设备行业市场行业的现状、中国视频监控设备市场行业竞争格局、对中国视频监控设备行业市场行业做了重点企业经营状况分析及中国视频监控设备行业市场行业发展前景与投资预测。您若想对中国视频监控设备行业市场行业有个系统的了解或者想投资中国视频监控设备行业市场…

    2022年5月28日
    31
  • 同步传输与异步传输相比_以下效率最高的数据交换控制方式

    同步传输与异步传输相比_以下效率最高的数据交换控制方式在网络通信过程中,通信双方要交换数据,需要高度的协同工作。为了正确的解释信号,接收方必须确切地知道信号应当何时接收和处理,因此定时是至关重要的。在计算机网络中,定时的因素称为位同步。同步是要接收方按照发送方发送的每个位的起止时刻和速率来接收数据,否则会产生误差。通常可以采用同步或异步的传输方式对位进行同步处理。1.异步传输(AsynchronousTransmission):异步传输将比

    2022年9月15日
    0
  • windows DLL注入之注册表注入

    windows DLL注入之注册表注入windows下的注入之注册表注入:1.概念介绍:注入与Hook:注入与hook经常被人们混淆,其实注入和hook是两种windows下的编程技术(当然,其他平台也有相关的技术),由于在安全编程中,两项技术经常被同时结合起来使用,所以常常导入混淆。今天我们就谈谈windows下的注入技术。1.1Hook:hook的中文名叫钩子,hook是程序设计中最为灵活多变的技巧之一,hook对指…

    2022年5月16日
    47
  • 控制台打印图形_前端控制台打印

    控制台打印图形_前端控制台打印问题描述一、在控制台输出以星号打印的三角形思路:在外部使用循环语句执行5次每次打印1行,每行的内容分别为空格和星号,每行空格缩进的数量为5减去所在行数,星号的数量是所在行数的2倍减1。在内部使用循环语句首先打印空格,然后打印星号”*”,对应的打印次数用循环次数控制,打印星号之后就可以换行。publicstaticvoidmain(String[]args){ //打印图形, intn=5;//表示要打印几行 for(inti=1;i<=n;i++){//i表示每行

    2022年10月20日
    0

发表回复

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

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