Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of git+ssh://scm.gforge.inria.fr//gitroot/simgrid/simgrid
authornavarro <navarro@caraja.(none)>
Tue, 23 Oct 2012 19:16:04 +0000 (21:16 +0200)
committernavarro <navarro@caraja.(none)>
Tue, 23 Oct 2012 19:16:04 +0000 (21:16 +0200)
include/smpi/smpi.h
src/smpi/smpi_comm.c
src/smpi/smpi_global.c
src/smpi/smpi_mpi_dt.c
src/smpi/smpi_pmpi.c

index b909f28..50e61d1 100644 (file)
@@ -391,6 +391,7 @@ typedef int MPI_Copy_function(MPI_Comm oldcomm, int keyval, void* extra_state, v
                               void* attribute_val_out, int* flag);
 typedef int MPI_Delete_function(MPI_Comm comm, int keyval, void* attribute_val, void* extra_state);
 
+XBT_PUBLIC(MPI_Datatype)  MPI_PACKED;
 MPI_CALL(XBT_PUBLIC(int), MPI_Pack_size, (int incount, MPI_Datatype datatype, MPI_Comm comm, int* size));
 MPI_CALL(XBT_PUBLIC(int), MPI_Cart_coords, (MPI_Comm comm, int rank, int maxdims, int* coords));
 MPI_CALL(XBT_PUBLIC(int), MPI_Cart_create, (MPI_Comm comm_old, int ndims, int* dims, int* periods, int reorder, MPI_Comm* comm_cart));
index c189c4d..d49b858 100644 (file)
@@ -48,7 +48,6 @@ MPI_Comm smpi_comm_new(MPI_Group group)
 
 void smpi_comm_destroy(MPI_Comm comm)
 {
-  smpi_group_destroy(comm->group);
   xbt_free(comm);
 }
 
index ef8b782..8c02fb4 100644 (file)
@@ -263,6 +263,7 @@ void smpi_global_destroy(void)
   int i;
 
   smpi_bench_destroy();
