[arrayfire] 90/284: Moved diagonal cpu implementation 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 913850d9761463dbe5930e5ed6af0d3156e70a49
Author: pradeep <pradeep at arrayfire.com>
Date:   Fri Dec 18 17:46:19 2015 -0500

    Moved diagonal cpu implementation to kernel namespace
---
 src/backend/cpu/diagonal.cpp        | 43 ++----------------------
 src/backend/cpu/kernel/diagonal.hpp | 67 +++++++++++++++++++++++++++++++++++++
 2 files changed, 70 insertions(+), 40 deletions(-)

diff --git a/src/backend/cpu/diagonal.cpp b/src/backend/cpu/diagonal.cpp
index 9af7845..6c20f2e 100644
--- a/src/backend/cpu/diagonal.cpp
+++ b/src/backend/cpu/diagonal.cpp
@@ -17,6 +17,7 @@
 #include <err_cpu.hpp>
 #include <platform.hpp>
 #include <async_queue.hpp>
+#include <kernel/diagonal.hpp>
 
 namespace cpu
 {
@@ -30,25 +31,7 @@ Array<T> diagCreate(const Array<T> &in, const int num)
     int batch = in.dims()[1];
     Array<T> out = createEmptyArray<T>(dim4(size, size, batch));
 
-    auto func = [=] (Array<T> out, const Array<T> in) {
-        const T *iptr = in.get();
-              T *optr = out.get();
-
-        for (int k = 0; k < batch; k++) {
-            for (int j = 0; j < size; j++) {
-                for (int i = 0; i < size; i++) {
-                    T val = scalar<T>(0);
-                    if (i == j - num) {
-                        val = (num > 0) ? iptr[i] : iptr[j];
-                    }
-                    optr[i + j * out.strides()[1]] = val;
-                }
-            }
-            optr += out.strides()[2];
-            iptr += in.strides()[1];
-        }
-    };
-    getQueue().enqueue(func, out, in);
+    getQueue().enqueue(kernel::diagCreate<T>, out, in, num);
 
     return out;
 }
@@ -62,27 +45,7 @@ Array<T> diagExtract(const Array<T> &in, const int num)
     dim_t size = std::max(idims[0], idims[1]) - std::abs(num);
     Array<T> out = createEmptyArray<T>(dim4(size, 1, idims[2], idims[3]));
 
-    auto func = [=] (Array<T> out, const Array<T> in) {
-        const dim4 odims = out.dims();
-
-        const int i_off = (num > 0) ? (num * in.strides()[1]) : (-num);
-
-        for (int l = 0; l < (int)odims[3]; l++) {
-
-            for (int k = 0; k < (int)odims[2]; k++) {
-                const T *iptr = in.get() + l * in.strides()[3] + k * in.strides()[2] + i_off;
-                T *optr = out.get() + l * out.strides()[3] + k * out.strides()[2];
-
-                for (int i = 0; i < (int)odims[0]; i++) {
-                    T val = scalar<T>(0);
-                    if (i < idims[0] && i < idims[1]) val =  iptr[i * in.strides()[1] + i];
-                    optr[i] = val;
-                }
-            }
-        }
-    };
-
-    getQueue().enqueue(func, out, in);
+    getQueue().enqueue(kernel::diagExtract<T>, out, in, num);
 
     return out;
 }
diff --git a/src/backend/cpu/kernel/diagonal.hpp b/src/backend/cpu/kernel/diagonal.hpp
new file mode 100644
index 0000000..596080b
--- /dev/null
+++ b/src/backend/cpu/kernel/diagonal.hpp
@@ -0,0 +1,67 @@
+/*******************************************************
+ * 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 diagCreate(Array<T> out, Array<T> const in, int const num)
+{
+    int batch = in.dims()[1];
+    int size  = out.dims()[0];
+
+    const T *iptr = in.get();
+    T *optr = out.get();
+
+    for (int k = 0; k < batch; k++) {
+        for (int j = 0; j < size; j++) {
+            for (int i = 0; i < size; i++) {
+                T val = scalar<T>(0);
+                if (i == j - num) {
+                    val = (num > 0) ? iptr[i] : iptr[j];
+                }
+                optr[i + j * out.strides()[1]] = val;
+            }
+        }
+        optr += out.strides()[2];
+        iptr += in.strides()[1];
+    }
+}
+
+template<typename T>
+void diagExtract(Array<T> out, Array<T> const in, int const num)
+{
+    const dim4 odims = out.dims();
+    const dim4 idims = in.dims();
+
+    const int i_off = (num > 0) ? (num * in.strides()[1]) : (-num);
+
+    for (int l = 0; l < (int)odims[3]; l++) {
+
+        for (int k = 0; k < (int)odims[2]; k++) {
+            const T *iptr = in.get() + l * in.strides()[3] + k * in.strides()[2] + i_off;
+            T *optr = out.get() + l * out.strides()[3] + k * out.strides()[2];
+
+            for (int i = 0; i < (int)odims[0]; i++) {
+                T val = scalar<T>(0);
+                if (i < idims[0] && i < idims[1]) val =  iptr[i * in.strides()[1] + i];
+                optr[i] = 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