Advertisement
Guest User

parallel

a guest
Feb 22nd, 2017
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.60 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<mpi.h>
  4.  
  5.  
  6. int main(void){
  7.  
  8. MPI_Init(NULL,NULL);
  9. int proc_rank;
  10. MPI_Comm_rank(MPI_COMM_WORLD, &proc_rank);
  11. int proc_size;
  12. MPI_Comm_size(MPI_COMM_WORLD, &proc_size);
  13.  
  14. if (proc_rank == 0) { //Chteniya proizvoditsya v processe 0 i otpravlyaetsya toje s etogo
  15.     int c;
  16.     FILE *file;
  17.     char a[10000];
  18.     int len = 0;
  19.     file = fopen("test.txt", "r"); //Dlya chteniya s faila
  20.     if (file) {
  21.         while ((c = getc(file)) != EOF) // poka not end of file chitaem kajdyi simvol po ocheredi i kladem v massiv
  22.             a[len++] = c;
  23.         fclose(file);
  24.     }
  25.     int left = 0; //nachalo sleduiwego bloka teksta(charovski massiv a[])
  26.     int rem = len % (proc_size-1); //nam nujno podelit' tekst rovno dlya kajdogo processa
  27.     for(int i = 1; i < proc_size; i++){ // vot zdes' uje otpravlyaem kajdyi block i
  28.         int block_size = (len / (proc_size-1)); //dlina dlya tekuwego bloka            [7,7,7,6] rem = 3
  29.     if (rem > 0) { block_size++; rem--; } //nekotorye dliny ne delyatsya rovno kak 27 na 4 processa naprimer i 3 ostavwiesya my toje doljny razdelit' po blokam
  30.     int right = left + block_size - 1; //konec tekuwego bloka
  31.    
  32.     char temp[block_size]; //copyruem block v a[left,right] na drugoi massiv temp[0,right-left+1]
  33.     for(int j = left; j < right; j++) temp[j-left] = a[j];
  34.     MPI_Send(&block_size, 1, MPI_INT, i, 0, MPI_COMM_WORLD); //snachala otpravlyaem dlinu bloka chtob tam v drugom processe vstretil
  35.         MPI_Send(temp, block_size+1, MPI_CHAR, i, 1, MPI_COMM_WORLD); //teper' uje sam blok
  36.         MPI_Recv(temp,block_size+1, MPI_CHAR, i, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE); //zdes' uje prinimaem reversed block
  37.         for(int j = left; j < right; j++) a[j] = temp[j-left]; // i stavim obratno na mesto v a[]
  38.     left = right + 1; // uzhe nachalo sleduwego bloka
  39.     }
  40.     FILE *fp = fopen("reversed.txt", "ab");
  41.     if (fp != NULL)
  42.     {
  43.         fputs(data, fp);// Vyvod na file
  44.         fclose(fp);
  45.     }
  46. } else if (proc_rank != 0) {
  47.     int length;
  48.     MPI_Recv(&length, 1 , MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); //vot tut process i prinimaet dlinu bloka kotoryi vot vot pridet
  49.     char str[length];
  50.     MPI_Recv(str,length+1, MPI_CHAR, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE); // i vidite my doljny uzhe vstretit' s pomow'u dliny(vtoroi parameter)
  51.     int i = 0;
  52.     int j = length-1; //Tut proishodit reverse
  53.     while (i < j) {
  54.         temp = str[i];
  55.         str[i] = str[j];
  56.         str[j] = temp;
  57.         i++;
  58.         j--;
  59.     }
  60.     MPI_Send(str, length+1, MPI_CHAR, 0, 2, MPI_COMM_WORLD); //i otpravlyaetsya obratno
  61. }
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement