[arrayfire] 10/284: Async CPU diagonal

Ghislain Vaillant ghisvail-guest at moszumanska.debian.org
Sun Feb 7 18:59:13 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 46beebc9080c07e788e3e663654e2c871dc8a1c0
Author: Umar Arshad <umar at arrayfire.com>
Date:   Thu Aug 13 17:26:08 2015 -0400

    Async CPU diagonal
---
 src/backend/cpu/diagonal.cpp | 55 ++++++++++++++++++++++++++------------------
 1 file changed, 32 insertions(+), 23 deletions(-)

diff --git a/src/backend/cpu/diagonal.cpp b/src/backend/cpu/diagonal.cpp
index 2ae69a6..c2e7e92 100644
--- a/src/backend/cpu/diagonal.cpp
+++ b/src/backend/cpu/diagonal.cpp
@@ -14,6 +14,8 @@
 #include <diagonal.hpp>
 #include <math.hpp>
 #include <err_cpu.hpp>
+#include <platform.hpp>
+#include <async_queue.hpp>
 
 namespace cpu
 {
@@ -24,22 +26,25 @@ namespace cpu
         int batch = in.dims()[1];
         Array<T> out = createEmptyArray<T>(dim4(size, size, batch));
 
-        const T *iptr = in.get();
-        T *optr = out.get();
+        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];
+            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[i + j * out.strides()[1]] = val;
                 }
+                optr += out.strides()[2];
+                iptr += in.strides()[1];
             }
-            optr += out.strides()[2];
-            iptr += in.strides()[1];
-        }
+        };
+        getQueue().enqueue(func, out, in);
 
         return out;
     }
@@ -51,23 +56,27 @@ namespace cpu
         dim_t size = std::max(idims[0], idims[1]) - std::abs(num);
         Array<T> out = createEmptyArray<T>(dim4(size, 1, idims[2], idims[3]));
 
-        const dim_t *odims = out.dims().get();
+        auto func = [=] (Array<T> out, const Array<T> in) {
+            const dim_t *odims = out.dims().get();
 
-        const int i_off = (num > 0) ? (num * in.strides()[1]) : (-num);
+            const int i_off = (num > 0) ? (num * in.strides()[1]) : (-num);
 
-        for (int l = 0; l < (int)odims[3]; l++) {
+            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 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;
+                    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);
 
         return out;
     }

-- 
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