X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/43cb0b7a116ccf23fd546a7dafded7782e5d6ba4..2b4010b2a5fda082278a02a35a9e9eb18b58e110:/src/smpi/smpi_pmpi.c diff --git a/src/smpi/smpi_pmpi.c b/src/smpi/smpi_pmpi.c index d5d9ecf58f..c2aa98cae1 100644 --- a/src/smpi/smpi_pmpi.c +++ b/src/smpi/smpi_pmpi.c @@ -1,3 +1,4 @@ + /* Copyright (c) 2007-2014. The SimGrid Team. * All rights reserved. */ @@ -254,6 +255,18 @@ int PMPI_Type_ub(MPI_Datatype datatype, MPI_Aint * disp) return retval; } +int PMPI_Type_dup(MPI_Datatype datatype, MPI_Datatype *newtype){ + int retval = 0; + + if (datatype == MPI_DATATYPE_NULL) { + retval = MPI_ERR_TYPE; + } else { + *newtype = smpi_datatype_dup(datatype); + retval = MPI_SUCCESS; + } + return retval; +} + int PMPI_Op_create(MPI_User_function * function, int commute, MPI_Op * op) { int retval = 0; @@ -2586,20 +2599,16 @@ int PMPI_Initialized(int* flag) { int PMPI_Cart_create(MPI_Comm comm_old, int ndims, int* dims, int* periodic, int reorder, MPI_Comm* comm_cart) { int retval = 0; - smpi_bench_end(); if (comm_old == MPI_COMM_NULL){ - return MPI_ERR_COMM; - } - else if (ndims < 0 || + retval = MPI_ERR_COMM; + } else if (ndims < 0 || (ndims > 0 && (dims == NULL || periodic == NULL)) || comm_cart == NULL) { - return MPI_ERR_ARG; + retval = MPI_ERR_ARG; + } else{ + retval = smpi_mpi_cart_create(comm_old, ndims, dims, periodic, reorder, comm_cart); } - retval = smpi_mpi_cart_create(comm_old, ndims, dims, periodic, reorder, comm_cart); - - smpi_bench_begin(); - return retval; } @@ -2680,6 +2689,166 @@ int PMPI_Cart_sub(MPI_Comm comm, int* remain_dims, MPI_Comm* comm_new) { return smpi_mpi_cart_sub(comm, remain_dims, comm_new); } +int PMPI_Type_create_resized(MPI_Datatype oldtype,MPI_Aint lb, MPI_Aint extent, MPI_Datatype *newtype){ + if(oldtype == MPI_DATATYPE_NULL) { + return MPI_ERR_TYPE; + } + int blocks[3] = { 1, 1, 1 }; + MPI_Aint disps[3] = { lb, 0, lb+extent }; + MPI_Datatype types[3] = { MPI_LB, oldtype, MPI_UB }; + + s_smpi_mpi_struct_t* subtype = smpi_datatype_struct_create( blocks, + disps, + 3, + types + ); + smpi_datatype_create(newtype,oldtype->size, lb, lb + extent, 1 , subtype, DT_FLAG_VECTOR); + + (*newtype)->flags &= ~DT_FLAG_COMMITED; + return MPI_SUCCESS; +} + + + +int PMPI_Win_create( void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, MPI_Win *win){ + int retval = 0; + smpi_bench_end(); + if (comm == MPI_COMM_NULL) { + retval= MPI_ERR_COMM; + }else if ((base == NULL && size != 0) + || disp_unit <= 0 || size < 0 ){ + retval= MPI_ERR_OTHER; + }else{ + *win = smpi_mpi_win_create( base, size, disp_unit, info, comm); + retval = MPI_SUCCESS; + } + smpi_bench_begin(); + return retval; +} + +int PMPI_Win_free( MPI_Win* win){ + int retval = 0; + smpi_bench_end(); + if (win == NULL || *win == MPI_WIN_NULL) { + retval = MPI_ERR_WIN; + }else{ + retval=smpi_mpi_win_free(win); + } + smpi_bench_begin(); + return retval; +} + + +int PMPI_Win_fence( int assert, MPI_Win win){ + int retval = 0; + smpi_bench_end(); + if (win == MPI_WIN_NULL) { + retval = MPI_ERR_WIN; + } else { + retval = smpi_mpi_win_fence(assert, win); + } + smpi_bench_begin(); + return retval; +} + +int PMPI_Get( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, + MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win){ + int retval = 0; + smpi_bench_end(); + if (win == MPI_WIN_NULL) { + retval = MPI_ERR_WIN; + } else if (target_rank == MPI_PROC_NULL) { + retval = MPI_SUCCESS; + } else if (target_rank <0){ + retval = MPI_ERR_RANK; + } else if (target_disp <0){ + retval = MPI_ERR_ARG; + } else if (origin_count < 0 || target_count < 0) { + retval = MPI_ERR_COUNT; + } else if (origin_addr==NULL && origin_count > 0){ + retval = MPI_ERR_COUNT; + } else if ((!is_datatype_valid(origin_datatype)) || + (!is_datatype_valid(target_datatype))) { + retval = MPI_ERR_TYPE; + } else { + retval = smpi_mpi_get( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, win); + } + smpi_bench_begin(); + return retval; +} + +int PMPI_Put( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, + MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win){ + int retval = 0; + smpi_bench_end(); + if (win == MPI_WIN_NULL) { + retval = MPI_ERR_WIN; + } else if (target_rank == MPI_PROC_NULL) { + retval = MPI_SUCCESS; + } else if (target_rank <0){ + retval = MPI_ERR_RANK; + } else if (target_disp <0){ + retval = MPI_ERR_ARG; + } else if (origin_count < 0 || target_count < 0) { + retval = MPI_ERR_COUNT; + } else if (origin_addr==NULL && origin_count > 0){ + retval = MPI_ERR_COUNT; + } else if ((!is_datatype_valid(origin_datatype)) || + (!is_datatype_valid(target_datatype))) { + retval = MPI_ERR_TYPE; + } else { + retval = smpi_mpi_put( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, win); + } + smpi_bench_begin(); + return retval; +} + + +int PMPI_Accumulate( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, + MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win){ + int retval = 0; + smpi_bench_end(); + if (win == MPI_WIN_NULL) { + retval = MPI_ERR_WIN; + } else if (target_rank == MPI_PROC_NULL) { + retval = MPI_SUCCESS; + } else if (target_rank <0){ + retval = MPI_ERR_RANK; + } else if (target_disp <0){ + retval = MPI_ERR_ARG; + } else if (origin_count < 0 || target_count < 0) { + retval = MPI_ERR_COUNT; + } else if (origin_addr==NULL && origin_count > 0){ + retval = MPI_ERR_COUNT; + } else if ((!is_datatype_valid(origin_datatype)) || + (!is_datatype_valid(target_datatype))) { + retval = MPI_ERR_TYPE; + } else if (op == MPI_OP_NULL) { + retval = MPI_ERR_OP; + } else { + retval = smpi_mpi_accumulate( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, op, win); + } + smpi_bench_begin(); + return retval; +} + + +int PMPI_Alloc_mem(MPI_Aint size, MPI_Info info, void *baseptr){ + void *ptr = xbt_malloc(size); + if(!ptr) + return MPI_ERR_NO_MEM; + else { + *(void **)baseptr = ptr; + return MPI_SUCCESS; + } +} + +int PMPI_Free_mem(void *baseptr){ + xbt_free(baseptr); + return MPI_SUCCESS; +} + + /* The following calls are not yet implemented and will fail at runtime. */ /* Once implemented, please move them above this notice. */ @@ -2689,14 +2858,6 @@ int PMPI_Cart_sub(MPI_Comm comm, int* remain_dims, MPI_Comm* comm_new) { return MPI_SUCCESS; \ } -int PMPI_Type_create_resized(MPI_Datatype oldtype,MPI_Aint lb, MPI_Aint extent, MPI_Datatype *newtype){ - NOT_YET_IMPLEMENTED -} - -int PMPI_Type_dup(MPI_Datatype datatype, MPI_Datatype *newtype){ - NOT_YET_IMPLEMENTED -} - int PMPI_Type_set_name(MPI_Datatype datatype, char * name) { NOT_YET_IMPLEMENTED @@ -2769,6 +2930,10 @@ int PMPI_Comm_set_errhandler(MPI_Comm comm, MPI_Errhandler errhandler) { NOT_YET_IMPLEMENTED } +int PMPI_Win_set_errhandler(MPI_Win win, MPI_Errhandler errhandler) { + NOT_YET_IMPLEMENTED +} + int PMPI_Comm_get_errhandler(MPI_Comm comm, MPI_Errhandler* errhandler) { NOT_YET_IMPLEMENTED } @@ -2930,18 +3095,6 @@ int PMPI_Get_elements(MPI_Status* status, MPI_Datatype datatype, int* elements) NOT_YET_IMPLEMENTED } -int PMPI_Win_fence( int assert, MPI_Win win){ - NOT_YET_IMPLEMENTED -} - -int PMPI_Win_free( MPI_Win* win){ - NOT_YET_IMPLEMENTED -} - -int PMPI_Win_create( void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, MPI_Win *win){ - NOT_YET_IMPLEMENTED -} - int PMPI_Info_create( MPI_Info *info){ NOT_YET_IMPLEMENTED } @@ -2954,11 +3107,6 @@ int PMPI_Info_free( MPI_Info *info){ NOT_YET_IMPLEMENTED } -int PMPI_Get( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, - MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win){ - NOT_YET_IMPLEMENTED -} - int PMPI_Type_get_envelope( MPI_Datatype datatype, int *num_integers, int *num_addresses, int *num_datatypes, int *combiner){ NOT_YET_IMPLEMENTED