#include <upc_relaxed.h>
#include <mpi.h>
#include<stdio.h>
//#define N 100*THREADS
#define N 1*THREADS
shared double v1[N], v2[N];

int main(int argc, char **argv) {
	int i, rank, size;
	double sum1 = 0.0, sum2=0.0, dotp;

	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);

	for (i=0; i<N; i++)
	{
		v1[i] = 1;
		v2[i] = 2;
	}

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

	upc_barrier;

	MPI_Reduce(&sum1, &dotp, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
	MPI_Reduce(&v1[rank], &sum2, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

	if (rank == 0) printf("sum = %f, dotproduct is %f\n", sum2, dotp);

	MPI_Barrier(MPI_COMM_WORLD);

	MPI_Finalize();
	return 0;
}


