Add simple hello world.
Also slaves calculate sum of passed arrays.
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..fccbb57
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,2 @@
+all:
+ mpicc -W -Wall main.c -o main.o
diff --git a/main.c b/main.c
new file mode 100644
index 0000000..d73311d
--- /dev/null
+++ b/main.c
@@ -0,0 +1,110 @@
+ /*
+ "Hello World" MPI Test Program
+ */
+#include <mpi.h>
+#include <stdio.h>
+#include <string.h>
+
+#define BUFSIZE 128
+#define TAG 0
+#define RANDOM_ARRAY_SIZE 1000
+#define RANDOM_ARRAY_TAG 1
+
+int main(int argc, char *argv[]) {
+ char idstr[32];
+ char buff[BUFSIZE];
+ int numprocs;
+ int myid;
+ int i;
+ MPI_Status stat;
+ /* MPI programs start with MPI_Init; all 'N' processes exist thereafter */
+ MPI_Init(&argc,&argv);
+ /* find out how big the SPMD world is */
+ MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
+ /* and this processes' rank is */
+ MPI_Comm_rank(MPI_COMM_WORLD,&myid);
+
+ /* At this point, all programs are running equivalently, the rank
+ distinguishes the roles of the programs in the SPMD model, with
+ rank 0 often used specially... */
+ if(myid == 0) {
+ printf("%d: We have %d processors\n", myid, numprocs);
+
+ for(i=1;i<numprocs;i++) {
+ sprintf(buff, "Hello %d! ", i);
+ MPI_Send(buff, BUFSIZE, MPI_CHAR, i, TAG, MPI_COMM_WORLD);
+ }
+ for(i=1;i<numprocs;i++) {
+ MPI_Recv(buff, BUFSIZE, MPI_CHAR, i, TAG, MPI_COMM_WORLD, &stat);
+ printf("%d: %s\n", myid, buff);
+ }
+
+ getchar();
+ double randomArray[RANDOM_ARRAY_SIZE] = {};
+ for (i = 0; i < RANDOM_ARRAY_SIZE; ++i) {
+ randomArray[i] = (double) i;
+ }
+
+ int dataSize = RANDOM_ARRAY_SIZE/(numprocs - 1);
+ double *startPoint = randomArray;
+ int i;
+
+ for (i = 1; i < numprocs; i++) {
+ if (i == numprocs - 1) {
+ dataSize = RANDOM_ARRAY_SIZE - (i - 1)*dataSize;
+ }
+ MPI_Send(startPoint, dataSize, MPI_DOUBLE, i,
+ RANDOM_ARRAY_TAG, MPI_COMM_WORLD);
+ startPoint += dataSize;
+ }
+
+ double tempRandomElementsSum = 0.0;
+ double randomSum = 0.0;
+
+ for (i = 1; i < numprocs; i++) {
+ MPI_Recv(&tempRandomElementsSum, 1, MPI_DOUBLE, i,
+ RANDOM_ARRAY_TAG, MPI_COMM_WORLD, &stat);
+ printf("Get Sum %e from slave %d\n",
+ tempRandomElementsSum, i);
+ randomSum += tempRandomElementsSum;
+ }
+ printf("Random Sum %e, expected is %e\n",
+ randomSum,
+ ((double) RANDOM_ARRAY_SIZE - 1 + 0)/2*
+ RANDOM_ARRAY_SIZE);
+
+ } else {
+ /* receive from master (rank = 0): */
+ MPI_Recv(buff, BUFSIZE, MPI_CHAR, 0, TAG, MPI_COMM_WORLD, &stat);
+ sprintf(idstr, "Processor %d ", myid);
+ strncat(buff, idstr, BUFSIZE-1);
+ strncat(buff, "reporting for duty", BUFSIZE-1);
+ /* send to master (rank = 0): */
+ MPI_Send(buff, BUFSIZE, MPI_CHAR, 0, TAG, MPI_COMM_WORLD);
+
+ /* calculate sum of elements gotten from master (rank = 0) */
+ int dataSize = RANDOM_ARRAY_SIZE/(numprocs - 1);
+ if (myid == numprocs) {
+ dataSize = RANDOM_ARRAY_SIZE - (numprocs - 2)*dataSize;
+ }
+ double randomArray[RANDOM_ARRAY_SIZE] = {};
+ /* get master data from master (rank = 0)*/
+ MPI_Recv(randomArray, dataSize, MPI_DOUBLE, 0,
+ RANDOM_ARRAY_TAG, MPI_COMM_WORLD, &stat);
+
+ /* calculate sum */
+ double randomSum = 0.0;
+ for (i = 0; i < dataSize; i++) {
+ randomSum += randomArray[i];
+ }
+
+ /* send sum to master (rank = 0)*/
+ MPI_Send(&randomSum, 1, MPI_DOUBLE, 0,
+ RANDOM_ARRAY_TAG, MPI_COMM_WORLD);
+ }
+
+ /* MPI programs end with MPI Finalize;
+ this is a weak synchronization point. */
+ MPI_Finalize();
+ return 0;
+}