Skip to content

Mpi program failed #69

@konstantinosDMS

Description

@konstantinosDMS

I have this program on C:

`

#include <stdio.h>
#include <stdlib.h>
//#include <sys/types.h>
//#include <sys/wait.h>
#include "mpi.h"
    
struct fields{
     int nmbOfProcesses;
      int hostNumber;
     int *numberArray;
  };

struct fields *start(int, int);
struct fields *gatherData(int, int);
void printData(int *, int);
void sendMessageToOtherProcesses(struct fields *);

int main(int argc, char** argv) {
int rank, size, tmpNmb1, tmpNmb2, 
    notOrderedFlag = 0, tmpI = 0,
    nbFinalArray, retrieveArray[3];
struct fields *myFields;
MPI_Status status;   

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);    
    
 //  while(1){
    if (rank == 0){
        myFields = start(rank, size);
        if (myFields->nmbOfProcesses > myFields->hostNumber){
            printf("Error!!! Number of Processes is more than number of Elements.");
            //wait(2);
            MPI_Abort(MPI_COMM_WORLD, 0); 
        }
    }

    if (rank != 0){
        MPI_Recv(&(myFields->nmbOfProcesses), 1, MPI_INT, 0, 1000, MPI_COMM_WORLD, &status);
        MPI_Recv(&(myFields->hostNumber), 1, MPI_INT, 0, 1000, MPI_COMM_WORLD, &status);
        MPI_Recv(&(myFields->numberArray[0]), (myFields-> hostNumber), MPI_INT, 0, 1000, MPI_COMM_WORLD, &status);
    }
    
    tmpNmb1 = (myFields->hostNumber / myFields->nmbOfProcesses);
    tmpNmb2 = (myFields->hostNumber % myFields->nmbOfProcesses);
    int row = (rank * tmpNmb1);    

    if (tmpNmb2 == 0){
        nbFinalArray = myFields->nmbOfProcesses;
    }
    else{
        nbFinalArray = (myFields->nmbOfProcesses + 1);
    }

    int finalArray[nbFinalArray];    

    for (int i = row ; i < ((row + tmpNmb1) - 1); i++){
        if (myFields->numberArray[i] < myFields->numberArray[i+1]){
            notOrderedFlag = 0; //Ordered
            finalArray[0] = myFields->numberArray[row + tmpNmb1 -1];
        } 
        else{
            notOrderedFlag = 1; // Not Ordered
            tmpI = i;
            break;
        } 
    }    

    if (notOrderedFlag == 1){
        if (rank == 0){
            printf("From Proccess 0 - Position %d. The Array is not Ordered!", tmpI);
            //wait(2);
            MPI_Abort(MPI_COMM_WORLD, 0);
        }
        else if (rank != 0){                
            int tmpArray[3] = {rank, notOrderedFlag, tmpI};
            MPI_Send(&tmpArray[0], 3, MPI_INT,  0, 1000, MPI_COMM_WORLD); //wrong Array
        }
    }

    if (rank == 0){
        for (int i = 1; i < myFields->nmbOfProcesses ; i++){
            MPI_Recv(&retrieveArray[0], 3, MPI_INT, i, 1000, MPI_COMM_WORLD, &status);
        }
    }

    if (rank != 0){
        if (notOrderedFlag == 0){
            int tmpArray[3] = {rank, notOrderedFlag, myFields->numberArray[(row + tmpNmb1) - 1]};
            MPI_Send(&tmpArray[0], 3, MPI_INT,  0, 1000, MPI_COMM_WORLD); //Right Array
        }
    }

    if (rank == 0){
        for (int i = 0; i < 3; i++){
            if (retrieveArray[1] == 1){
                printf("From Proccess %d - Position %d. The Array is not Ordered!", retrieveArray[0], retrieveArray[2]);
               // wait(2);
                MPI_Abort(MPI_COMM_WORLD, 0);
            }
            else if (retrieveArray[1] == 0){
                finalArray[retrieveArray[0]] = retrieveArray[2];
            }
        }

        if (tmpNmb2 != 0){
            for (int i = (myFields->hostNumber - tmpNmb2); i < ((myFields->hostNumber) - 1); i++){
                if (myFields->numberArray[i] > myFields->numberArray[i+1]){
                    printf("From Proccess 0 - Position %d. The Array is not Ordered!", i);
                   // wait(2); 
                    MPI_Abort(MPI_COMM_WORLD, 0);
                }
            }

            finalArray[nbFinalArray - 1] = myFields->numberArray[myFields->hostNumber - 1];
        }

        for (int i = 0 ; i < (nbFinalArray -1); i++){
            if (finalArray[i] > finalArray[i+1]){
                printf("Final Array is NOT ORDRED. From Proccess 0 - Position %d", i);
                //wait(2); 
                MPI_Abort(MPI_COMM_WORLD, 0);
            }      
        }

        printf("The Array is Ordered!!!\n");
    }
  //} 
  MPI_Finalize();
  return 0;
 }

 struct fields *start(int rank, int size){
    int input;
  struct fields *myFields;
  printf("1) Type 1 For Execution\n");
  printf("2) Type 2 For Exit\n");
  printf("Give your choice:");
  scanf("%d",&input);
  switch(input){
    case 1:
        myFields = gatherData(rank, size);
        break;
    case 2:
    default:
        MPI_Abort(MPI_COMM_WORLD, 0);
   }
   sendMessageToOtherProcesses(myFields);
   return myFields;
 }

struct fields *gatherData(int rank, int size){
  int host;
  struct fields *myFields;
  if (rank == 0){
     printf("Give the host of the number to be checked if they are ordered:");
     scanf("%d",&host);
 }

 int nmbArray[host];

 for (int i = 0; i < host; i++){
    printf("Give the %d number:", i);
    scanf("%d", &nmbArray[i]);
  }  

   myFields->hostNumber = host;
   myFields->numberArray = &nmbArray[0];
  myFields->nmbOfProcesses = size;

   return myFields;
   //for (int i = 0 ; i < host ; i++) printf("\n%d",nmbArray[i]);   
  }

  void sendMessageToOtherProcesses(struct fields *myFields){  
    for (int i = 1; i < myFields-> nmbOfProcesses; i++){
    MPI_Send(&(myFields-> nmbOfProcesses), 1, MPI_INT,  i, 1000, MPI_COMM_WORLD); 
    MPI_Send(&(myFields-> hostNumber), 1, MPI_INT,  i, 1000, MPI_COMM_WORLD); 
    MPI_Send(&(myFields-> numberArray), (myFields-> hostNumber), MPI_CHAR, i, 1000, MPI_COMM_WORLD);
   }
 }

`
The problem is when I run it I get only the first two printf from the start() and I do not know what is going wrong. Any suggestion? (Lubuntu 32 bit 18.10 - OpenMPI). I am trying to seperate the processes not to order data given from the user but just to identify if the data are in order... Thanks in advance!!!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions