The root and other process codes can be clubbed together, but in this code root has been treated separately so as for better understanding.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*************************************** | |
AUTHOR: ANKIT MAHATO | |
amahato@iitk.ac.in | |
IIT KANPUR | |
This code distributes data and adds | |
two vectors a and b in parallel. | |
The root and other process codes can be | |
clubbed together but in this code root | |
has been treated separately so as for | |
better understanding. | |
***************************************/ | |
#include "mpi.h" | |
#include <stdio.h> | |
#include <stdlib.h> | |
#define MASTER 0 | |
int main (int argc, char *argv[]) | |
{ | |
int * a; | |
int * b; | |
int * c; | |
// arrays a and b | |
int total_proc; | |
// total nuber of processes | |
int rank; | |
// rank of each process | |
int T; | |
// total number of test cases | |
long long int n_per_proc; | |
// elements per process | |
long long int i, n; | |
MPI_Status status; | |
// Initialization of MPI environment | |
MPI_Init (&argc, &argv); | |
MPI_Comm_size (MPI_COMM_WORLD, &total_proc); | |
//Now you know the total number of processes running in parallel | |
MPI_Comm_rank (MPI_COMM_WORLD,&rank); | |
//Now you know the rank of the current process | |
int * ap; | |
int * bp; | |
int * cp; | |
if (rank == MASTER) //you choose process rank 0 to be your root which will be used to perform input output. | |
{ | |
scanf ("%d", &T); | |
// you get the total number of test cases | |
MPI_Bcast (&T, 1, MPI_INT, MASTER, MPI_COMM_WORLD); | |
// Then you broadcast it to every process out there | |
while (T--) | |
{ | |
scanf ("%lld", &n); | |
a = (int *) malloc(sizeof(int)*n); | |
b = (int *) malloc(sizeof(int)*n); | |
c = (int *) malloc(sizeof(int)*n); | |
MPI_Bcast (&n, 1, MPI_LONG_LONG_INT, MASTER, MPI_COMM_WORLD); | |
n_per_proc = n/total_proc; | |
for(i=0;i<n;i++) | |
scanf ("%d", &a[i]); | |
for(i=0;i<n;i++) | |
scanf ("%d", &b[i]); | |
if(n%total_proc != 0) | |
{ | |
n_per_proc+=1; | |
for(i=0;i<(n_per_proc*total_proc - n);i++) | |
{ | |
a[n+i] = 0; | |
b[n+i] = 0; | |
} | |
} // to divide data evenly by the number of processors | |
ap = (int *) malloc(sizeof(int)*n_per_proc); | |
bp = (int *) malloc(sizeof(int)*n_per_proc); | |
cp = (int *) malloc(sizeof(int)*n_per_proc); | |
MPI_Bcast (&n_per_proc, 1, MPI_LONG_LONG_INT, MASTER, MPI_COMM_WORLD); | |
//Broadcast element per process | |
MPI_Scatter(a, n_per_proc, MPI_INT, ap, n_per_proc, MPI_INT, 0, MPI_COMM_WORLD); | |
//scattering array a | |
MPI_Scatter(b, n_per_proc, MPI_INT, bp, n_per_proc, MPI_INT, 0, MPI_COMM_WORLD); | |
//scattering array b | |
for(i=0;i<n_per_proc;i++) | |
cp[i] = ap[i]+bp[i]; | |
MPI_Gather(cp, n_per_proc, MPI_INT, c, n_per_proc, MPI_INT, MASTER, MPI_COMM_WORLD); | |
//gathering array c | |
for(i=0;i<n;i++) | |
printf ("%d ", c[i]); | |
printf ("\n"); | |
} | |
} | |
else | |
{ // Non-master tasks | |
// Receive T | |
MPI_Bcast (&T, 1, MPI_INT, MASTER, MPI_COMM_WORLD); | |
//printf("%d from process %d\n",T,rank); | |
while (T--) | |
{ | |
MPI_Bcast (&n, 1, MPI_LONG_LONG_INT, MASTER, MPI_COMM_WORLD); | |
MPI_Bcast (&n_per_proc, 1, MPI_LONG_LONG_INT, MASTER, MPI_COMM_WORLD); | |
ap = (int *) malloc(sizeof(int)*n_per_proc); | |
bp = (int *) malloc(sizeof(int)*n_per_proc); | |
cp = (int *) malloc(sizeof(int)*n_per_proc); | |
MPI_Scatter(a, n_per_proc, MPI_INT, ap, n_per_proc, MPI_INT, 0, MPI_COMM_WORLD); | |
//Recieving Scattered a | |
MPI_Scatter(b, n_per_proc, MPI_INT, bp, n_per_proc, MPI_INT, 0, MPI_COMM_WORLD); | |
//Recieving Scattered b | |
for(i=0;i<n_per_proc;i++) | |
{ | |
cp[i] = ap[i]+bp[i]; | |
//printf("%d from %d\n",ap[i],rank); | |
//printf("%d from %d\n",bp[i],rank); | |
} | |
MPI_Gather(cp, n_per_proc, MPI_INT, c, n_per_proc, MPI_INT, MASTER, MPI_COMM_WORLD); | |
//To initiate the gathering of computed part of array C | |
} | |
} | |
MPI_Finalize(); | |
//Terminate MPI Environment | |
return 0; | |
} |