Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
adding very hacked together and inefficient implementation of mpi_comm_world.
authormarkls <markls@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Sat, 15 Sep 2007 09:15:25 +0000 (09:15 +0000)
committermarkls <markls@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Sat, 15 Sep 2007 09:15:25 +0000 (09:15 +0000)
doesn't work yet.

git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@4635 48e7efb5-ca39-0410-a469-dd3cf9ba447f

include/smpi/smpi.h
src/smpi/private.h
src/smpi/smpi_mpi.c
src/smpi/smpi_receiver.c
src/smpi/smpi_sender.c

index 0e390c8..f10b8c2 100644 (file)
@@ -10,6 +10,8 @@
 
 #define MPI_ANY_TAG -1
 
 
 #define MPI_ANY_TAG -1
 
+#define MPI_UNDEFINED -1
+
 // errorcodes
 #define MPI_SUCCESS     0
 #define MPI_ERR_COMM    1
 // errorcodes
 #define MPI_SUCCESS     0
 #define MPI_ERR_COMM    1
@@ -86,6 +88,7 @@ int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI
 int 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 MPI_Send(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm);
 int 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 MPI_Send(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm);
+int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *comm_out);
 
 // smpi functions
 XBT_IMPORT_NO_EXPORT(int) smpi_simulated_main(int argc, char **argv);
 
 // smpi functions
 XBT_IMPORT_NO_EXPORT(int) smpi_simulated_main(int argc, char **argv);
index 6a6a436..c69ddb4 100644 (file)
@@ -44,6 +44,9 @@ typedef struct smpi_mpi_request_t {
 
        smx_mutex_t mutex;
        smx_cond_t  cond;
 
        smx_mutex_t mutex;
        smx_cond_t  cond;
+
+       void *data;
+
 } s_smpi_mpi_request_t;
 
 // smpi mpi op
 } s_smpi_mpi_request_t;
 
 // smpi mpi op
@@ -58,6 +61,9 @@ typedef struct smpi_received_message_t {
        int tag;
 
        void *buf;
        int tag;
 
        void *buf;
+
+       void *data;
+
 } s_smpi_received_message_t;
 typedef struct smpi_received_message_t *smpi_received_message_t;
 
 } s_smpi_received_message_t;
 typedef struct smpi_received_message_t *smpi_received_message_t;
 
index c378d86..97ce5df 100644 (file)
@@ -181,3 +181,107 @@ int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_
 
        return retval;
 }
 
        return retval;
 }
+
+int 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_host_index();
+       rank  = comm->index_to_rank_map[index];
+
+       if (0 == rank) {
+
+               int *colors = xbt_new(int, comm->size);
+               int *keys   = xbt_new(int, comm->size);
+               int i, j, k;
+               smpi_mpi_communicator_t tempcomm = NULL;
+               int colortmp;
+               int keycount;
+               int *keystmp  = xbt_new(int, comm->size);
+               int *rankstmp = xbt_new(int, comm->size);
+               int tmpval;
+               int indextmp;
+
+               colors[0] = color;
+               keys[0]   = key;
+
+               // FIXME: not efficient
+               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);
+                       xbt_mallocator_release(smpi_global->request_mallocator, request);
+                       colors[i] = colorkey[0];
+                       keys[i]   = colorkey[1];
+               }
+
+               for (i = 0; i < comm->size; i++) {
+                       if (-1 == colors[i]) {
+                               continue;
+                       }
+                       colortmp = colors[i];
+                       keycount = 0;
+                       for (j = i; j < comm->size; j++) {
+                               if(colortmp == colors[j]) {
+                                       colors[j] = -1;
+                                       keystmp[keycount] = keys[j];
+                                       rankstmp[keycount] = j;
+                                       keycount++;
+                               }
+                       }
+                       if (0 < keycount) {
+                               // FIXME: yes, mock me, bubble sort...
+                               for (j = 0; j < keycount; j++) {
+                                       for (k = keycount - 1; k > j; k--) {
+                                               if (keystmp[k] < keystmp[k - 1]) {
+                                                       tmpval          = keystmp[k];
+                                                       keystmp[k]      = keystmp[k - 1];
+                                                       keystmp[k - 1]  = tmpval;
+
+                                                       tmpval          = rankstmp[k];
+                                                       rankstmp[k]     = rankstmp[k - 1];
+                                                       rankstmp[k - 1] = tmpval;
+                                               }
+                                       }
+                               }
+                               tempcomm                    = xbt_new(s_smpi_mpi_communicator_t, 1);
+                               tempcomm->barrier_count     = 0;
+                               tempcomm->barrier_mutex     = SIMIX_mutex_init();
+                               tempcomm->barrier_cond      = SIMIX_cond_init();
+                               tempcomm->rank_to_index_map = xbt_new(int, keycount);
+                               tempcomm->index_to_rank_map = xbt_new(int, smpi_global->host_count);
+                               for (j = 0; j < smpi_global->host_count; j++) {
+                                       tempcomm->index_to_rank_map[j] = -1;
+                               }
+                               for (j = 0; j < keycount; j++) {
+                                       indextmp = comm->rank_to_index_map[rankstmp[j]];
+                                       tempcomm->rank_to_index_map[j]        = indextmp;
+                                       tempcomm->index_to_rank_map[indextmp] = j;
+                               }
+                               // FIXME: now send new communicator to happy troops...
+                       }
+               }
+
+       } 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);
+       }
+
+       smpi_bench_begin();
+
+       return retval;
+}
index 283e5f2..315810d 100644 (file)
@@ -84,6 +84,7 @@ stopsearch:
                        memcpy(request->buf, message->buf, request->datatype->size * request->count);
                        request->src = message->src;
                        request->completed = 1;
                        memcpy(request->buf, message->buf, request->datatype->size * request->count);
                        request->src = message->src;
                        request->completed = 1;
+                       request->data = message->data;
                        SIMIX_cond_broadcast(request->cond);
                        SIMIX_mutex_unlock(request->mutex);
 
                        SIMIX_cond_broadcast(request->cond);
                        SIMIX_mutex_unlock(request->mutex);
 
index 5715058..c3cee34 100644 (file)
@@ -70,6 +70,7 @@ int smpi_sender(int argc, char **argv)
                        message->tag  = request->tag;
                        message->buf  = xbt_malloc(request->datatype->size * request->count);
                        memcpy(message->buf, request->buf, request->datatype->size * request->count);
                        message->tag  = request->tag;
                        message->buf  = xbt_malloc(request->datatype->size * request->count);
                        memcpy(message->buf, request->buf, request->datatype->size * request->count);
+                       message->data = request->data;
 
                        dindex = request->comm->rank_to_index_map[request->dst];
                        dhost  = smpi_global->hosts[dindex];
 
                        dindex = request->comm->rank_to_index_map[request->dst];
                        dhost  = smpi_global->hosts[dindex];