Groups keyboard shortcuts have been updated
Dismiss
See shortcuts

MPI Parallel code to find prime numbers between 10000 to 100000

26 views
Skip to first unread message

Almas Akhtar

unread,
Nov 23, 2022, 7:16:16 AM11/23/22
to mpi4py
this is my code, it cause segmentation fault when I run this.. no compilation errors. can anyone please check this code?

#include<mpi.h>
#include<stdio.h>
#include<math.h>

int isPrime(int n);
int main(int argc, char* argv[])
{
int myRank, size;
int flag=0;

int source;
MPI_Status status;
int index=0;

int arr[90002]; //initial array
int temp[90000];
int primes[90000]; //resulting array

int numworkers;
int count=0;

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myRank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
numworkers=size-1;
count=sizeof(arr)/numworkers;


if(myRank==0)
{
int i;
for (i = 0; i < 90000; i++) {
           arr[i] =i+10000;

}
index=0;

for(myRank= 1; myRank <=numworkers; myRank++) {

//      start=floor((myRank*90000)/size);
//      end=floor(((myRank+1)*90000)/size)-1;

//            num_to_send = end - start + 1;

            MPI_Send(&index, 1 , MPI_INT, myRank, 123, MPI_COMM_WORLD);

            MPI_Send(&arr[index], count, MPI_INT,myRank, 321, MPI_COMM_WORLD);
            index=index+count;
}
int j;
                for (j=1;j<=numworkers;j++)
                {
                        source=j;
                        MPI_Recv(&index, 1, MPI_INT, source, 1, MPI_COMM_WORLD, &status);

                        MPI_Recv(&primes[index] , count, MPI_INT, source, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

                }

                for(i=0;i<sizeof(primes)/sizeof(primes[0]);i++)
                        printf("%d ", primes[i]);
                printf("\n");
                                        }

//worker nodes task
 if (myRank>0){

        int i;
        source=0;
//       for(myRank= 1; myRank < size; myRank++) {

        MPI_Recv( &index, 1, MPI_INT, source, 123, MPI_COMM_WORLD, &status);

        MPI_Recv( &temp[index], count, MPI_INT, source, 321, MPI_COMM_WORLD, &status);

         for(i = index; i < index+count; i++) {
                flag=isPrime(temp[i]);
                if(flag==0)
                   {
                         primes[i]= temp[i];

}
         }
            MPI_Send(&index,1,MPI_INT,source,1,MPI_COMM_WORLD);

            MPI_Send( &primes[index], count, MPI_INT,source, 0, MPI_COMM_WORLD);
//}
}

MPI_Finalize();
return 0;
}

int isPrime(int n)
{
int flag, i;
if (n == 0 || n == 1)
  flag=1;

  for (i = 2; i <= n / 2;i++) {

    // if n is divisible by i, then n is not prime
         // change flag to 1 for non-prime number
             if (n % i == 0) {
                   flag = 1;
                         break;
                             }
                              }

                                 // flag is 0 for prime numbers

                                  return flag;
       }


            
Reply all
Reply to author
Forward
0 new messages