Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<stdlib.h>
- #include <time.h>
- #include<math.h>
- #include"mpi.h"
- //Αλάξτε τα παρακάτω για να φανούν οι περιπτώσεις
- #define ON 1 //Τα στοιχεία στην κύρια διαγώνιο
- #define OFF 0 //Τα στοιχεία εκτός διαγώνιο
- /*Όλες οι printf που έχουν // μπροστά τους χρησιμοποιούνται για debbuging.*/
- void printArray(int *array,int n); //Τυπώνει την ακολουθία που δώθικε από τον χρήστη
- int getSize(int pros); //Ζητά το μήκος της ακολουθίας από τον χρήστη
- void getArray(int *array,int n); //Ζητά ένα ένα τα στοιχεία της ακολουθίας από τον χρήστη
- int checkCond(int *arr,int size,int offset,int proc);//Ελέχγει την προυπόθεση
- int checkMax(int *arr,int size,int lines,int proc);//Βρίσκει το μέγιστο στοιχείο της διαγώνιου
- void createArray(int *a,int *b,int size,int lines,int proc,int max);//Φτιάχνει τον δεύτερο πίνακα.;
- int main(int argc, char *argv[])
- {
- int size; //Ο αριθμός ακεραίων που θα διαβαστούν από τον χρήστη που καθορίζουν το μέγεθος της ακολουθίας.
- int p; //Ο αριθμός διεργασιών που εισάγονται από τον χρήστη.
- int flag; //Boolean;
- int *arr; //Ο πίνακας αποθήκευσης της ακολουθίας.
- int loc_start; //Η θέση στον κύριο πινάκα, από την οποία ξεκινά ο κάθε υποπίνακας.
- int *flags;
- int b=0,max=0;
- int *beta;
- int rank,dest,source,root,i,j;
- MPI_Status stat;
- MPI_Init(&argc,&argv);
- MPI_Comm_size(MPI_COMM_WORLD, &p);
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- if (rank==0) //Αρχικοιπολιηση πίνακα και εισαγωγή δεδομένων
- {
- int i;
- flags = malloc(p * sizeof(int));
- size = getSize(p);
- arr =(int*) malloc(size * size * sizeof(int)); //Ο πίνακας
- getArray(arr,size);
- }
- MPI_Bcast(&size,1,MPI_INT,0,MPI_COMM_WORLD);
- int temp =size*(size/p); //Το μέγεθος κάθε υποπίνακα.
- int *temp_arr= malloc(temp * sizeof(int));
- MPI_Scatter(arr,temp,MPI_INT,temp_arr,temp,MPI_INT,0,MPI_COMM_WORLD);
- flag = checkCond(temp_arr,size,size/p,rank);
- MPI_Gather(&flag,1,MPI_INT,flags,1,MPI_INT,0,MPI_COMM_WORLD);
- if(rank==0)
- {
- for (i = 0; i < p; i++) {
- if(flags[i]>0){
- b=1;
- break;
- }
- }
- if (b==1)
- {
- printf("no.\n");
- }
- else{
- printf("yes.\n");
- beta =(int*) malloc(size * size * sizeof(int)); //Ο πίνακας β
- }
- printArray(arr,size);
- }
- if(b==0){//Υπολογισμός επιμέρους max
- flag = checkMax(temp_arr,size,size/p,rank);
- MPI_Gather(&flag,1,MPI_INT,flags,1,MPI_INT,0,MPI_COMM_WORLD);
- if(rank==0){//Υπολογισμός ολικού max
- for (i = 0; i < p; i++) {
- if(flags[i]>max){
- max = flags[i];
- }
- }
- printf("max is %d\n",max);
- }
- }
- MPI_Bcast(&b,1,MPI_INT,0,MPI_COMM_WORLD);
- if(b==0){
- MPI_Bcast(&max,1,MPI_INT,0,MPI_COMM_WORLD);
- int *ta= malloc(temp * sizeof(int));
- MPI_Scatter(beta,temp,MPI_INT,ta,temp,MPI_INT,0,MPI_COMM_WORLD);
- createArray(temp_arr,ta,size,size/p,rank,max);
- MPI_Gather(ta,temp,MPI_INT,beta,temp,MPI_INT,0,MPI_COMM_WORLD);
- if(rank==0){
- printArray(beta,size);
- printf("\n");
- }
- }
- MPI_Finalize();
- return 0;
- }
- /*Οι συναρτήσεις που χρησιμοποιούνται από τις διργασίες*/
- void printArray (int *array,int n){
- printf("Ο πίνακας που δώσατε.\n");
- printf("<----------------------------------------->\n");
- int i,j=0,g=0;
- for(i=0;i<n*n;i++){
- if(i%n==0 && i!=0){
- g++;
- printf("\n");
- }
- if(i%n==0)
- j=0;
- if(array[i]>=0)
- printf("+");
- printf("%d ",array[i]);
- j++;
- }
- printf("\n");
- printf("<----------------------------------------->\n");
- }
- int getSize(int pros){
- int n=-1;
- printf("Ποιές θέλεται να είναι οι διαστάσεις του τετραγωνικού πίνακα;\n");
- while(n%pros!=0)
- do
- {
- printf("Πρέπει να είναι ακέραιο πολλαπλάσιο του %d.(π.χ. %d,%d,%d,...)\n",pros,pros*1,pros*2,pros*3);
- scanf("%d",&n);
- }while(n<(pros));
- return n;
- }
- void getArray(int *array,int n){
- int i,j=0,g=0,ch=0;
- do{
- printf("1)Χειροκίνιτη εισαγωγή\n2)Αυτόματη εισαγωγή\n3)Τυχαίο γέμισμα\n");
- printf("Επιλέξτε ένα γράφοντας τον αντίστοιχο αριθμό.\n");
- scanf("%d",&ch);
- if((ch==1) || (ch==2) || (ch==3))
- break;
- }while(1);
- if (ch==1)
- printf("Τώρα θα σας ζητηθεί να δώσετε τα στοιχεία του πίνακα ένα την φορά.\n");
- for (i=0;i<n*n;i++)
- {
- if(i%n==0 && i!=0)
- g++;
- if(i%n==0)
- j=0;
- if(ch==1){
- printf("Δώστε το στοιχείο Α[%d,%d].\n",g,j);
- scanf("%d",&array[i]);
- }
- else if(ch==2){ //Γεμίζουμε τον πίνακα με δεδομένα που ικανοποιούν το ζητούμενο
- if(g==j)
- array[i]=-n;
- else
- array[i]=1;
- j++;
- array[n*n-1] = -n-1;
- }
- else if(ch==3){
- if(i==0)
- srand(time(NULL));
- array[i] = rand() % (19) + -9;
- }
- }
- }
- int checkCond(int *arr,int size,int lines,int proc){
- int i,j=0,sum=0;
- int temp = (lines*proc);
- for (i = 1; i < lines+1; i++) {
- sum=0;
- for (j;j<size*(i);j++){
- if (j!=temp){
- sum = sum + abs(arr[j]);
- }
- if (abs(arr[temp])<sum){
- return 1;
- }
- }
- temp = temp+size+1;//Tο επόμενο στοιχείο της διαγωνιού
- }
- return 0;
- }
- int checkMax(int *arr,int size,int lines,int proc){
- int i,j=0,max=0;
- int temp = (lines*proc);
- for (i = 0; i < lines; i++) {
- if (abs(arr[temp])>max){
- max = abs(arr[temp]);
- }
- temp = temp+size+1;
- }
- return max;
- }
- void createArray(int *a,int *b,int size,int lines,int proc,int max){
- int i,j=0,sum=0;
- int temp = (lines*proc);
- for (i = 1; i < lines+1; i++) {
- for (j;j<size*(i);j++){
- if (j!=temp){
- b[j]=max-abs(a[j]);
- }
- else
- b[j]=max;
- }
- temp = temp+size+1;//Tο επόμενο στοιχείο της διαγωνιού
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement