[arrayfire] 93/284: moved indexing & assignment fns to kernel namespace

Ghislain Vaillant ghisvail-guest at moszumanska.debian.org
Sun Feb 7 18:59:22 UTC 2016


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

ghisvail-guest pushed a commit to branch debian/experimental
in repository arrayfire.

commit 696657cb3cde7d660b0558269c85fa24cdda2f6d
Author: pradeep <pradeep at arrayfire.com>
Date:   Sat Dec 19 11:47:51 2015 -0500

    moved indexing & assignment fns to kernel namespace
    
    Also moved the common utility function trimIndex to a common
    location.
---
 src/backend/cpu/iir.cpp           | 44 ++----------------------
 src/backend/cpu/index.cpp         | 69 +++----------------------------------
 src/backend/cpu/kernel/assign.hpp | 21 +++---------
 src/backend/cpu/kernel/iir.hpp    | 61 +++++++++++++++++++++++++++++++++
 src/backend/cpu/kernel/index.hpp  | 71 +++++++++++++++++++++++++++++++++++++++
 src/backend/cpu/kernel/lookup.hpp | 62 ++++++++++++++++++++++++++++++++++
 src/backend/cpu/lookup.cpp        | 54 ++---------------------------
 src/backend/cpu/utility.hpp       | 30 +++++++++++++++++
 8 files changed, 236 insertions(+), 176 deletions(-)

diff --git a/src/backend/cpu/iir.cpp b/src/backend/cpu/iir.cpp
index 3c06275..225f39b 100644
--- a/src/backend/cpu/iir.cpp
+++ b/src/backend/cpu/iir.cpp
@@ -12,12 +12,10 @@
 #include <ArrayInfo.hpp>
 #include <Array.hpp>
 #include <iir.hpp>
-#include <err_cpu.hpp>
-#include <math.hpp>
-#include <arith.hpp>
 #include <convolve.hpp>
 #include <platform.hpp>
 #include <async_queue.hpp>
+#include <kernel/iir.hpp>
 
 using af::dim4;
 
@@ -44,45 +42,7 @@ Array<T> iir(const Array<T> &b, const Array<T> &a, const Array<T> &x)
 
     Array<T> y = createEmptyArray<T>(c.dims());
 
-    auto func = [=] (Array<T> y, Array<T> c, const Array<T> a) {
-        dim4 ydims = c.dims();
-        int num_a = a.dims()[0];
-
-        for (int l = 0; l < (int)ydims[3]; l++) {
-            dim_t yidx3 = l * y.strides()[3];
-            dim_t cidx3 = l * c.strides()[3];
-            dim_t aidx3 = l * a.strides()[3];
-
-            for (int k = 0; k < (int)ydims[2]; k++) {
-
-                dim_t yidx2 = k * y.strides()[2] + yidx3;
-                dim_t cidx2 = k * c.strides()[2] + cidx3;
-                dim_t aidx2 = k * a.strides()[2] + aidx3;
-
-                for (int j = 0; j < (int)ydims[1]; j++) {
-
-                    dim_t yidx1 = j * y.strides()[1] + yidx2;
-                    dim_t cidx1 = j * c.strides()[1] + cidx2;
-                    dim_t aidx1 = j * a.strides()[1] + aidx2;
-
-                    std::vector<T> h_z(num_a);
-
-                    const T *h_a = a.get() + (a.ndims() > 1 ? aidx1 : 0);
-                    T *h_c = c.get() + cidx1;
-                    T *h_y = y.get() + yidx1;
-
-                    for (int i = 0; i < (int)ydims[0]; i++) {
-
-                        T y = h_y[i] = (h_c[i] + h_z[0]) /  h_a[0];
-                        for (int ii = 1; ii < num_a; ii++) {
-                            h_z[ii - 1] = h_z[ii] - h_a[ii] * y;
-                        }
-                    }
-                }
-            }
-        }
-    };
-    getQueue().enqueue(func, y, c, a);
+    getQueue().enqueue(kernel::iir<T>, y, c, a);
 
     return y;
 }
diff --git a/src/backend/cpu/index.cpp b/src/backend/cpu/index.cpp
index 68c2f16..bd569de 100644
--- a/src/backend/cpu/index.cpp
+++ b/src/backend/cpu/index.cpp
@@ -13,11 +13,11 @@
 #include <Array.hpp>
 #include <index.hpp>
 #include <handle.hpp>
-#include <err_cpu.hpp>
 #include <vector>
 #include <platform.hpp>
 #include <async_queue.hpp>
 #include <utility>
+#include <kernel/index.hpp>
 
 using std::vector;
 using af::dim4;
