MPI模拟文件读取及任务分发

程序的思路:

将0号进程设为Manager,执行manager(int p )函数,而其它进程为Worker,执行Worker(int id)函数。Manager进程负责读取文件需要处理的文件列表,然后等待请求,而Worker进程则发出请求,在文件仍存在的条件下没接受一个Worker的请求,就读出一个文件发送给Worker进程处理,当文件分配完毕的时候将发送的 filename 设为 '\n' 发送过去,Worker进行判断,如果接收到的filename为这个则说明没有任务可以执行了,将 power[0] 设置为1 , 给Manager发送本进程要终止的消息,然后Manager的终止进程计数+1,当所有的进程都发送终止之后,程序完成,退出。

我觉着思路比较好的地方是:int *power  ;  power[0] = 0 ---->代表本进程获得了任务是正常的;power[0] = 1 ---->代表本进程没有收到处理的文件名,可以终止了; power[1]-->代表Worker_id。

程序如下:

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include "mpi.h"  
  3. #include <malloc.h>  
  4. #include <string.h>  
  5. #include <sys/stat.h>  
  6. #include <io.h>  
  7.   
  8. void manager(int p);  
  9. void worker(int id);  
  10. int read_file_name();  
  11. int main(int argc , char* argv[])  
  12. {  
  13.     int id ;  
  14.     int p ;  
  15.     MPI_Init(&argc,&argv) ;  
  16.     MPI_Comm_rank(MPI_COMM_WORLD,&id);  
  17.     MPI_Comm_size(MPI_COMM_WORLD,&p);  
  18.   
  19.     if (!id)  
  20.     {  
  21.         manager(p);  
  22.     }else{  
  23.         worker(id);  
  24.     }  
  25.   
  26.     MPI_Finalize();  
  27.     return 0 ;  
  28. }  
  29.   
  30. void manager(int p)  
  31. {  
  32.     int *power ;  
  33.     MPI_Status status ;  
  34.     char * filename ;  
  35.     char c ;  
  36.     FILE* fp ;  
  37.     int i ;  
  38.     int file_size ;  
  39.     int terminate ;  
  40.     terminate = 0 ;  
  41.   
  42.     file_size = read_file_name() ;   // 读取文件个数  
  43.     filename = (char*)malloc(sizeof(char)*1024) ;  
  44.     power = (int*)malloc(sizeof(int)*2) ;  
  45.     memset(filename,0,sizeof(char)*1024) ;  
  46.     memset(power,0,sizeof(int)*2) ;  
  47.   
  48.     fp = fopen("E:\\files.txt","r");  
  49.     if (fp==NULL)  
  50.     {  
  51.         printf("Read file list error...") ;  
  52.     }  
  53.   
  54.     i = 0 ;  
  55.     do   
  56.     {  
  57.         printf("------------------------ I am manager ------------------------\n") ;  
  58.         MPI_Recv(power,2,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&status) ;   // Manager 接收到Worker的请求信息  
  59.         printf("I received the request from process :%d\n",power[1]) ;  
  60.   
  61.         /************ 接收到信息后开始读文件***************/  
  62.         c= fgetc(fp);  
  63.         if ((power[0]==0)&&(c!=EOF))  
  64.         {  
  65.             while((c!='\n')&&(c!=EOF)){  
  66.                 filename[i] = c ;  
  67.                 i++;  
  68.                 c = fgetc(fp);  
  69.             }  
  70.   
  71.             MPI_Send(filename,1024,MPI_CHAR,power[1],0,MPI_COMM_WORLD) ;  
  72.             i = 0 ;  
  73.             printf("I sent the file : %s to the process :%d\n",filename,power[1]) ;  
  74.         }  
  75.   
  76.         /**************** 如果文件读完则发送读完的消息给worker **********************/  
  77.         if (c==EOF)  
  78.         {  
  79.             printf("Now no files need process , send terminate sign to process:%d\n",power[1]) ;  
  80.             filename[0] = '\n';  
  81.             MPI_Send(filename,1024,MPI_CHAR,power[1],0,MPI_COMM_WORLD) ;  
  82.   
  83.         }  
  84.   
  85.         /******************** worker处理完发送处理完的信号**********************/  
  86.         if (power[0]==1)  
  87.         {  
  88.             terminate++;  
  89.         }  
  90.   
  91.         printf("------------------------------------------------\n\n\n");  
  92.   
  93.     } while (terminate<(p-1));  
  94.   
  95.     printf("------------------------ The all work have done ---------------------------\n") ;  
  96.   
  97.     fclose(fp);  
  98.   
  99. }  
  100.   
  101. void worker(int id)  
  102. {  
  103.      int *power ;  
  104.      char *filename ;  
  105.      MPI_Status status ;  
  106.      power = (int*)malloc(sizeof(int)*2) ;  
  107.      filename = (char*)malloc(sizeof(char)*1024) ;  
  108.      memset(power,0,sizeof(int)*2) ;  
  109.      memset(filename,0,sizeof(char)*1024) ;   
  110.   
  111.      power[0] = 0 ;  
  112.      power[1] = id ;  
  113.   
  114.      for (;;)  
  115.      {  
  116.          printf("-----------------------I am worker : %d -------------------------\n",power[1]) ;  
  117.          MPI_Send(power,2,MPI_INT,0,id,MPI_COMM_WORLD) ;     // 给Manager发送请求信息  
  118.          MPI_Recv(filename,1024,MPI_CHAR,0,0,MPI_COMM_WORLD,&status) ;  
  119.          if(filename[0]!='\n')  
  120.          {  
  121.              printf("I received the file : %s from Manager.\n",filename) ;  
  122.   
  123.          }else{  
  124.              printf("I have not received from Manager , shoud be terminated .\n") ;  
  125.              power[0] = 1 ;  
  126.              MPI_Send(power,2,MPI_INT,0,id,MPI_COMM_WORLD) ;   
  127.              break ;  
  128.          }  
  129.   
  130.          printf("-----------------------------------------------------------------\n\n\n") ;  
  131.      }  
  132.   
  133. }  
  134.   
  135. int read_file_name()  
  136. {  
  137.     return 10 ;  
  138. }  


程序运行图:

Manager分配任务:

                                                             

也注意下读文件名的那里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值