[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