@@ -25,19 +25,6 @@ using af::dim4;
 namespace cpu
 {
 
-static inline
-dim_t trimIndex(dim_t idx, const dim_t &len)
-{
-    dim_t ret_val = idx;
-    dim_t offset  = abs(ret_val)%len;
-    if (ret_val<0) {
-        ret_val = offset-1;
-    } else if (ret_val>=len) {
-        ret_val = len-offset-1;
-    }
-    return ret_val;
-}
-
 template<typename T>
 Array<T> index(const Array<T>& in, const af_index_t idxrs[])
 {
@@ -47,7 +34,7 @@ Array<T> index(const Array<T>& in, const af_index_t idxrs[])
     vector<af_seq> seqs(4, af_span);
     // create seq vector to retrieve output
     // dimensions, offsets & offsets
-    for (dim_t x=0; x<isSeq.size(); ++x) {
+    for (unsigned x=0; x<isSeq.size(); ++x) {
         if (idxrs[x].isSeq) {
             seqs[x] = idxrs[x].idx.seq;
         }
@@ -59,7 +46,7 @@ Array<T> index(const Array<T>& in, const af_index_t idxrs[])
 
     vector< Array<uint> > idxArrs(4, createEmptyArray<uint>(dim4()));
     // look through indexs to read af_array indexs
-    for (dim_t x=0; x<isSeq.size(); ++x) {
+    for (unsigned x=0; x<isSeq.size(); ++x) {
         if (!isSeq[x]) {
             idxArrs[x] = castArray<uint>(idxrs[x].idx.arr);
             idxArrs[x].eval();
@@ -70,56 +57,8 @@ Array<T> index(const Array<T>& in, const af_index_t idxrs[])
 
     Array<T> out = createEmptyArray<T>(oDims);
 
-    auto func = [=] (Array<T> out, const Array<T> in,
-                     const vector<bool> isSeq,
-                     const vector<af_seq> seqs,
-                     const vector< Array<uint> > idxArrs) {
-
-        const dim4 iDims    = in.dims();
-        const dim4 dDims    = in.getDataDims();
-        const dim4 iOffs    = toOffset(seqs, dDims);
-        const dim4 iStrds   = toStride(seqs, dDims);
-        const dim4 oDims    = out.dims();
-        const dim4 oStrides = out.strides();
-        const T *src        = in.get();
-              T *dst        = out.get();
-        const uint* ptr0    = idxArrs[0].get();
-        const uint* ptr1    = idxArrs[1].get();
-        const uint* ptr2    = idxArrs[2].get();
-        const uint* ptr3    = idxArrs[3].get();
-
-        for (dim_t l=0; l<oDims[3]; ++l) {
-
-            dim_t lOff   = l*oStrides[3];
-            dim_t inIdx3 = trimIndex(isSeq[3] ? l+iOffs[3] : ptr3[l], iDims[3]);
-            dim_t inOff3 = inIdx3*iStrds[3];
-
-            for (dim_t k=0; k<oDims[2]; ++k) {
-
-                dim_t kOff   = k*oStrides[2];
-                dim_t inIdx2 = trimIndex(isSeq[2] ? k+iOffs[2] : ptr2[k], iDims[2]);
-                dim_t inOff2 = inIdx2*iStrds[2];
-
-                for (dim_t j=0; j<oDims[1]; ++j) {
-
-                    dim_t jOff   = j*oStrides[1];
-                    dim_t inIdx1 = trimIndex(isSeq[1] ? j+iOffs[1] : ptr1[j], iDims[1]);
-                    dim_t inOff1 = inIdx1*iStrds[1];
-
-                    for (dim_t i=0; i<oDims[0]; ++i) {
-
-                        dim_t iOff   = i*oStrides[0];
-                        dim_t inIdx0 = trimIndex(isSeq[0] ? i+iOffs[0] : ptr0[i], iDims[0]);
-                        dim_t inOff0 = inIdx0*iStrds[0];
-
-                        dst[lOff+kOff+jOff+iOff] = src[inOff3+inOff2+inOff1+inOff0];
-                    }
-                }
-            }
-        }
-    };
 
-    getQueue().enqueue(func, out, in, std::move(isSeq), std::move(seqs), std::move(idxArrs));
+    getQueue().enqueue(kernel::index<T>, out, in, std::move(isSeq), std::move(seqs), std::move(idxArrs));
 
     return out;
 }
diff --git a/src/backend/cpu/kernel/assign.hpp b/src/backend/cpu/kernel/assign.hpp
index 2621ba7..83f48e9 100644
--- a/src/backend/cpu/kernel/assign.hpp
+++ b/src/backend/cpu/kernel/assign.hpp
@@ -7,8 +7,9 @@
  * http://arrayfire.com/licenses/BSD-3-Clause
  ********************************************************/
 
-#include <Array.hpp>
 #include <vector>
+#include <Array.hpp>
+#include <utility.hpp>
 
 namespace cpu
 {
@@ -16,24 +17,10 @@ namespace kernel
 {
 
 using af::dim4;
-using std::vector;
-
-inline
-dim_t trimIndex(int idx, const dim_t &len)
-{
-    int ret_val = idx;
-    int offset  = abs(ret_val)%len;
-    if (ret_val<0) {
-        ret_val = offset-1;
-    } else if (ret_val>=(int)len) {
-        ret_val = len-offset-1;
-    }
-    return ret_val;
-}
 
 template<typename T>
-void assign(Array<T> out, const Array<T> rhs, const vector<bool> isSeq,
-            const vector<af_seq> seqs, const vector< Array<uint> > idxArrs)
+void assign(Array<T> out, const Array<T> rhs, const std::vector<bool> isSeq,
+            const std::vector<af_seq> seqs, const std::vector< Array<uint> > idxArrs)
 {
     dim4 dDims = out.getDataDims();
     dim4 pDims = out.dims();
diff --git a/src/backend/cpu/kernel/iir.hpp b/src/backend/cpu/kernel/iir.hpp
new file mode 100644
index 0000000..d1ca464
--- /dev/null
+++ b/src/backend/cpu/kernel/iir.hpp
@@ -0,0 +1,61 @@
+/*******************************************************
+ * Copyright (c) 2015, ArrayFire
+ * All rights reserved.
+ *
+ * This file is distributed under 3-clause BSD license.
+ * The complete license agreement can be obtained at:
+ * http://arrayfire.com/licenses/BSD-3-Clause
+ ********************************************************/
+
+#include <Array.hpp>
+
+namespace cpu
+{
+namespace kernel
+{
+
+using af::dim4;
+
+template<typename T>
+void iir(Array<T> y, Array<T> c, Array<T> const a)
+{
+    dim4 ydims = c.dims();
+    int num_a = a.dims()[0];
+
+    for (int l = 0; l < (int)ydims[3]; l++) {
+        dim_t yidx3 = l * y.strides()[3];
+        dim_t cidx3 = l * c.strides()[3];
+        dim_t aidx3 = l * a.strides()[3];
+
+        for (int k = 0; k < (int)ydims[2]; k++) {
+
+            dim_t yidx2 = k * y.strides()[2] + yidx3;
+            dim_t cidx2 = k * c.strides()[2] + cidx3;
+            dim_t aidx2 = k * a.strides()[2] + aidx3;
+
+            for (int j = 0; j < (int)ydims[1]; j++) {
+
+                dim_t yidx1 = j * y.strides()[1] + yidx2;
+                dim_t cidx1 = j * c.strides()[1] + cidx2;
+                dim_t aidx1 = j * a.strides()[1] + aidx2;
+
+                std::vector<T> h_z(num_a);
+
+                const T *h_a = a.get() + (a.ndims() > 1 ? aidx1 : 0);
+                T *h_c = c.get() + cidx1;
+                T *h_y = y.get() + yidx1;
+
+                for (int i = 0; i < (int)ydims[0]; i++) {
+
+                    T y = h_y[i] = (h_c[i] + h_z[0]) /  h_a[0];
+                    for (int ii = 1; ii < num_a; ii++) {
+                        h_z[ii - 1] = h_z[ii] - h_a[ii] * y;
+                    }
+                }
+            }
+        }
+    }
+}
+
+}
+}
diff --git a/src/backend/cpu/kernel/index.hpp b/src/backend/cpu/kernel/index.hpp
new file mode 100644
index 0000000..ee20c24
--- /dev/null
+++ b/src/backend/cpu/kernel/index.hpp
@@ -0,0 +1,71 @@
+/*******************************************************
+ * Copyright (c) 2015, ArrayFire
+ * All rights reserved.
+ *
+ * This file is distributed under 3-clause BSD license.
+ * The complete license agreement can be obtained at:
+ * http://arrayfire.com/licenses/BSD-3-Clause
+ ********************************************************/
+
+#include <vector>
+#include <Array.hpp>
+#include <utility.hpp>
+
+namespace cpu
+{
+namespace kernel
+{
+
+using af::dim4;
+
+template<typename T>
+void index(Array<T> out, Array<T> const in,
+           std::vector<bool> const isSeq, std::vector<af_seq> const seqs,
+           std::vector< Array<uint> > const idxArrs)
+{
+    const dim4 iDims    = in.dims();
+    const dim4 dDims    = in.getDataDims();
+    const dim4 iOffs    = toOffset(seqs, dDims);
+    const dim4 iStrds   = toStride(seqs, dDims);
+    const dim4 oDims    = out.dims();
+    const dim4 oStrides = out.strides();
+    const T *src        = in.get();
+    T *dst        = out.get();
+    const uint* ptr0    = idxArrs[0].get();
+    const uint* ptr1    = idxArrs[1].get();
+    const uint* ptr2    = idxArrs[2].get();
+    const uint* ptr3    = idxArrs[3].get();
+
+    for (dim_t l=0; l<oDims[3]; ++l) {
+
+        dim_t lOff   = l*oStrides[3];
+        dim_t inIdx3 = trimIndex(isSeq[3] ? l+iOffs[3] : ptr3[l], iDims[3]);
+        dim_t inOff3 = inIdx3*iStrds[3];
+
+        for (dim_t k=0; k<oDims[2]; ++k) {
+
+            dim_t kOff   = k*oStrides[2];
+            dim_t inIdx2 = trimIndex(isSeq[2] ? k+iOffs[2] : ptr2[k], iDims[2]);
+            dim_t inOff2 = inIdx2*iStrds[2];
+
+            for (dim_t j=0; j<oDims[1]; ++j) {
+
+                dim_t jOff   = j*oStrides[1];
+                dim_t inIdx1 = trimIndex(isSeq[1] ? j+iOffs[1] : ptr1[j], iDims[1]);
+                dim_t inOff1 = inIdx1*iStrds[1];
+
+                for (dim_t i=0; i<oDims[0]; ++i) {
+
+                    dim_t iOff   = i*oStrides[0];
+                    dim_t inIdx0 = trimIndex(isSeq[0] ? i+iOffs[0] : ptr0[i], iDims[0]);
+                    dim_t inOff0 = inIdx0*iStrds[0];
+
+                    dst[lOff+kOff+jOff+iOff] = src[inOff3+inOff2+inOff1+inOff0];
+                }
+            }
+        }
+    }
+}
+
+}
+}
diff --git a/src/backend/cpu/kernel/lookup.hpp b/src/backend/cpu/kernel/lookup.hpp
new file mode 100644
index 0000000..551cd2f
--- /dev/null
+++ b/src/backend/cpu/kernel/lookup.hpp
@@ -0,0 +1,62 @@
+/*******************************************************
+ * Copyright (c) 2015, ArrayFire
+ * All rights reserved.
+ *
+ * This file is distributed under 3-clause BSD license.
+ * The complete license agreement can be obtained at:
+ * http://arrayfire.com/licenses/BSD-3-Clause
+ ********************************************************/
+
+#include <vector>
+#include <Array.hpp>
+#include <utility.hpp>
+
+namespace cpu
+{
+namespace kernel
+{
+
+using af::dim4;
+
+template<typename in_t, typename idx_t>
+void lookup(Array<in_t> out, Array<in_t> const input,
+            Array<idx_t> const indices, unsigned const dim)
+{
+    const dim4 iDims    = input.dims();
+    const dim4 oDims    = out.dims();
+    const dim4 iStrides = input.strides();
+    const dim4 oStrides = out.strides();
+    const in_t *inPtr   = input.get();
+    const idx_t *idxPtr = indices.get();
+
+    in_t *outPtr = out.get();
+
+    for (dim_t l=0; l<oDims[3]; ++l) {
+
+        dim_t iLOff = iStrides[3]*(dim==3 ? trimIndex((dim_t)idxPtr[l], iDims[3]): l);
+        dim_t oLOff = l*oStrides[3];
+
+        for (dim_t k=0; k<oDims[2]; ++k) {
+
+            dim_t iKOff = iStrides[2]*(dim==2 ? trimIndex((dim_t)idxPtr[k], iDims[2]): k);
+            dim_t oKOff = k*oStrides[2];
+
+            for (dim_t j=0; j<oDims[1]; ++j) {
+
+                dim_t iJOff = iStrides[1]*(dim==1 ? trimIndex((dim_t)idxPtr[j], iDims[1]): j);
+                dim_t oJOff = j*oStrides[1];
+
+                for (dim_t i=0; i<oDims[0]; ++i) {
+
+                    dim_t iIOff = iStrides[0]*(dim==0 ? trimIndex((dim_t)idxPtr[i], iDims[0]): i);
+                    dim_t oIOff = i*oStrides[0];
+
+                    outPtr[oLOff+oKOff+oJOff+oIOff] = inPtr[iLOff+iKOff+iJOff+iIOff];
+                }
+            }
+        }
+    }
+}
+
+}
+}
diff --git a/src/backend/cpu/lookup.cpp b/src/backend/cpu/lookup.cpp
index 0aeee4d..457cdae 100644
--- a/src/backend/cpu/lookup.cpp
+++ b/src/backend/cpu/lookup.cpp
@@ -8,27 +8,14 @@
  ********************************************************/
 
 #include <lookup.hpp>
-#include <err_cpu.hpp>
 #include <cstdlib>
 #include <platform.hpp>
 #include <async_queue.hpp>
+#include <kernel/lookup.hpp>
 
 namespace cpu
 {
 
-static inline
-dim_t trimIndex(int idx, const dim_t &len)
-{
-    int ret_val = idx;
-    int offset  = abs(ret_val)%len;
-    if (ret_val<0) {
-        ret_val = offset-1;
-    } else if (ret_val>=len) {
-        ret_val = len-offset-1;
-    }
-    return ret_val;
-}
-
 template<typename in_t, typename idx_t>
 Array<in_t> lookup(const Array<in_t> &input, const Array<idx_t> &indices, const unsigned dim)
 {
@@ -43,44 +30,7 @@ Array<in_t> lookup(const Array<in_t> &input, const Array<idx_t> &indices, const
 
     Array<in_t> out = createEmptyArray<in_t>(oDims);
 
-    auto func = [=] (Array<in_t> out, const Array<in_t> input,
-                     const Array<idx_t> indices, const unsigned dim) {
-        const dim4 iDims    = input.dims();
-        const dim4 oDims    = out.dims();
-        const dim4 iStrides = input.strides();
-        const dim4 oStrides = out.strides();
-        const in_t *inPtr   = input.get();
-        const idx_t *idxPtr = indices.get();
-
-        in_t *outPtr = out.get();
-
-        for (dim_t l=0; l<oDims[3]; ++l) {
-
-            dim_t iLOff = iStrides[3]*(dim==3 ? trimIndex((dim_t)idxPtr[l], iDims[3]): l);
-            dim_t oLOff = l*oStrides[3];
-
-            for (dim_t k=0; k<oDims[2]; ++k) {
-
-                dim_t iKOff = iStrides[2]*(dim==2 ? trimIndex((dim_t)idxPtr[k], iDims[2]): k);
-                dim_t oKOff = k*oStrides[2];
-
-                for (dim_t j=0; j<oDims[1]; ++j) {
-
-                    dim_t iJOff = iStrides[1]*(dim==1 ? trimIndex((dim_t)idxPtr[j], iDims[1]): j);
-                    dim_t oJOff = j*oStrides[1];
-
-                    for (dim_t i=0; i<oDims[0]; ++i) {
-
-                        dim_t iIOff = iStrides[0]*(dim==0 ? trimIndex((dim_t)idxPtr[i], iDims[0]): i);
-                        dim_t oIOff = i*oStrides[0];
-
-                        outPtr[oLOff+oKOff+oJOff+oIOff] = inPtr[iLOff+iKOff+iJOff+iIOff];
-                    }
-                }
-            }
-        }
-    };
-    getQueue().enqueue(func, out, input, indices, dim);
+    getQueue().enqueue(kernel::lookup<in_t, idx_t>, out, input, indices, dim);
 
     return out;
 }
diff --git a/src/backend/cpu/utility.hpp b/src/backend/cpu/utility.hpp
new file mode 100644
index 0000000..18a38f3
--- /dev/null
+++ b/src/backend/cpu/utility.hpp
@@ -0,0 +1,30 @@
+/*******************************************************
+ * Copyright (c) 2015, ArrayFire
+ * All rights reserved.
+ *
+ * This file is distributed under 3-clause BSD license.
+ * The complete license agreement can be obtained at:
+ * http://arrayfire.com/licenses/BSD-3-Clause
+ ********************************************************/
+
+#pragma once
+#include <af/defines.h>
+#include "backend.hpp"
+
+namespace cpu
+{
+
+static inline
+dim_t trimIndex(const int &idx, const dim_t &len)
+{
+    int ret_val = idx;
+    int offset  = abs(ret_val)%len;
+    if (ret_val<0) {
+        ret_val = offset-1;
+    } else if (ret_val>=(int)len) {
+        ret_val = len-offset-1;
+    }
+    return ret_val;
+}
+
+}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/arrayfire.git



More information about the debian-science-commits mailing list