0

我正在尝试实现一个映射,其中键是映射到唯一数字的数字。换句话说,每个进程在一个数组中保存一组数字,这些数字映射到由同一进程保存的另一个数组中的另一组数字。映射需要在整个过程中是唯一的。我传递了一个带有映射的结构来为每个进程创建映射。但是,这不是并行的,因为我通过进程顺序发送信息。我向所有优秀的互联网程序员寻求帮助,以了解所有进程如何同时查看特定变量?以下是我目前正在使用的代码。提前感谢我到目前为止所获得的所有支持。

#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct map{             //saves all the mappings
   int keys[25];
   int values[25];
   int grow;
};

struct map rmap;    //global map

void mapadd(int key, int value){            //adding values to map
   rmap.keys[rmap.grow] = key;
   rmap.values[rmap.grow] = value;
   rmap.grow++;
}

int mapper(int key){           //get value from key
   for(int h=0; h<sizeof(rmap.keys)/sizeof(int); h++){
       if(rmap.keys[h] == key){
          return rmap.values[h];
       }
   }
   return 0;
}

int finder(int list[], int val, int mem){    //see if a value is in array
   for(int l=0; l<mem; l++){
       if(list[l] == val){
           return 1;
       }
   }
   return 0;
}

int main(int argc, char** argv){
   // Initialize the MPI environment
   MPI_Init(NULL, NULL);
   // Find out rank, size
   int world_rank;
   MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
   int world_size;
   MPI_Comm_size(MPI_COMM_WORLD, &world_size);

   srand(time(0));
   rmap.grow = 0;

   int dim[world_size];
   int maxdim = 0;
   for(int s=0; s<world_size; s++){    
      dim[s] = (rand()%10) + 1;
      if(dim[s]>maxdim){
         maxdim = dim[s];
      }
   }

   int nums[world_size][maxdim];
   int labels[world_size][maxdim];

   for(int u=0; u<world_size; u++){
       for(int d=0; d<dim[u]; d++){
           labels[u][d] = 0;
           nums[u][d] = 0;
       }
   }

   for(int t=0; t<world_size; t++){
       for(int i=0; i<dim[t]; i++){
           nums[t][i] = rand()%26 + 1;
           //printf("%d\n", nums[t][i]);
       }
   }

   if(world_rank!=0){
      MPI_Recv(&rmap.keys, 25, MPI_INT, world_rank-1, 0, 
      MPI_COMM_WORLD, MPI_STATUS_IGNORE);
      MPI_Recv(&rmap.values, 25, MPI_INT, world_rank-1, 0, 
      MPI_COMM_WORLD, MPI_STATUS_IGNORE);
   }

      for(int j=0; j<dim[world_rank]; j++){ 
         if(labels[world_rank][j] == 0){
            if(finder(rmap.keys, nums[world_rank][j], 25)==1){
                //printf("%s", "exist");
                labels[world_rank][j] = mapper(nums[world_rank][j]);
            }
            else{
               //printf("%s", "not");
               labels[world_rank][j] = (rand()%50) + 1;
               mapadd(nums[world_rank][j], labels[world_rank][j]);
               /*for(int o=0; o<25; o++){
                   printf("%d - %d", rmap.keys[o], rmap.values[o]);
               }*/
          }
       }
    }
    if(world_rank<world_size-1){
        MPI_Send(&rmap.keys, 25, MPI_INT, world_rank+1, 0, MPI_COMM_WORLD);
        MPI_Send(&rmap.values, 25, MPI_INT, world_rank+1, 0, MPI_COMM_WORLD);
    }

    for(int rank=0; rank<world_size; rank++){
       if(rank==world_rank){
           for(int k=0; k<dim[rank]; k++){
               printf("Process #%d: %d --> %d\n", rank, nums[rank][k], labels[rank][k]);
           }
       }
   }
   MPI_Finalize();
   return 0;

}

4

0 回答 0