1e5c89e4eSSatish Balay /* 2e5c89e4eSSatish Balay This provides a few of the MPI-uni functions that cannot be implemented 3e5c89e4eSSatish Balay with C macros 4e5c89e4eSSatish Balay */ 5e5c89e4eSSatish Balay #include "include/mpiuni/mpi.h" 6e5c89e4eSSatish Balay 7e5c89e4eSSatish Balay #if defined (MPIUNI_USE_STDCALL) 8e5c89e4eSSatish Balay #define MPIUNI_STDCALL __stdcall 9e5c89e4eSSatish Balay #else 10e5c89e4eSSatish Balay #define MPIUNI_STDCALL 11e5c89e4eSSatish Balay #endif 12e5c89e4eSSatish Balay 13e5c89e4eSSatish Balay #if defined(PETSC_HAVE_STDLIB_H) 14e5c89e4eSSatish Balay #include <stdlib.h> 15e5c89e4eSSatish Balay #endif 16e5c89e4eSSatish Balay 17e5c89e4eSSatish Balay #define MPI_SUCCESS 0 18e5c89e4eSSatish Balay #define MPI_FAILURE 1 19e5c89e4eSSatish Balay void *MPIUNI_TMP = 0; 20e5c89e4eSSatish Balay int MPIUNI_DATASIZE[5] = { sizeof(int),sizeof(float),sizeof(double),2*sizeof(double),sizeof(char)}; 21e5c89e4eSSatish Balay /* 22e5c89e4eSSatish Balay With MPI Uni there is only one communicator, which is called 1. 23e5c89e4eSSatish Balay */ 24e5c89e4eSSatish Balay #define MAX_ATTR 128 25e5c89e4eSSatish Balay 26e5c89e4eSSatish Balay typedef struct { 27e5c89e4eSSatish Balay void *extra_state; 28e5c89e4eSSatish Balay void *attribute_val; 29e5c89e4eSSatish Balay int active; 30e5c89e4eSSatish Balay MPI_Delete_function *del; 31e5c89e4eSSatish Balay } MPI_Attr; 32e5c89e4eSSatish Balay 33e5c89e4eSSatish Balay static MPI_Attr attr[MAX_ATTR]; 34e5c89e4eSSatish Balay static int num_attr = 1,mpi_tag_ub = 100000000; 35e5c89e4eSSatish Balay 36e5c89e4eSSatish Balay #if defined(__cplusplus) 37e5c89e4eSSatish Balay extern "C" { 38e5c89e4eSSatish Balay #endif 39e5c89e4eSSatish Balay 40e5c89e4eSSatish Balay /* 41e5c89e4eSSatish Balay To avoid problems with prototypes to the system memcpy() it is duplicated here 42e5c89e4eSSatish Balay */ 43e5c89e4eSSatish Balay int MPIUNI_Memcpy(void *a,const void* b,int n) { 44e5c89e4eSSatish Balay int i; 45e5c89e4eSSatish Balay char *aa= (char*)a; 46e5c89e4eSSatish Balay char *bb= (char*)b; 47e5c89e4eSSatish Balay 48e5c89e4eSSatish Balay for (i=0; i<n; i++) aa[i] = bb[i]; 49e5c89e4eSSatish Balay return 0; 50e5c89e4eSSatish Balay } 51e5c89e4eSSatish Balay 52e5c89e4eSSatish Balay /* 53e5c89e4eSSatish Balay Used to set the built-in MPI_TAG_UB attribute 54e5c89e4eSSatish Balay */ 55e5c89e4eSSatish Balay static int Keyval_setup(void) 56e5c89e4eSSatish Balay { 57e5c89e4eSSatish Balay attr[0].active = 1; 58e5c89e4eSSatish Balay attr[0].attribute_val = &mpi_tag_ub; 59e5c89e4eSSatish Balay return 0; 60e5c89e4eSSatish Balay } 61e5c89e4eSSatish Balay 62e5c89e4eSSatish Balay /* 63e5c89e4eSSatish Balay These functions are mapped to the Petsc_ name by ./mpi.h 64e5c89e4eSSatish Balay */ 65e5c89e4eSSatish Balay int Petsc_MPI_Keyval_create(MPI_Copy_function *copy_fn,MPI_Delete_function *delete_fn,int *keyval,void *extra_state) 66e5c89e4eSSatish Balay { 67e5c89e4eSSatish Balay if (num_attr >= MAX_ATTR) MPI_Abort(MPI_COMM_WORLD,1); 68e5c89e4eSSatish Balay 69e5c89e4eSSatish Balay attr[num_attr].extra_state = extra_state; 70e5c89e4eSSatish Balay attr[num_attr].del = delete_fn; 71e5c89e4eSSatish Balay *keyval = num_attr++; 72e5c89e4eSSatish Balay return 0; 73e5c89e4eSSatish Balay } 74e5c89e4eSSatish Balay 75e5c89e4eSSatish Balay int Petsc_MPI_Keyval_free(int *keyval) 76e5c89e4eSSatish Balay { 77e5c89e4eSSatish Balay attr[*keyval].active = 0; 78e5c89e4eSSatish Balay return MPI_SUCCESS; 79e5c89e4eSSatish Balay } 80e5c89e4eSSatish Balay 81e5c89e4eSSatish Balay int Petsc_MPI_Attr_put(MPI_Comm comm,int keyval,void *attribute_val) 82e5c89e4eSSatish Balay { 83e5c89e4eSSatish Balay attr[keyval].active = 1; 84e5c89e4eSSatish Balay attr[keyval].attribute_val = attribute_val; 85e5c89e4eSSatish Balay return MPI_SUCCESS; 86e5c89e4eSSatish Balay } 87e5c89e4eSSatish Balay 88e5c89e4eSSatish Balay int Petsc_MPI_Attr_delete(MPI_Comm comm,int keyval) 89e5c89e4eSSatish Balay { 90e5c89e4eSSatish Balay if (attr[keyval].active && attr[keyval].del) { 91e5c89e4eSSatish Balay (*(attr[keyval].del))(comm,keyval,attr[keyval].attribute_val,attr[keyval].extra_state); 92e5c89e4eSSatish Balay } 93e5c89e4eSSatish Balay attr[keyval].active = 0; 94e5c89e4eSSatish Balay attr[keyval].attribute_val = 0; 95e5c89e4eSSatish Balay return MPI_SUCCESS; 96e5c89e4eSSatish Balay } 97e5c89e4eSSatish Balay 98e5c89e4eSSatish Balay int Petsc_MPI_Attr_get(MPI_Comm comm,int keyval,void *attribute_val,int *flag) 99e5c89e4eSSatish Balay { 100e5c89e4eSSatish Balay if (!keyval) Keyval_setup(); 101e5c89e4eSSatish Balay *flag = attr[keyval].active; 102e5c89e4eSSatish Balay *(int **)attribute_val = (int*)attr[keyval].attribute_val; 103e5c89e4eSSatish Balay return MPI_SUCCESS; 104e5c89e4eSSatish Balay } 105e5c89e4eSSatish Balay 106e5c89e4eSSatish Balay static int dups = 0; 107e5c89e4eSSatish Balay int Petsc_MPI_Comm_dup(MPI_Comm comm,MPI_Comm *out) 108e5c89e4eSSatish Balay { 109e5c89e4eSSatish Balay *out = comm; 110e5c89e4eSSatish Balay dups++; 111e5c89e4eSSatish Balay return 0; 112e5c89e4eSSatish Balay } 113e5c89e4eSSatish Balay 114e5c89e4eSSatish Balay int Petsc_MPI_Comm_free(MPI_Comm *comm) 115e5c89e4eSSatish Balay { 116e5c89e4eSSatish Balay int i; 117e5c89e4eSSatish Balay 118e5c89e4eSSatish Balay if (--dups) return MPI_SUCCESS; 119e5c89e4eSSatish Balay for (i=0; i<num_attr; i++) { 120e5c89e4eSSatish Balay if (attr[i].active && attr[i].del) { 121e5c89e4eSSatish Balay (*attr[i].del)(*comm,i,attr[i].attribute_val,attr[i].extra_state); 122e5c89e4eSSatish Balay } 123e5c89e4eSSatish Balay attr[i].active = 0; 124e5c89e4eSSatish Balay } 125e5c89e4eSSatish Balay return MPI_SUCCESS; 126e5c89e4eSSatish Balay } 127e5c89e4eSSatish Balay 128e5c89e4eSSatish Balay /* --------------------------------------------------------------------------*/ 129e5c89e4eSSatish Balay 130e5c89e4eSSatish Balay int Petsc_MPI_Abort(MPI_Comm comm,int errorcode) 131e5c89e4eSSatish Balay { 132e5c89e4eSSatish Balay abort(); 133e5c89e4eSSatish Balay return MPI_SUCCESS; 134e5c89e4eSSatish Balay } 135e5c89e4eSSatish Balay 136e5c89e4eSSatish Balay static int MPI_was_initialized = 0; 137e5c89e4eSSatish Balay 138e5c89e4eSSatish Balay int Petsc_MPI_Initialized(int *flag) 139e5c89e4eSSatish Balay { 140e5c89e4eSSatish Balay *flag = MPI_was_initialized; 141e5c89e4eSSatish Balay return 0; 142e5c89e4eSSatish Balay } 143e5c89e4eSSatish Balay 144e5c89e4eSSatish Balay int Petsc_MPI_Finalize(void) 145e5c89e4eSSatish Balay { 146e5c89e4eSSatish Balay MPI_was_initialized = 0; 147e5c89e4eSSatish Balay return 0; 148e5c89e4eSSatish Balay } 149e5c89e4eSSatish Balay 150e5c89e4eSSatish Balay /* ------------------- Fortran versions of several routines ------------------ */ 151e5c89e4eSSatish Balay 152*f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 153*f7c6e6aaSSatish Balay #define mpi_init_ MPI_INIT 154*f7c6e6aaSSatish Balay #define mpi_finalize_ MPI_FINALIZE 155*f7c6e6aaSSatish Balay #define mpi_comm_size_ MPI_COMM_SIZE 156*f7c6e6aaSSatish Balay #define mpi_comm_rank_ MPI_COMM_RANK 157*f7c6e6aaSSatish Balay #define mpi_abort_ MPI_ABORT 158*f7c6e6aaSSatish Balay #define mpi_allreduce_ MPI_ALLREDUCE 159*f7c6e6aaSSatish Balay #define mpi_barrier_ MPI_BARRIER 160*f7c6e6aaSSatish Balay #define mpi_bcast_ MPI_BCAST 161*f7c6e6aaSSatish Balay #define mpi_gather_ MPI_GATHER 162*f7c6e6aaSSatish Balay #define mpi_allgather_ MPI_ALLGATHER 163*f7c6e6aaSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 164*f7c6e6aaSSatish Balay #define mpi_init_ mpi_init 165*f7c6e6aaSSatish Balay #define mpi_finalize_ mpi_finalize 166*f7c6e6aaSSatish Balay #define mpi_comm_size_ mpi_comm_size 167*f7c6e6aaSSatish Balay #define mpi_comm_rank_ mpi_comm_rank 168*f7c6e6aaSSatish Balay #define mpi_abort_ mpi_abort 169*f7c6e6aaSSatish Balay #define mpi_allreduce_ mpi_allreduce 170*f7c6e6aaSSatish Balay #define mpi_barrier_ mpi_barrier 171*f7c6e6aaSSatish Balay #define mpi_bcast_ mpi_bcast 172*f7c6e6aaSSatish Balay #define mpi_gather_ mpi_gather 173*f7c6e6aaSSatish Balay #define mpi_allgather_ mpi_allgather 174*f7c6e6aaSSatish Balay #endif 175e5c89e4eSSatish Balay 176*f7c6e6aaSSatish Balay #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE) 177*f7c6e6aaSSatish Balay #define mpi_init_ mpi_init__ 178*f7c6e6aaSSatish Balay #define mpi_finalize_ mpi_finalize__ 179*f7c6e6aaSSatish Balay #define mpi_comm_size_ mpi_comm_size__ 180*f7c6e6aaSSatish Balay #define mpi_comm_rank_ mpi_comm_rank__ 181*f7c6e6aaSSatish Balay #define mpi_abort_ mpi_abort__ 182*f7c6e6aaSSatish Balay #define mpi_allreduce_ mpi_allreduce__ 183*f7c6e6aaSSatish Balay #define mpi_barrier_ mpi_barrier__ 184*f7c6e6aaSSatish Balay #define mpi_bcast_ mpi_bcast__ 185*f7c6e6aaSSatish Balay #define mpi_gather_ mpi_gather__ 186*f7c6e6aaSSatish Balay #define mpi_allgather_ mpi_allgather__ 187*f7c6e6aaSSatish Balay #endif 188e5c89e4eSSatish Balay 189e5c89e4eSSatish Balay void MPIUNI_STDCALL mpi_init_(int *ierr) 190e5c89e4eSSatish Balay { 191e5c89e4eSSatish Balay MPI_was_initialized = 1; 192e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 193e5c89e4eSSatish Balay } 194e5c89e4eSSatish Balay 195e5c89e4eSSatish Balay void MPIUNI_STDCALL mpi_finalize_(int *ierr) 196e5c89e4eSSatish Balay { 197e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 198e5c89e4eSSatish Balay } 199e5c89e4eSSatish Balay 200e5c89e4eSSatish Balay void MPIUNI_STDCALL mpi_comm_size_(MPI_Comm *comm,int *size,int *ierr) 201e5c89e4eSSatish Balay { 202e5c89e4eSSatish Balay *size = 1; 203e5c89e4eSSatish Balay *ierr = 0; 204e5c89e4eSSatish Balay } 205e5c89e4eSSatish Balay 206e5c89e4eSSatish Balay void MPIUNI_STDCALL mpi_comm_rank_(MPI_Comm *comm,int *rank,int *ierr) 207e5c89e4eSSatish Balay { 208e5c89e4eSSatish Balay *rank=0; 209e5c89e4eSSatish Balay *ierr=MPI_SUCCESS; 210e5c89e4eSSatish Balay } 211e5c89e4eSSatish Balay 212e5c89e4eSSatish Balay void MPIUNI_STDCALL mpi_abort_(MPI_Comm *comm,int *errorcode,int *ierr) 213e5c89e4eSSatish Balay { 214e5c89e4eSSatish Balay abort(); 215e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 216e5c89e4eSSatish Balay } 217e5c89e4eSSatish Balay 218e5c89e4eSSatish Balay void MPIUNI_STDCALL mpi_allreduce_(void *sendbuf,void *recvbuf,int *count,int *datatype,int *op,int *comm,int *ierr) 219e5c89e4eSSatish Balay { 220e5c89e4eSSatish Balay MPIUNI_Memcpy(recvbuf,sendbuf,(*count)*MPIUNI_DATASIZE[*datatype]); 221e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 222e5c89e4eSSatish Balay } 223e5c89e4eSSatish Balay 224e5c89e4eSSatish Balay void MPIUNI_STDCALL mpi_barrier_(MPI_Comm *comm,int *ierr) 225e5c89e4eSSatish Balay { 226e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 227e5c89e4eSSatish Balay } 228*f7c6e6aaSSatish Balay 229*f7c6e6aaSSatish Balay void MPIUNI_STDCALL mpi_bcast_(void *buf,int *count,int *datatype,int *root,int *comm,int *ierr) 230e5c89e4eSSatish Balay { 231e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 232e5c89e4eSSatish Balay } 233*f7c6e6aaSSatish Balay 234*f7c6e6aaSSatish Balay 235*f7c6e6aaSSatish Balay void MPIUNI_STDCALL mpi_gather_(void *sendbuf,int *scount,int *sdatatype, void* recvbuf, int* rcount, int* rdatatype, int *root,int *comm,int *ierr) 236e5c89e4eSSatish Balay { 237*f7c6e6aaSSatish Balay MPIUNI_Memcpy(recvbuf,sendbuf,(*scount)*MPIUNI_DATASIZE[*sdatatype]); 238*f7c6e6aaSSatish Balay *ierr = MPI_SUCCESS; 239*f7c6e6aaSSatish Balay } 240*f7c6e6aaSSatish Balay 241*f7c6e6aaSSatish Balay 242*f7c6e6aaSSatish Balay void MPIUNI_STDCALL mpi_allgather_(void *sendbuf,int *scount,int *sdatatype, void* recvbuf, int* rcount, int* rdatatype,int *comm,int *ierr) 243*f7c6e6aaSSatish Balay { 244*f7c6e6aaSSatish Balay MPIUNI_Memcpy(recvbuf,sendbuf,(*scount)*MPIUNI_DATASIZE[*sdatatype]); 245e5c89e4eSSatish Balay *ierr = MPI_SUCCESS; 246e5c89e4eSSatish Balay } 247e5c89e4eSSatish Balay 248e5c89e4eSSatish Balay #if defined(__cplusplus) 249e5c89e4eSSatish Balay } 250e5c89e4eSSatish Balay #endif 251e5c89e4eSSatish Balay 252e5c89e4eSSatish Balay 253