MPI 之 點對點通信的一個實例

目標:通過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)

                                     

 

可以看到,隨着數據的增大,時間整體上呈現線性增長。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章