[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