Advertisement
Guest User

Untitled

a guest
Dec 14th, 2019
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.18 KB | None | 0 0
  1.  
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include <time.h>
  5. #include<math.h>
  6. #include"mpi.h"
  7.  
  8. //Αλάξτε τα παρακάτω για να φανούν οι περιπτώσεις
  9. #define ON 1 //Τα στοιχεία στην κύρια διαγώνιο
  10. #define OFF 0 //Τα στοιχεία εκτός διαγώνιο
  11.  
  12. /*Όλες οι printf που έχουν // μπροστά τους χρησιμοποιούνται για debbuging.*/
  13.  
  14. void printArray(int *array,int n); //Τυπώνει την ακολουθία που δώθικε από τον χρήστη
  15. int getSize(int pros); //Ζητά το μήκος της ακολουθίας από τον χρήστη
  16. void getArray(int *array,int n); //Ζητά ένα ένα τα στοιχεία της ακολουθίας από τον χρήστη
  17. int checkCond(int *arr,int size,int offset,int proc);//Ελέχγει την προυπόθεση
  18. int checkMax(int *arr,int size,int lines,int proc);//Βρίσκει το μέγιστο στοιχείο της διαγώνιου
  19. void createArray(int *a,int *b,int size,int lines,int proc,int max);//Φτιάχνει τον δεύτερο πίνακα.;
  20.  
  21. int main(int argc, char *argv[])
  22. {
  23.     int size; //Ο αριθμός ακεραίων που θα διαβαστούν από τον χρήστη που καθορίζουν το μέγεθος της ακολουθίας.
  24.     int p; //Ο αριθμός διεργασιών που εισάγονται από τον χρήστη.
  25.     int flag; //Boolean;
  26.     int *arr; //Ο πίνακας αποθήκευσης της ακολουθίας.
  27.     int loc_start; //Η θέση στον κύριο πινάκα, από την οποία ξεκινά ο κάθε υποπίνακας.
  28.     int *flags;
  29.     int b=0,max=0;
  30.     int *beta;
  31.     int rank,dest,source,root,i,j;
  32.     MPI_Status stat;
  33.  
  34.     MPI_Init(&argc,&argv);
  35.     MPI_Comm_size(MPI_COMM_WORLD, &p);
  36.     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  37.  
  38.     if (rank==0) //Αρχικοιπολιηση πίνακα και εισαγωγή δεδομένων
  39.     {
  40.       int i;
  41.       flags = malloc(p * sizeof(int));
  42.       size = getSize(p);
  43.       arr =(int*) malloc(size * size * sizeof(int)); //Ο πίνακας
  44.       getArray(arr,size);
  45.     }
  46.  
  47.     MPI_Bcast(&size,1,MPI_INT,0,MPI_COMM_WORLD);
  48.     int temp =size*(size/p); //Το μέγεθος κάθε υποπίνακα.
  49.     int *temp_arr= malloc(temp * sizeof(int));
  50.     MPI_Scatter(arr,temp,MPI_INT,temp_arr,temp,MPI_INT,0,MPI_COMM_WORLD);
  51.     flag = checkCond(temp_arr,size,size/p,rank);
  52.  
  53.     MPI_Gather(&flag,1,MPI_INT,flags,1,MPI_INT,0,MPI_COMM_WORLD);
  54.  
  55.     if(rank==0)
  56.     {
  57.       for (i = 0; i < p; i++) {
  58.         if(flags[i]>0){
  59.           b=1;
  60.           break;
  61.         }
  62.       }
  63.         if (b==1)
  64.         {
  65.           printf("no.\n");
  66.         }
  67.         else{
  68.           printf("yes.\n");
  69.           beta =(int*) malloc(size * size * sizeof(int)); //Ο πίνακας β
  70.         }
  71.       printArray(arr,size);
  72.     }
  73.     if(b==0){//Υπολογισμός επιμέρους max
  74.       flag = checkMax(temp_arr,size,size/p,rank);
  75.       MPI_Gather(&flag,1,MPI_INT,flags,1,MPI_INT,0,MPI_COMM_WORLD);
  76.         if(rank==0){//Υπολογισμός ολικού max
  77.           for (i = 0; i < p; i++) {
  78.             if(flags[i]>max){
  79.               max = flags[i];
  80.             }
  81.           }
  82.           printf("max is %d\n",max);
  83.         }
  84.       }
  85.     MPI_Bcast(&b,1,MPI_INT,0,MPI_COMM_WORLD);
  86.     if(b==0){
  87.       MPI_Bcast(&max,1,MPI_INT,0,MPI_COMM_WORLD);
  88.       int *ta= malloc(temp * sizeof(int));
  89.       MPI_Scatter(beta,temp,MPI_INT,ta,temp,MPI_INT,0,MPI_COMM_WORLD);
  90.       createArray(temp_arr,ta,size,size/p,rank,max);
  91.       MPI_Gather(ta,temp,MPI_INT,beta,temp,MPI_INT,0,MPI_COMM_WORLD);
  92.       if(rank==0){
  93.         printArray(beta,size);
  94.         printf("\n");
  95.       }
  96.     }
  97.     MPI_Finalize();
  98.     return 0;
  99. }
  100.  
  101. /*Οι συναρτήσεις που χρησιμοποιούνται από τις διργασίες*/
  102.  
  103. void printArray (int *array,int n){
  104.   printf("Ο πίνακας που δώσατε.\n");
  105.   printf("<----------------------------------------->\n");
  106.   int i,j=0,g=0;
  107.   for(i=0;i<n*n;i++){
  108.       if(i%n==0 && i!=0){
  109.         g++;
  110.         printf("\n");
  111.       }
  112.       if(i%n==0)
  113.         j=0;
  114.       if(array[i]>=0)
  115.         printf("+");
  116.       printf("%d ",array[i]);
  117.       j++;
  118.   }
  119.   printf("\n");
  120.   printf("<----------------------------------------->\n");
  121. }
  122.  
  123. int getSize(int pros){
  124.   int n=-1;
  125.   printf("Ποιές θέλεται να είναι οι διαστάσεις του τετραγωνικού πίνακα;\n");
  126.   while(n%pros!=0)
  127.   do
  128.   {
  129.     printf("Πρέπει να είναι ακέραιο πολλαπλάσιο του %d.(π.χ. %d,%d,%d,...)\n",pros,pros*1,pros*2,pros*3);
  130.     scanf("%d",&n);
  131.   }while(n<(pros));
  132.   return n;
  133. }
  134.  
  135. void getArray(int *array,int n){
  136.   int i,j=0,g=0,ch=0;
  137.   do{
  138.     printf("1)Χειροκίνιτη εισαγωγή\n2)Αυτόματη εισαγωγή\n3)Τυχαίο γέμισμα\n");
  139.     printf("Επιλέξτε ένα γράφοντας τον αντίστοιχο αριθμό.\n");
  140.     scanf("%d",&ch);
  141.     if((ch==1) || (ch==2) || (ch==3))
  142.       break;
  143.   }while(1);
  144.   if (ch==1)
  145.     printf("Τώρα θα σας ζητηθεί να δώσετε τα στοιχεία του πίνακα ένα την φορά.\n");
  146.   for (i=0;i<n*n;i++)
  147.           {
  148.             if(i%n==0 && i!=0)
  149.               g++;
  150.             if(i%n==0)
  151.               j=0;
  152.             if(ch==1){
  153.               printf("Δώστε το στοιχείο Α[%d,%d].\n",g,j);
  154.               scanf("%d",&array[i]);
  155.             }
  156.             else if(ch==2){ //Γεμίζουμε τον πίνακα με δεδομένα που ικανοποιούν το ζητούμενο
  157.               if(g==j)
  158.                 array[i]=-n;
  159.               else
  160.                 array[i]=1;
  161.               j++;
  162.               array[n*n-1] = -n-1;
  163.             }
  164.             else if(ch==3){
  165.               if(i==0)
  166.                 srand(time(NULL));
  167.               array[i] = rand() % (19) + -9;
  168.             }
  169.           }
  170. }
  171.  
  172. int checkCond(int *arr,int size,int lines,int proc){
  173.   int i,j=0,sum=0;
  174.   int temp = (lines*proc);
  175.   for (i = 1; i < lines+1; i++) {
  176.       sum=0;
  177.       for (j;j<size*(i);j++){
  178.         if (j!=temp){
  179.           sum = sum + abs(arr[j]);
  180.         }
  181.         if (abs(arr[temp])<sum){
  182.           return 1;
  183.         }
  184.     }
  185.     temp = temp+size+1;//Tο επόμενο στοιχείο της διαγωνιού
  186.   }
  187.   return 0;
  188. }
  189.  
  190. int checkMax(int *arr,int size,int lines,int proc){
  191.   int i,j=0,max=0;
  192.   int temp = (lines*proc);
  193.   for (i = 0; i < lines; i++) {
  194.         if (abs(arr[temp])>max){
  195.           max = abs(arr[temp]);
  196.         }
  197.         temp = temp+size+1;
  198.     }
  199.     return max;
  200.   }
  201.  
  202. void createArray(int *a,int *b,int size,int lines,int proc,int max){
  203.   int i,j=0,sum=0;
  204.   int temp = (lines*proc);
  205.   for (i = 1; i < lines+1; i++) {
  206.       for (j;j<size*(i);j++){
  207.         if (j!=temp){
  208.           b[j]=max-abs(a[j]);
  209.         }
  210.         else
  211.           b[j]=max;
  212.     }
  213.     temp = temp+size+1;//Tο επόμενο στοιχείο της διαγωνιού
  214.   }
  215. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement