Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
leaks -- with smp algos
[simgrid.git] / src / smpi / colls / reduce-mvapich-knomial.c
index c5dc908..7ec5c64 100644 (file)
  
 #include "colls_private.h"
 extern int mv2_reduce_intra_knomial_factor;
+extern int mv2_reduce_inter_knomial_factor;
+
+#define SMPI_DEFAULT_KNOMIAL_FACTOR 4
+
 //        int mv2_reduce_knomial_factor = 2;
         
         
@@ -86,7 +90,7 @@ static int MPIR_Reduce_knomial_trace(int root, int reduce_knomial_factor,
 
     /* Finally, fill up the src array */ 
     if(recv_iter > 0) { 
-        knomial_reduce_src_array = xbt_malloc(sizeof(int)*recv_iter); 
+        knomial_reduce_src_array = smpi_get_tmp_sendbuffer(sizeof(int)*recv_iter);
     } 
 
     mask = orig_mask; 
@@ -144,7 +148,7 @@ int smpi_coll_tuned_reduce_mvapich2_knomial (
     is_commutative = smpi_op_is_commute(op);
 
     if (rank != root) {
-        recvbuf=(void *)xbt_malloc(count*(MAX(extent,true_extent)));
+        recvbuf=(void *)smpi_get_tmp_recvbuffer(count*(MAX(extent,true_extent)));
         recvbuf = (void *)((char*)recvbuf - true_lb);
     }
 
@@ -154,6 +158,15 @@ int smpi_coll_tuned_reduce_mvapich2_knomial (
     }
 
 
+    if(mv2_reduce_intra_knomial_factor<0)
+      {
+        mv2_reduce_intra_knomial_factor = SMPI_DEFAULT_KNOMIAL_FACTOR;
+      }
+    if(mv2_reduce_inter_knomial_factor<0)
+      {
+        mv2_reduce_inter_knomial_factor = SMPI_DEFAULT_KNOMIAL_FACTOR;
+      }
+
 
     MPIR_Reduce_knomial_trace(root, mv2_reduce_intra_knomial_factor, comm, 
            &dst, &expected_send_count, &expected_recv_count, &src_array);
@@ -162,7 +175,7 @@ int smpi_coll_tuned_reduce_mvapich2_knomial (
         tmp_buf  = xbt_malloc(sizeof(void *)*expected_recv_count);
         requests = xbt_malloc(sizeof(MPI_Request)*expected_recv_count);
         for(k=0; k < expected_recv_count; k++ ) {
-            tmp_buf[k] = xbt_malloc(count*(MAX(extent,true_extent)));
+            tmp_buf[k] = smpi_get_tmp_sendbuffer(count*(MAX(extent,true_extent)));
             tmp_buf[k] = (void *)((char*)tmp_buf[k] - true_lb);
         }
 
@@ -187,7 +200,7 @@ int smpi_coll_tuned_reduce_mvapich2_knomial (
         }
 
         for(k=0; k < expected_recv_count; k++ ) {
-            xbt_free(tmp_buf[k]);
+            smpi_free_tmp_buffer(tmp_buf[k]);
         }
         xbt_free(tmp_buf);
         xbt_free(requests);
@@ -202,6 +215,8 @@ int smpi_coll_tuned_reduce_mvapich2_knomial (
                 COLL_TAG_REDUCE,comm);
 
         smpi_mpi_waitall(1, &send_request, &status);
+
+        smpi_free_tmp_buffer((void *)((char*)recvbuf + true_lb));
     }
 
     /* --END ERROR HANDLING-- */