#include <upc_relaxed.h>
#include <mpi.h>
#include<stdio.h>
//#define N 100*THREADS
#define N 1*THREADS

shared double global[N];

int main(int argc, char **argv) {
	int i, rank, size;
	double send_buf = 1.0, result;

	MPI_Init(&argc, &argv);
	MPI_Comm_rank(MPI_COMM_WORLD, &rank);
	MPI_Comm_size(MPI_COMM_WORLD, &size);
	printf("num of mpi processes is %d\n",size);

	MPI_Barrier(MPI_COMM_WORLD);
	MPI_Allreduce(&send_buf, &result, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
	MPI_Barrier(MPI_COMM_WORLD);

	printf("the value of result is %f\n", result);

	upc_barrier;

	upc_forall(i = 0; i < N; i++; i)
	{
		printf("my thread id is %d\n",MYTHREAD);
		global[i] = result*i;
	}

	upc_barrier;

	if(MYTHREAD == 0){
		for (i=0;i<N;i++)
			printf("my thread id is %d the value of sum is %f \n", MYTHREAD, global[i]);
	}

	MPI_Barrier(MPI_COMM_WORLD);

	MPI_Finalize();

	return 0;

}
