[DRE-commits] [ruby-numo-narray] 05/13: reduce alloc times

Youhei SASAKI uwabami-guest at moszumanska.debian.org
Wed Jun 21 08:37:48 UTC 2017


This is an automated email from the git hooks/post-receive script.

uwabami-guest pushed a commit to branch patch-queue/master
in repository ruby-numo-narray.

commit 3a9803cbb42616d2f3660628c5b6b90321af0e8d
Author: Masahiro TANAKA <masa16.tanaka at gmail.com>
Date:   Fri Jun 2 15:12:27 2017 +0900

    reduce alloc times
    
    
    Gbp-Pq: Name 0005-reduce-alloc-times.patch
---
 ext/numo/narray/ndloop.c | 41 +++++++++++++++++++++--------------------
 1 file changed, 21 insertions(+), 20 deletions(-)

diff --git a/ext/numo/narray/ndloop.c b/ext/numo/narray/ndloop.c
index e431a7f..39c6ead 100644
--- a/ext/numo/narray/ndloop.c
+++ b/ext/numo/narray/ndloop.c
@@ -43,7 +43,7 @@ typedef struct NA_MD_LOOP {
     int  nin;
     int  ndim;                // n of total dimention
     unsigned int copy_flag;   // set i-th bit if i-th arg is cast
-    size_t  *n_ptr;           // memory for n
+    void    *ptr;             // memory for n
     na_loop_iter_t *iter_ptr; // memory for iter
     size_t  *n;               // n of elements for each dim
     na_loop_t  user;          // loop in user function
@@ -337,6 +337,9 @@ ndloop_alloc(na_md_loop_t *lp, ndfunc_t *nf, VALUE args,
     int narg;
     int max_nd;
 
+    char *buf;
+    size_t n1, n2, n3, n4, n5;
+
     long args_len;
 
     na_loop_iter_t *iter;
@@ -364,23 +367,28 @@ ndloop_alloc(na_md_loop_t *lp, ndfunc_t *nf, VALUE args,
     lp->writeback = -1;
     lp->init_aidx = -1;
 
-    lp->n = NULL;
-    lp->n_ptr = NULL;
-    lp->xargs = NULL;
-    lp->user.args = NULL;
+    lp->ptr = NULL;
     lp->user.n = NULL;
-    lp->iter_ptr = NULL;
-    lp->trans_map = NULL;
 
     ndloop_find_max_dimension(lp, nf, args);
     narg = lp->nin + nf->nout;
     max_nd = lp->ndim + lp->user.ndim;
 
-    lp->n    = lp->n_ptr = ALLOC_N(size_t, max_nd+1);
-    lp->xargs = ALLOC_N(na_loop_xargs_t, narg);
-    lp->user.args = ALLOC_N(na_loop_args_t, narg);
-    iter = ALLOC_N(na_loop_iter_t, narg*(max_nd+1));
-    lp->iter_ptr = iter;
+    n1 = sizeof(size_t)*(max_nd+1);
+    n2 = sizeof(na_loop_xargs_t)*narg;
+    n2 = ((n2-1)/8+1)*8;
+    n3 = sizeof(na_loop_args_t)*narg;
+    n3 = ((n3-1)/8+1)*8;
+    n4 = sizeof(na_loop_iter_t)*narg*(max_nd+1);
+    n4 = ((n4-1)/8+1)*8;
+    n5 = sizeof(int)*(max_nd+1);
+
+    lp->ptr = buf = (char*)xmalloc(n1+n2+n3+n4+n5);
+    lp->n = (size_t*)buf; buf+=n1;
+    lp->xargs = (na_loop_xargs_t*)buf; buf+=n2;
+    lp->user.args = (na_loop_args_t*)buf; buf+=n3;
+    lp->iter_ptr = iter = (na_loop_iter_t*)buf; buf+=n4;
+    lp->trans_map = (int*)buf;
 
     for (j=0; j<narg; j++) {
         LARG(lp,j).value = Qnil;
@@ -406,7 +414,6 @@ ndloop_alloc(na_md_loop_t *lp, ndfunc_t *nf, VALUE args,
     //              array          loop
     //           [*,+,*,+,*] => [*,*,*,+,+]
     // trans_map=[0,3,1,4,2] <= [0,1,2,3,4]
-    lp->trans_map = ALLOC_N(int, max_nd+1);
     if (NDF_TEST(nf,NDF_FLAT_REDUCE) && RTEST(lp->reduce)) {
         trans_dim = 0;
         for (i=0; i<max_nd; i++) {
@@ -450,7 +457,6 @@ ndloop_release(VALUE vlp)
             na_release_lock(v);
         }
     }
-    //xfree(lp);
     for (j=0; j<lp->narg; j++) {
         //printf("lp->xargs[%d].bufcp=%lx\n",j,(size_t)(lp->xargs[j].bufcp));
         if (lp->xargs[j].bufcp) {
@@ -463,12 +469,7 @@ ndloop_release(VALUE vlp)
             }
         }
     }
-    if (lp->trans_map) xfree(lp->trans_map);
-    xfree(lp->xargs);
-    xfree(lp->iter_ptr);
-    xfree(lp->user.args);
-    xfree(lp->n_ptr);
-    //rb_gc_force_recycle(vlp);
+    xfree(lp->ptr);
     return Qnil;
 }
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ruby-extras/ruby-numo-narray.git



More information about the Pkg-ruby-extras-commits mailing list