+  smpi_group_destroy(smpi_comm_group(MPI_COMM_WORLD));
   smpi_comm_destroy(MPI_COMM_WORLD);
   MPI_COMM_WORLD = MPI_COMM_NULL;
   for (i = 0; i < count; i++) {
index d277579..efc7f6b 100644 (file)
@@ -105,6 +105,7 @@ CREATE_MPI_DATATYPE(MPI_LONG_DOUBLE_INT, long_double_int);
 
 CREATE_MPI_DATATYPE_NULL(MPI_UB);
 CREATE_MPI_DATATYPE_NULL(MPI_LB);
+CREATE_MPI_DATATYPE_NULL(MPI_PACKED);
 // Internal use only
 CREATE_MPI_DATATYPE(MPI_PTR, void*);
 
@@ -288,14 +289,10 @@ void smpi_datatype_free(MPI_Datatype* type){
 int smpi_datatype_contiguous(int count, MPI_Datatype old_type, MPI_Datatype* new_type)
 {
   int retval;
-  if ((old_type->flags & DT_FLAG_COMMITED) != DT_FLAG_COMMITED) {
-    retval = MPI_ERR_TYPE;
-  } else {
-    smpi_datatype_create(new_type, count *
-                         smpi_datatype_size(old_type),count *
-                         smpi_datatype_size(old_type),0,NULL, DT_FLAG_CONTIGUOUS);
-    retval=MPI_SUCCESS;
-  }
+  smpi_datatype_create(new_type, count *
+                       smpi_datatype_size(old_type),count *
+                       smpi_datatype_size(old_type),0,NULL, DT_FLAG_CONTIGUOUS);
+  retval=MPI_SUCCESS;
   return retval;
 }
 
@@ -303,36 +300,31 @@ int smpi_datatype_vector(int count, int blocklen, int stride, MPI_Datatype old_t
 {
   int retval;
   if (blocklen<=0) return MPI_ERR_ARG;
-  if ((old_type->flags & DT_FLAG_COMMITED) != DT_FLAG_COMMITED) {
-    retval = MPI_ERR_TYPE;
-  } else {
-    if(stride != blocklen){
-if (old_type->has_subtype == 1)
-      XBT_WARN("vector contains a complex type - not yet handled");
-      s_smpi_mpi_vector_t* subtype = smpi_datatype_vector_create( stride,
-                                                                  blocklen,
-                                                                  count,
-                                                                  old_type,
-                                                                  smpi_datatype_size(old_type));
-
-      smpi_datatype_create(new_type, count * (blocklen) *
-                           smpi_datatype_size(old_type),
-                          ((count -1) * stride + blocklen) * smpi_datatype_size(old_type),
-                           1,
-                           subtype,
-                           DT_FLAG_VECTOR);
-      retval=MPI_SUCCESS;
-    }else{
-      /* in this situation the data are contignous thus it's not
-       * required to serialize and unserialize it*/
-      smpi_datatype_create(new_type, count * blocklen *
-                           smpi_datatype_size(old_type), ((count -1) * stride + blocklen)*
-                           smpi_datatype_size(old_type),
-                           0,
-                           NULL,
-                           DT_FLAG_VECTOR|DT_FLAG_CONTIGUOUS);
-      retval=MPI_SUCCESS;
-    }
+  if(stride != blocklen){
+  if (old_type->has_subtype == 1)
+    XBT_WARN("vector contains a complex type - not yet handled");
+    s_smpi_mpi_vector_t* subtype = smpi_datatype_vector_create( stride,
+                                                                blocklen,
+                                                                count,
+                                                                old_type,
+                                                                smpi_datatype_size(old_type));
+    smpi_datatype_create(new_type, count * (blocklen) *
+                         smpi_datatype_size(old_type),
+                        ((count -1) * stride + blocklen) * smpi_datatype_size(old_type),
+                         1,
+                         subtype,
+                         DT_FLAG_VECTOR);
+    retval=MPI_SUCCESS;
+  }else{
+    /* in this situation the data are contignous thus it's not
+     * required to serialize and unserialize it*/
+    smpi_datatype_create(new_type, count * blocklen *
+                         smpi_datatype_size(old_type), ((count -1) * stride + blocklen)*
+                         smpi_datatype_size(old_type),
+                         0,
+                         NULL,
+                         DT_FLAG_VECTOR|DT_FLAG_CONTIGUOUS);
+    retval=MPI_SUCCESS;
   }
   return retval;
 }
@@ -432,34 +424,30 @@ int smpi_datatype_hvector(int count, int blocklen, MPI_Aint stride, MPI_Datatype
 {
   int retval;
   if (blocklen<=0) return MPI_ERR_ARG;
-  if ((old_type->flags & DT_FLAG_COMMITED) != DT_FLAG_COMMITED) {
-    retval = MPI_ERR_TYPE;
-  } else {
-if (old_type->has_subtype == 1)
+  if (old_type->has_subtype == 1)
       XBT_WARN("hvector contains a complex type - not yet handled");
-    if(stride != blocklen*smpi_datatype_size(old_type)){
-      s_smpi_mpi_hvector_t* subtype = smpi_datatype_hvector_create( stride,
-                                                                    blocklen,
-                                                                    count,
-                                                                    old_type,
-                                                                    smpi_datatype_size(old_type));
-
-      smpi_datatype_create(new_type, count * blocklen *
-                           smpi_datatype_size(old_type), (count-1) * stride + blocklen *
-                           smpi_datatype_size(old_type),
-                           1,
-                           subtype,
-                           DT_FLAG_VECTOR);
-      retval=MPI_SUCCESS;
-    }else{
-      smpi_datatype_create(new_type, count * blocklen *
-                                               smpi_datatype_size(old_type),count * blocklen *
-                                               smpi_datatype_size(old_type),
-                                              0,
-                                              NULL,
-                                              DT_FLAG_VECTOR|DT_FLAG_CONTIGUOUS);
-      retval=MPI_SUCCESS;
-    }
+  if(stride != blocklen*smpi_datatype_size(old_type)){
+    s_smpi_mpi_hvector_t* subtype = smpi_datatype_hvector_create( stride,
+                                                                  blocklen,
+                                                                  count,
+                                                                  old_type,
+                                                                  smpi_datatype_size(old_type));
+
+    smpi_datatype_create(new_type, count * blocklen *
+                         smpi_datatype_size(old_type), (count-1) * stride + blocklen *
+                         smpi_datatype_size(old_type),
+                         1,
+                         subtype,
+                         DT_FLAG_VECTOR);
+    retval=MPI_SUCCESS;
+  }else{
+    smpi_datatype_create(new_type, count * blocklen *
+                                             smpi_datatype_size(old_type),count * blocklen *
+                                             smpi_datatype_size(old_type),
+                                            0,
+                                            NULL,
+                                            DT_FLAG_VECTOR|DT_FLAG_CONTIGUOUS);
+    retval=MPI_SUCCESS;
   }
   return retval;
 }
@@ -578,29 +566,23 @@ int smpi_datatype_indexed(int count, int* blocklens, int* indices, MPI_Datatype
 
     if ( (i< count -1) && (indices[i]+blocklens[i] != indices[i+1]) )contiguous=0;
   }
-  if ((old_type->flags & DT_FLAG_COMMITED) != DT_FLAG_COMMITED) {
-    retval = MPI_ERR_TYPE;
-  } else {
+  if (old_type->has_subtype == 1)
+    XBT_WARN("indexed contains a complex type - not yet handled");
 
-    if (old_type->has_subtype == 1)
-      XBT_WARN("indexed contains a complex type - not yet handled");
-
-    if(!contiguous){
-      s_smpi_mpi_indexed_t* subtype = smpi_datatype_indexed_create( blocklens,
-                                                                    indices,
-                                                                    count,
-                                                                    old_type,
-                                                                    smpi_datatype_size(old_type));
-
-      smpi_datatype_create(new_type,  size *
-                           smpi_datatype_size(old_type),(indices[count-1]+blocklens[count-1])*smpi_datatype_size(old_type),1, subtype, DT_FLAG_DATA);
-}else{
-      smpi_datatype_create(new_type,  size *
-                           smpi_datatype_size(old_type),size *
-                           smpi_datatype_size(old_type),0, NULL, DT_FLAG_DATA|DT_FLAG_CONTIGUOUS);
-}
-    retval=MPI_SUCCESS;
+  if(!contiguous){
+    s_smpi_mpi_indexed_t* subtype = smpi_datatype_indexed_create( blocklens,
+                                                                  indices,
+                                                                  count,
+                                                                  old_type,
+                                                                  smpi_datatype_size(old_type));
+     smpi_datatype_create(new_type,  size *
+                         smpi_datatype_size(old_type),(indices[count-1]+blocklens[count-1])*smpi_datatype_size(old_type),1, subtype, DT_FLAG_DATA);
+  }else{
+    smpi_datatype_create(new_type,  size *
+                         smpi_datatype_size(old_type),size *
+                         smpi_datatype_size(old_type),0, NULL, DT_FLAG_DATA|DT_FLAG_CONTIGUOUS);
   }
+  retval=MPI_SUCCESS;
   return retval;
 }
 
@@ -715,33 +697,25 @@ int smpi_datatype_hindexed(int count, int* blocklens, MPI_Aint* indices, MPI_Dat
     if   (blocklens[i]<=0)
       return MPI_ERR_ARG;
     size += blocklens[i];
-
-
     if ( (i< count -1) && (indices[i]+blocklens[i]*smpi_datatype_size(old_type) != indices[i+1]) )contiguous=0;
   }
-  if ((old_type->flags & DT_FLAG_COMMITED) != DT_FLAG_COMMITED) {
-    retval = MPI_ERR_TYPE;
-  } else {
-    if (old_type->has_subtype == 1)
-      XBT_WARN("hindexed contains a complex type - not yet handled");
-
-    if(!contiguous){
-      s_smpi_mpi_hindexed_t* subtype = smpi_datatype_hindexed_create( blocklens,
-                                                                    indices,
-                                                                    count,
-                                                                    old_type,
-                                                                    smpi_datatype_size(old_type));
-
-      smpi_datatype_create(new_type,  size *
-                           smpi_datatype_size(old_type),indices[count-1]+blocklens[count-1]*smpi_datatype_size(old_type)
-                           ,1, subtype, DT_FLAG_DATA);
-    }else{
-      smpi_datatype_create(new_type,  size *
-                           smpi_datatype_size(old_type),size *
-                           smpi_datatype_size(old_type),0, NULL, DT_FLAG_DATA|DT_FLAG_CONTIGUOUS);
-    }
-    retval=MPI_SUCCESS;
+  if (old_type->has_subtype == 1)
+    XBT_WARN("hindexed contains a complex type - not yet handled");
+  if(!contiguous){
+    s_smpi_mpi_hindexed_t* subtype = smpi_datatype_hindexed_create( blocklens,
+                                                                  indices,
+                                                                  count,
+                                                                  old_type,
+                                                                  smpi_datatype_size(old_type));
+    smpi_datatype_create(new_type,  size *
+                         smpi_datatype_size(old_type),indices[count-1]+blocklens[count-1]*smpi_datatype_size(old_type)
+                         ,1, subtype, DT_FLAG_DATA);
+  }else{
+    smpi_datatype_create(new_type,  size *
+                         smpi_datatype_size(old_type),size *
+                         smpi_datatype_size(old_type),0, NULL, DT_FLAG_DATA|DT_FLAG_CONTIGUOUS);
   }
+  retval=MPI_SUCCESS;
   return retval;
 }
 
@@ -857,8 +831,6 @@ int smpi_datatype_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Datat
   for(i=0; i< count; i++){
     if (blocklens[i]<=0)
       return MPI_ERR_ARG;
-    if ((old_types[i]->flags & DT_FLAG_COMMITED) != DT_FLAG_COMMITED)
-      return MPI_ERR_TYPE;
     if (old_types[i]->has_subtype == 1)
       XBT_WARN("Struct contains a complex type - not yet handled");
     size += blocklens[i]*smpi_datatype_size(old_types[i]);
index 8baedae..0db0452 100644 (file)
@@ -271,6 +271,7 @@ int PMPI_Group_free(MPI_Group * group)
   if (group == NULL) {
     retval = MPI_ERR_ARG;
   } else {
+    if(*group!= smpi_comm_group(MPI_COMM_WORLD))// do not free the group of the comm_world
     smpi_group_destroy(*group);
     *group = MPI_GROUP_NULL;
     retval = MPI_SUCCESS;
@@ -1952,7 +1953,7 @@ int PMPI_Type_contiguous(int count, MPI_Datatype old_type, MPI_Datatype* new_typ
   smpi_bench_end();
   if (old_type == MPI_DATATYPE_NULL) {
     retval = MPI_ERR_TYPE;
-  } else if (count<=0){
+  } else if (count<0){
     retval = MPI_ERR_COUNT;
   } else {
     retval = smpi_datatype_contiguous(count, old_type, new_type);
@@ -1982,7 +1983,7 @@ int PMPI_Type_vector(int count, int blocklen, int stride, MPI_Datatype old_type,
   smpi_bench_end();
   if (old_type == MPI_DATATYPE_NULL) {
     retval = MPI_ERR_TYPE;
-  } else if (count<=0 || blocklen<=0){
+  } else if (count<0 || blocklen<0){
     retval = MPI_ERR_COUNT;
   } else {
     retval = smpi_datatype_vector(count, blocklen, stride, old_type, new_type);
@@ -1997,7 +1998,7 @@ int PMPI_Type_hvector(int count, int blocklen, MPI_Aint stride, MPI_Datatype old
   smpi_bench_end();
   if (old_type == MPI_DATATYPE_NULL) {
     retval = MPI_ERR_TYPE;
-  } else if (count<=0 || blocklen<=0){
+  } else if (count<0 || blocklen<0){
     retval = MPI_ERR_COUNT;
   } else {
     retval = smpi_datatype_hvector(count, blocklen, stride, old_type, new_type);
@@ -2013,7 +2014,7 @@ int PMPI_Type_indexed(int count, int* blocklens, int* indices, MPI_Datatype old_
   smpi_bench_end();
   if (old_type == MPI_DATATYPE_NULL) {
     retval = MPI_ERR_TYPE;
-  } else if (count<=0){
+  } else if (count<0){
     retval = MPI_ERR_COUNT;
   } else {
     retval = smpi_datatype_indexed(count, blocklens, indices, old_type, new_type);
@@ -2028,7 +2029,7 @@ int PMPI_Type_hindexed(int count, int* blocklens, MPI_Aint* indices, MPI_Datatyp
   smpi_bench_end();
   if (old_type == MPI_DATATYPE_NULL) {
     retval = MPI_ERR_TYPE;
-  } else if (count<=0){
+  } else if (count<0){
     retval = MPI_ERR_COUNT;
   } else {
     retval = smpi_datatype_hindexed(count, blocklens, indices, old_type, new_type);
@@ -2042,7 +2043,7 @@ int PMPI_Type_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Datatype*
   int retval;
 
   smpi_bench_end();
-  if (count<=0){
+  if (count<0){
     retval = MPI_ERR_COUNT;
   } else {
     retval = smpi_datatype_struct(count, blocklens, indices, old_types, new_type);