X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/03216b99d0e66e1778d9b99b11c3207c87900aad..e1e50fa3f7c4b7b6bcb94dba4d4032f4d69260b9:/src/smpi/smpi_mpi.c diff --git a/src/smpi/smpi_mpi.c b/src/smpi/smpi_mpi.c index f18a5c1048..f98336efd7 100644 --- a/src/smpi/smpi_mpi.c +++ b/src/smpi/smpi_mpi.c @@ -1,461 +1,1017 @@ +/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + #include "private.h" +#include "simgrid/sg_config.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_mpi, smpi, "Logging specific to SMPI (mpi)"); -int SMPI_MPI_Init(int *argc, char ***argv) +/* MPI User level calls */ + +int MPI_Init(int *argc, char ***argv) +{ + + return PMPI_Init(argc, argv); +} + +int MPI_Finalize(void) +{ + return PMPI_Finalize(); +} + +int MPI_Finalized(int * flag) +{ + return PMPI_Finalized(flag); +} + +int MPI_Init_thread(int *argc, char ***argv, int required, int *provided) +{ + return PMPI_Init_thread(argc, argv, required, provided); +} + +int MPI_Query_thread(int *provided) +{ + return PMPI_Query_thread(provided); +} + +int MPI_Is_thread_main(int *flag) +{ + return PMPI_Is_thread_main(flag); +} + +int MPI_Abort(MPI_Comm comm, int errorcode) +{ + return PMPI_Abort(comm, errorcode); +} + +double MPI_Wtime(void) +{ + return PMPI_Wtime(); +} + +double MPI_Wtick(void) +{ + return PMPI_Wtick(); +} + +int MPI_Address(void *location, MPI_Aint * address) +{ + return PMPI_Address(location, address); +} + +int MPI_Get_address(void *location, MPI_Aint * address) +{ + return PMPI_Get_address(location, address); +} + +int MPI_Type_free(MPI_Datatype * datatype) +{ + return PMPI_Type_free(datatype); +} + +int MPI_Type_dup(MPI_Datatype datatype, MPI_Datatype * newdatatype) +{ + return PMPI_Type_dup(datatype, newdatatype); +} + +int MPI_Type_set_name(MPI_Datatype datatype, char * name) +{ + return PMPI_Type_set_name(datatype, name); +} + +int MPI_Type_get_name(MPI_Datatype datatype, char * name, int* len) +{ + return PMPI_Type_get_name(datatype,name,len); +} + +int MPI_Type_get_attr (MPI_Datatype type, int type_keyval, void *attribute_val, int* flag) +{ + return PMPI_Type_set_attr ( type, type_keyval, attribute_val); +} + +int MPI_Type_set_attr (MPI_Datatype type, int type_keyval, void *attribute_val) { - smpi_process_init(argc,argv); - smpi_bench_begin(); - return MPI_SUCCESS; + return PMPI_Type_set_attr ( type, type_keyval, attribute_val); } -int SMPI_MPI_Finalize() +int MPI_Type_delete_attr (MPI_Datatype type, int type_keyval) { - smpi_bench_end(); - smpi_process_finalize(); - return MPI_SUCCESS; + return PMPI_Type_delete_attr (type, type_keyval); } -// right now this just exits the current node, should send abort signal to all -// hosts in the communicator (TODO) -int SMPI_MPI_Abort(MPI_Comm comm, int errorcode) +int MPI_Type_create_keyval(MPI_Type_copy_attr_function* copy_fn, MPI_Type_delete_attr_function* delete_fn, int* keyval, void* extra_state) { - smpi_exit(errorcode); - return 0; + return PMPI_Type_create_keyval(copy_fn, delete_fn, keyval, extra_state) ; } -int SMPI_MPI_Comm_size(MPI_Comm comm, int *size) +int MPI_Type_free_keyval(int* keyval) { + return PMPI_Type_free_keyval( keyval); +} + +int MPI_Pcontrol(const int level ) +{ + return PMPI_Pcontrol(level); +} + +int MPI_Type_size(MPI_Datatype datatype, int *size) +{ + return PMPI_Type_size(datatype, size); +} + +int MPI_Type_get_extent(MPI_Datatype datatype, MPI_Aint * lb, MPI_Aint * extent) +{ + return PMPI_Type_get_extent(datatype, lb, extent); +} + +int MPI_Type_get_true_extent(MPI_Datatype datatype, MPI_Aint * lb, MPI_Aint * extent) +{ + return PMPI_Type_get_true_extent(datatype, lb, extent); +} + +int MPI_Type_extent(MPI_Datatype datatype, MPI_Aint * extent) +{ + return PMPI_Type_extent(datatype, extent); +} + +int MPI_Type_lb(MPI_Datatype datatype, MPI_Aint * disp) +{ + return PMPI_Type_lb(datatype, disp); +} + +int MPI_Type_ub(MPI_Datatype datatype, MPI_Aint * disp) +{ + return PMPI_Type_ub(datatype, disp); +} + +int MPI_Op_create(MPI_User_function * function, int commute, MPI_Op * op) +{ + return PMPI_Op_create(function, commute, op); +} + +int MPI_Op_free(MPI_Op * op) { - int retval = MPI_SUCCESS; + return PMPI_Op_free(op); +} + +int MPI_Group_free(MPI_Group * group) +{ + return PMPI_Group_free(group); +} + +int MPI_Group_size(MPI_Group group, int *size) +{ + return PMPI_Group_size(group, size); +} + +int MPI_Group_rank(MPI_Group group, int *rank) +{ + return PMPI_Group_rank(group, rank); +} + +int MPI_Group_translate_ranks(MPI_Group group1, int n, int *ranks1, + MPI_Group group2, int *ranks2) +{ + return PMPI_Group_translate_ranks(group1, n, ranks1, group2, ranks2); +} - smpi_bench_end(); +int MPI_Group_compare(MPI_Group group1, MPI_Group group2, int *result) +{ + return PMPI_Group_compare(group1, group2, result); +} + +int MPI_Group_union(MPI_Group group1, MPI_Group group2, MPI_Group * newgroup) +{ + return PMPI_Group_union(group1, group2, newgroup); +} + +int MPI_Group_intersection(MPI_Group group1, MPI_Group group2, MPI_Group * newgroup) +{ + return PMPI_Group_intersection(group1, group2, newgroup); +} + +int MPI_Group_difference(MPI_Group group1, MPI_Group group2, MPI_Group * newgroup) +{ + return PMPI_Group_difference(group1, group2, newgroup); +} + +int MPI_Group_incl(MPI_Group group, int n, int *ranks, MPI_Group * newgroup) +{ + return PMPI_Group_incl(group, n, ranks, newgroup); +} - if (NULL == comm) { - retval = MPI_ERR_COMM; - } else if (NULL == size) { - retval = MPI_ERR_ARG; - } else { - *size = comm->size; - } +int MPI_Group_excl(MPI_Group group, int n, int *ranks, MPI_Group * newgroup) +{ + return PMPI_Group_excl(group, n, ranks, newgroup); +} - smpi_bench_begin(); +int MPI_Group_range_incl(MPI_Group group, int n, int ranges[][3], + MPI_Group * newgroup) +{ + return PMPI_Group_range_incl(group, n, ranges, newgroup); +} - return retval; +int MPI_Group_range_excl(MPI_Group group, int n, int ranges[][3], + MPI_Group * newgroup) +{ + return PMPI_Group_range_excl(group, n, ranges, newgroup); } -int SMPI_MPI_Comm_rank(MPI_Comm comm, int *rank) +int MPI_Comm_rank(MPI_Comm comm, int *rank) { - int retval = MPI_SUCCESS; + return PMPI_Comm_rank(comm, rank); +} - smpi_bench_end(); +int MPI_Comm_size(MPI_Comm comm, int *size) +{ + return PMPI_Comm_size(comm, size); +} - if (NULL == comm) { - retval = MPI_ERR_COMM; - } else if (NULL == rank) { - retval = MPI_ERR_ARG; - } else { - *rank = smpi_mpi_comm_rank(comm); - } +int MPI_Comm_get_attr (MPI_Comm comm, int comm_keyval, void *attribute_val, int *flag) +{ + return PMPI_Comm_get_attr (comm, comm_keyval, attribute_val, flag); +} - smpi_bench_begin(); +int MPI_Comm_set_attr (MPI_Comm comm, int comm_keyval, void *attribute_val) +{ + return PMPI_Comm_set_attr ( comm, comm_keyval, attribute_val); +} - return retval; +int MPI_Comm_delete_attr (MPI_Comm comm, int comm_keyval) +{ + return PMPI_Comm_delete_attr (comm, comm_keyval); } -int SMPI_MPI_Type_size(MPI_Datatype datatype, size_t * size) +int MPI_Comm_create_keyval(MPI_Comm_copy_attr_function* copy_fn, MPI_Comm_delete_attr_function* delete_fn, int* keyval, void* extra_state) { - int retval = MPI_SUCCESS; + return PMPI_Comm_create_keyval(copy_fn, delete_fn, keyval, extra_state) ; +} - smpi_bench_end(); +int MPI_Comm_free_keyval(int* keyval) { + return PMPI_Comm_free_keyval( keyval); +} - if (NULL == datatype) { - retval = MPI_ERR_TYPE; - } else if (NULL == size) { - retval = MPI_ERR_ARG; - } else { - *size = datatype->size; - } +int MPI_Comm_get_name (MPI_Comm comm, char* name, int* len) +{ + return PMPI_Comm_get_name(comm, name, len); +} - smpi_bench_begin(); +int MPI_Comm_group(MPI_Comm comm, MPI_Group * group) +{ + return PMPI_Comm_group(comm, group); +} - return retval; +int MPI_Comm_compare(MPI_Comm comm1, MPI_Comm comm2, int *result) +{ + return PMPI_Comm_compare(comm1, comm2, result); +} + +int MPI_Comm_dup(MPI_Comm comm, MPI_Comm * newcomm) +{ + return PMPI_Comm_dup(comm, newcomm); } -int SMPI_MPI_Barrier(MPI_Comm comm) +int MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm * newcomm) { - int retval = MPI_SUCCESS; + return PMPI_Comm_create(comm, group, newcomm); +} - smpi_bench_end(); +int MPI_Comm_free(MPI_Comm * comm) +{ + return PMPI_Comm_free(comm); +} - if (NULL == comm) { - retval = MPI_ERR_COMM; - } else { - retval = smpi_mpi_barrier(comm); - } +int MPI_Comm_disconnect(MPI_Comm * comm) +{ + return PMPI_Comm_disconnect(comm); +} - smpi_bench_begin(); +int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm* comm_out) +{ + return PMPI_Comm_split(comm, color, key, comm_out); +} - return retval; +int MPI_Send_init(void *buf, int count, MPI_Datatype datatype, int dst, + int tag, MPI_Comm comm, MPI_Request * request) +{ + return PMPI_Send_init(buf, count, datatype, dst, tag, comm, request); } -int SMPI_MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src, - int tag, MPI_Comm comm, MPI_Request * request) +int MPI_Recv_init(void *buf, int count, MPI_Datatype datatype, int src, + int tag, MPI_Comm comm, MPI_Request * request) { - int retval = MPI_SUCCESS; + return PMPI_Recv_init(buf, count, datatype, src, tag, comm, request); +} - smpi_bench_end(); +int MPI_Start(MPI_Request * request) +{ + return PMPI_Start(request); +} - retval = smpi_create_request(buf, count, datatype, src, 0, tag, comm, - request); - if (NULL != *request && MPI_SUCCESS == retval) { - retval = smpi_mpi_irecv(*request); - } +int MPI_Startall(int count, MPI_Request * requests) +{ + return PMPI_Startall(count, requests); +} - smpi_bench_begin(); +int MPI_Request_free(MPI_Request * request) +{ + return PMPI_Request_free(request); +} - return retval; +int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src, + int tag, MPI_Comm comm, MPI_Request * request) +{ + return PMPI_Irecv(buf, count, datatype, src, tag, comm, request); } -int SMPI_MPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, - int tag, MPI_Comm comm, MPI_Status * status) +int MPI_Isend(void *buf, int count, MPI_Datatype datatype, int dst, + int tag, MPI_Comm comm, MPI_Request * request) { - int retval = MPI_SUCCESS; - smpi_mpi_request_t request; + return PMPI_Isend(buf, count, datatype, dst, tag, comm, request); +} - smpi_bench_end(); +int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, + MPI_Comm comm, MPI_Status * status) +{ + return PMPI_Recv(buf, count, datatype, src, tag, comm, status); +} - retval = smpi_create_request(buf, count, datatype, src, 0, tag, comm, - &request); - if (NULL != request && MPI_SUCCESS == retval) { - retval = smpi_mpi_irecv(request); - if (MPI_SUCCESS == retval) { - retval = smpi_mpi_wait(request, status); - } - xbt_mallocator_release(smpi_global->request_mallocator, request); - } +int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dst, int tag, + MPI_Comm comm) +{ + return PMPI_Send(buf, count, datatype, dst, tag, comm); +} - smpi_bench_begin(); +int MPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, + int dst, int sendtag, void *recvbuf, int recvcount, + MPI_Datatype recvtype, int src, int recvtag, + MPI_Comm comm, MPI_Status * status) +{ + return PMPI_Sendrecv(sendbuf, sendcount, sendtype, dst, sendtag, + recvbuf, recvcount, recvtype, src, recvtag, + comm, status); +} - return retval; +int MPI_Sendrecv_replace(void *buf, int count, MPI_Datatype datatype, + int dst, int sendtag, int src, int recvtag, + MPI_Comm comm, MPI_Status * status) +{ + return PMPI_Sendrecv_replace(buf, count, datatype, dst, sendtag, src, + recvtag, comm, status); } -int SMPI_MPI_Isend(void *buf, int count, MPI_Datatype datatype, int dst, - int tag, MPI_Comm comm, MPI_Request * request) +int MPI_Test(MPI_Request * request, int *flag, MPI_Status * status) { - int retval = MPI_SUCCESS; + return PMPI_Test(request, flag, status); +} - smpi_bench_end(); +int MPI_Testany(int count, MPI_Request requests[], int *index, int *flag, + MPI_Status * status) +{ + return PMPI_Testany(count, requests, index, flag, status); +} - retval = smpi_create_request(buf, count, datatype, 0, dst, tag, comm, - request); - if (NULL != *request && MPI_SUCCESS == retval) { - retval = smpi_mpi_isend(*request); - } +int MPI_Wait(MPI_Request * request, MPI_Status * status) +{ + return PMPI_Wait(request, status); +} - smpi_bench_begin(); +int MPI_Waitany(int count, MPI_Request requests[], int *index, MPI_Status * status) +{ + return PMPI_Waitany(count, requests, index, status); +} - return retval; +int MPI_Waitall(int count, MPI_Request requests[], MPI_Status status[]) +{ + return PMPI_Waitall(count, requests, status); } -int SMPI_MPI_Send(void *buf, int count, MPI_Datatype datatype, int dst, - int tag, MPI_Comm comm) +int MPI_Waitsome(int incount, MPI_Request requests[], int *outcount, + int *indices, MPI_Status status[]) { - int retval = MPI_SUCCESS; - smpi_mpi_request_t request; + return PMPI_Waitsome(incount, requests, outcount, indices, status); +} - smpi_bench_end(); +int MPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm comm) +{ + return PMPI_Bcast(buf, count, datatype, root, comm); +} - retval = smpi_create_request(buf, count, datatype, 0, dst, tag, comm, - &request); - if (NULL != request && MPI_SUCCESS == retval) { - retval = smpi_mpi_isend(request); - if (MPI_SUCCESS == retval) { - smpi_mpi_wait(request, MPI_STATUS_IGNORE); - } - xbt_mallocator_release(smpi_global->request_mallocator, request); - } +int MPI_Barrier(MPI_Comm comm) +{ + return PMPI_Barrier(comm); +} - smpi_bench_begin(); +int MPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype, + void *recvbuf, int recvcount, MPI_Datatype recvtype, + int root, MPI_Comm comm) +{ + return PMPI_Gather(sendbuf, sendcount, sendtype, + recvbuf, recvcount, recvtype, + root, comm); +} - return retval; +int MPI_Gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, + void *recvbuf, int *recvcounts, int *displs, + MPI_Datatype recvtype, int root, MPI_Comm comm) +{ + return PMPI_Gatherv(sendbuf, sendcount, sendtype, + recvbuf, recvcounts, displs, recvtype, + root, comm); } -/** - * MPI_Wait and friends - **/ -int SMPI_MPI_Wait(MPI_Request * request, MPI_Status * status) +int MPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype, + void *recvbuf, int recvcount, MPI_Datatype recvtype, + MPI_Comm comm) { - return smpi_mpi_wait(*request, status); + return PMPI_Allgather(sendbuf, sendcount, sendtype, + recvbuf, recvcount, recvtype, + comm); } -int SMPI_MPI_Waitall(int count, MPI_Request requests[], MPI_Status status[]) { - return smpi_mpi_waitall(count, requests,status); +int MPI_Allgatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, + void *recvbuf, int *recvcounts, int *displs, + MPI_Datatype recvtype, MPI_Comm comm) +{ + return PMPI_Allgatherv(sendbuf, sendcount, sendtype, + recvbuf, recvcounts, displs, recvtype, + comm); } -int SMPI_MPI_Waitany(int count, MPI_Request requests[], int *index, MPI_Status status[]) { - return smpi_mpi_waitany(count, requests, index,status); + +int MPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype, + void *recvbuf, int recvcount, MPI_Datatype recvtype, + int root, MPI_Comm comm) +{ + return PMPI_Scatter(sendbuf, sendcount, sendtype, + recvbuf, recvcount, recvtype, + root, comm); } -/** - * MPI_Bcast - **/ -int SMPI_MPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root, - MPI_Comm comm) + +int MPI_Scatterv(void *sendbuf, int *sendcounts, int *displs, + MPI_Datatype sendtype, void *recvbuf, int recvcount, + MPI_Datatype recvtype, int root, MPI_Comm comm) { + return PMPI_Scatterv(sendbuf, sendcounts, displs, sendtype, + recvbuf, recvcount, recvtype, + root, comm); +} - int retval = MPI_SUCCESS; - int rank; - smpi_mpi_request_t request; +int MPI_Reduce(void *sendbuf, void *recvbuf, int count, + MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm) +{ + return PMPI_Reduce(sendbuf, recvbuf, count, datatype, op, root, comm); +} - smpi_bench_end(); +int MPI_Reduce_local(void *inbuf, void *inoutbuf, int count, + MPI_Datatype datatype, MPI_Op op){ + return PMPI_Reduce_local(inbuf, inoutbuf, count, datatype, op); +} - rank = smpi_mpi_comm_rank(comm); +int MPI_Allreduce(void *sendbuf, void *recvbuf, int count, + MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) +{ + return PMPI_Allreduce(sendbuf, recvbuf, count, datatype, op, comm); +} - if (rank == root) { - retval = smpi_create_request(buf, count, datatype, root, - (root + 1) % comm->size, 0, comm, &request); - request->forward = comm->size - 1; - smpi_mpi_isend(request); - } else { - retval = smpi_create_request(buf, count, datatype, MPI_ANY_SOURCE, rank, - 0, comm, &request); - smpi_mpi_irecv(request); - } +int MPI_Scan(void *sendbuf, void *recvbuf, int count, + MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) +{ + return PMPI_Scan(sendbuf, recvbuf, count, datatype, op, comm); +} - smpi_mpi_wait(request, MPI_STATUS_IGNORE); - xbt_mallocator_release(smpi_global->request_mallocator, request); +int MPI_Reduce_scatter(void *sendbuf, void *recvbuf, int *recvcounts, + MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) +{ + return PMPI_Reduce_scatter(sendbuf, recvbuf, recvcounts, datatype, op, comm); +} - smpi_bench_begin(); +int MPI_Reduce_scatter_block(void *sendbuf, void *recvbuf, int recvcount, + MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) +{ + return PMPI_Reduce_scatter_block(sendbuf, recvbuf, recvcount, datatype, op, comm); +} - return retval; +int MPI_Alltoall(void *sendbuf, int sendcount, MPI_Datatype sendtype, + void *recvbuf, int recvcount, MPI_Datatype recvtype, + MPI_Comm comm) +{ + return PMPI_Alltoall(sendbuf, sendcount, sendtype, + recvbuf, recvcount, recvtype, + comm); } -/** - * debugging helper function - **/ -void print_buffer_int( void *buf, int len, const char *msg) ; -void print_buffer_int( void *buf, int len, const char *msg) { - int tmp, *v; - printf("**%s: ",msg); - for (tmp=0;tmpsize; +int MPI_Lookup_name( char *service_name, MPI_Info info, char *port_name){ + return PMPI_Lookup_name( service_name, info, port_name); +} - //printf("-->rank %d. Entering ....\n",rank); - //print_buffer_int( sendbuf, count, "sendbuf"); +int MPI_Comm_join( int fd, MPI_Comm *intercomm){ + return PMPI_Comm_join( fd, intercomm); +} - if (rank != root) { // if i am not ROOT, simply send my buffer to root - retval = smpi_create_request(sendbuf, count, datatype, rank, root, tag , comm, &request); - smpi_mpi_isend(request); - smpi_mpi_wait(request, MPI_STATUS_IGNORE); - xbt_mallocator_release(smpi_global->request_mallocator, request); +int MPI_Open_port( MPI_Info info, char *port_name){ + return PMPI_Open_port( info,port_name); +} - } else { - // i am the ROOT: wait for all buffers by creating one request by sender - tabrequest = xbt_malloc((size-1)*sizeof(smpi_mpi_request_t)); +int MPI_Close_port( char *port_name){ + return PMPI_Close_port( port_name); +} - void **tmpbufs = xbt_malloc((size-1)*sizeof(void *)); - for (i=0; isize); - } - memcpy(recvbuf,sendbuf,count*datatype->size*sizeof(char)); // initiliaze recv buf with my own snd buf +int MPI_Comm_accept( char *port_name, MPI_Info info, int root, MPI_Comm comm, MPI_Comm *newcomm){ + return PMPI_Comm_accept( port_name, info, root, comm, newcomm); +} + +int MPI_Comm_spawn( char *command, char **argv, int maxprocs, MPI_Info info, int root, + MPI_Comm comm, MPI_Comm *intercomm, int* array_of_errcodes){ + return PMPI_Comm_spawn( command, argv, maxprocs, info, root, comm, intercomm, array_of_errcodes); +} + +int MPI_Comm_spawn_multiple( int count, char **array_of_commands, char*** array_of_argv, + int* array_of_maxprocs, MPI_Info* array_of_info, int root, + MPI_Comm comm, MPI_Comm *intercomm, int* array_of_errcodes){ + return PMPI_Comm_spawn_multiple( count, array_of_commands, array_of_argv, array_of_maxprocs, + array_of_info, root, comm, intercomm, array_of_errcodes); +} + +int MPI_Comm_get_parent( MPI_Comm *parent){ + return PMPI_Comm_get_parent( parent); +} - // i can not use: 'request->forward = size-1;' (which would progagate size-1 receive reqs) - // since we should op values as soon as one receiving request matches. - for (i=0; isize-1; i++) { - // reminder: for smpi_create_request() the src is always the process sending. - retval = smpi_create_request(tmpbufs[i], count, datatype, - MPI_ANY_SOURCE, root, - tag, comm, &(tabrequest[i])); - if (NULL != tabrequest[i] && MPI_SUCCESS == retval) { - if (MPI_SUCCESS == retval) { - smpi_mpi_irecv(tabrequest[i]); - } - } - } - // now, wait for completion of all irecv's. - for (i=0; isize-1; i++) { - int index = MPI_UNDEFINED; - smpi_mpi_waitany(comm->size-1, tabrequest, &index, MPI_STATUS_IGNORE); - - //print_buffer_int( recvbuf, count, "rcvbuf"); - //printf("MPI_Waitany() unblocked: root received (completes req[index=%d]): ",index); - //print_buffer_int( tmpbufs[index], count, "tmpbufs[index]"); - - // arg 2 is modified - op->func (tmpbufs[index],recvbuf,&count,&datatype); - - // print_buffer_int( recvbuf, count, "recvbuf after func"); - //xbt_mallocator_release(smpi_global->request_mallocator, tabrequest[i]); - //xbt_free( tmpbufs[index]); - } - xbt_free(tabrequest); - xbt_free(tmpbufs); - } - - smpi_bench_begin(); - - return retval; -} - -// used by comm_split to sort ranks based on key values -int smpi_compare_rankkeys(const void *a, const void *b); -int smpi_compare_rankkeys(const void *a, const void *b) -{ - int *x = (int *) a; - int *y = (int *) b; - - if (x[1] < y[1]) - return -1; - - if (x[1] == y[1]) { - if (x[0] < y[0]) - return -1; - if (x[0] == y[0]) - return 0; - return 1; - } - - return 1; -} - -int SMPI_MPI_Comm_split(MPI_Comm comm, int color, int key, - MPI_Comm * comm_out) -{ - int retval = MPI_SUCCESS; - - int index, rank; - smpi_mpi_request_t request; - int colorkey[2]; - smpi_mpi_status_t status; - - smpi_bench_end(); - - // FIXME: need to test parameters - - index = smpi_process_index(); - rank = comm->index_to_rank_map[index]; - - // default output - comm_out = NULL; - - // root node does most of the real work - if (0 == rank) { - int colormap[comm->size]; - int keymap[comm->size]; - int rankkeymap[comm->size * 2]; - int i, j; - smpi_mpi_communicator_t tempcomm = NULL; - int count; - int indextmp; - - colormap[0] = color; - keymap[0] = key; - - // FIXME: use scatter/gather or similar instead of individual comms - for (i = 1; i < comm->size; i++) { - retval = smpi_create_request(colorkey, 2, MPI_INT, MPI_ANY_SOURCE, - rank, MPI_ANY_TAG, comm, &request); - smpi_mpi_irecv(request); - smpi_mpi_wait(request, &status); - colormap[status.MPI_SOURCE] = colorkey[0]; - keymap[status.MPI_SOURCE] = colorkey[1]; - xbt_mallocator_release(smpi_global->request_mallocator, request); - } - - for (i = 0; i < comm->size; i++) { - if (MPI_UNDEFINED == colormap[i]) { - continue; - } - // make a list of nodes with current color and sort by keys - count = 0; - for (j = i; j < comm->size; j++) { - if (colormap[i] == colormap[j]) { - colormap[j] = MPI_UNDEFINED; - rankkeymap[count * 2] = j; - rankkeymap[count * 2 + 1] = keymap[j]; - count++; - } - } - qsort(rankkeymap, count, sizeof(int) * 2, &smpi_compare_rankkeys); - - // new communicator - tempcomm = xbt_new(s_smpi_mpi_communicator_t, 1); - tempcomm->barrier_count = 0; - tempcomm->size = count; - tempcomm->barrier_mutex = SIMIX_mutex_init(); - tempcomm->barrier_cond = SIMIX_cond_init(); - tempcomm->rank_to_index_map = xbt_new(int, count); - tempcomm->index_to_rank_map = xbt_new(int, smpi_global->process_count); - for (j = 0; j < smpi_global->process_count; j++) { - tempcomm->index_to_rank_map[j] = -1; - } - for (j = 0; j < count; j++) { - indextmp = comm->rank_to_index_map[rankkeymap[j * 2]]; - tempcomm->rank_to_index_map[j] = indextmp; - tempcomm->index_to_rank_map[indextmp] = j; - } - for (j = 0; j < count; j++) { - if (rankkeymap[j * 2]) { - retval = smpi_create_request(&j, 1, MPI_INT, 0, - rankkeymap[j * 2], 0, comm, &request); - request->data = tempcomm; - smpi_mpi_isend(request); - smpi_mpi_wait(request, &status); - xbt_mallocator_release(smpi_global->request_mallocator, request); - } else { - *comm_out = tempcomm; - } - } - } - } else { - colorkey[0] = color; - colorkey[1] = key; - retval = smpi_create_request(colorkey, 2, MPI_INT, rank, 0, 0, comm, - &request); - smpi_mpi_isend(request); - smpi_mpi_wait(request, &status); - xbt_mallocator_release(smpi_global->request_mallocator, request); - if (MPI_UNDEFINED != color) { - retval = smpi_create_request(colorkey, 1, MPI_INT, 0, rank, 0, comm, - &request); - smpi_mpi_irecv(request); - smpi_mpi_wait(request, &status); - *comm_out = request->data; - } - } - - smpi_bench_begin(); - - return retval; -} - -double SMPI_MPI_Wtime( void ) -{ - return ( SIMIX_get_clock() ); +int MPI_Type_create_hvector(int count, int blocklen, MPI_Aint stride, MPI_Datatype old_type, MPI_Datatype* new_type) { + return PMPI_Type_create_hvector(count, blocklen, stride, old_type, new_type); }