MPI’s interface

MPI_Init(&argc,&argv),
MPI_Barrier(MPI_WORLD_COMM);
MPI_Finalize(),

optimize counter

#include 
#include 
#include 
#include "gtmp.h"

static MPI_Status* status_array;
static int P;

void gtmpi_init(int num_threads){
	P = num_threads;
	status_array = (MPI_Status*) malloc((P - 1)* sizeof(MPI_Status));
}

void gtmpi_barrier(){
	int vpid, i;

	MPI_Comm_rank(MPI_COMM_WORLD, &vpid);

	for(i = 0; i < vpid; i++)
		MPI_Send(NULL, 0, MPI_INT, i, 1, MPI_COMM_WORLD);
	for(i = vpid + 1; i < P; i++)
		MPI_Send(NULL, 0, MPI_INT, i, 1, MPI_COMM_WORLD);

	for(i = 0; i < vpid; i++)
		MPI_Recv(NULL, 0, MPI_INT, i, 1, MPI_COMM_WORLD, &status_array[i]);
	for(i = vpid + 1; i < P; i++)
		MPI_Recv(NULL, 0, MPI_INT, i, 1, MPI_COMM_WORLD, &status_array[i-1]);	
}
void gtmpi_finalize(){
	if(status_array != NULL){
		free(status_array);
	}
}