[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