-
Notifications
You must be signed in to change notification settings - Fork 758
Closed
Description
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!!!
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels