Introduce View, Reader and IndexIterator of Matrix (#2309)
author김용섭/동작제어Lab(SR)/Engineer/삼성전자 <yons.kim@samsung.com>
Thu, 16 Aug 2018 07:06:15 +0000 (16:06 +0900)
committer이춘석/동작제어Lab(SR)/Staff Engineer/삼성전자 <chunseok.lee@samsung.com>
Thu, 16 Aug 2018 07:06:15 +0000 (16:06 +0900)
Introduce View, Reader and IndexIterator of Matrix. These classes would
be used for initializing constant matrix.

Signed-off-by: Yongseop Kim <yons.kim@samsung.com>
include/util/matrix/IndexIterator.h [new file with mode: 0644]
include/util/matrix/Reader.h [new file with mode: 0644]
runtimes/pure_arm_compute/src/internal/arm_compute/matrix/View.h [new file with mode: 0644]
runtimes/pure_arm_compute/src/internal/nnapi/matrix/Reader.h [new file with mode: 0644]

diff --git a/include/util/matrix/IndexIterator.h b/include/util/matrix/IndexIterator.h
new file mode 100644 (file)
index 0000000..b6fccff
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __NNFW_UTIL_MATRIX_INDEX_ITERATOR_H__
+#define __NNFW_UTIL_MATRIX_INDEX_ITERATOR_H__
+
+#include "util/matrix/Shape.h"
+
+namespace nnfw
+{
+namespace util
+{
+namespace matrix
+{
+
+class IndexIterator
+{
+public:
+  IndexIterator(const Shape &shape) : _shape{shape}
+  {
+    // DO NOTHING
+  }
+
+public:
+  template <typename Callable> IndexIterator &iter(Callable cb)
+  {
+    for (uint32_t row = 0; row < _shape.H; ++row)
+    {
+      for (uint32_t col = 0; col < _shape.W; ++col)
+      {
+        cb(row, col);
+      }
+    }
+
+    return (*this);
+  }
+
+private:
+  const Shape _shape;
+};
+
+inline IndexIterator iterate(const Shape &shape) { return IndexIterator{shape}; }
+
+template <typename Callable> IndexIterator &operator<<(IndexIterator &&it, Callable cb)
+{
+  return it.iter(cb);
+}
+
+} // namespace matrix
+} // namespace util
+} // namespace nnfw
+
+#endif // __NNFW_UTIL_MATRIX_INDEX_ITERATOR_H__
diff --git a/include/util/matrix/Reader.h b/include/util/matrix/Reader.h
new file mode 100644 (file)
index 0000000..526eaf5
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __NNFW_UTIL_MATRIX_READER_H__
+#define __NNFW_UTIL_MATRIX_READER_H__
+
+#include <cstdint>
+
+namespace nnfw
+{
+namespace util
+{
+namespace matrix
+{
+
+template <typename T> struct Reader
+{
+  virtual ~Reader() = default;
+
+  virtual T at(uint32_t row, uint32_t col) const = 0;
+};
+
+} // namespace matrix
+} // namespace util
+} // namespace nnfw
+
+#endif // __NNFW_UTIL_MATRIX_READER_H__
diff --git a/runtimes/pure_arm_compute/src/internal/arm_compute/matrix/View.h b/runtimes/pure_arm_compute/src/internal/arm_compute/matrix/View.h
new file mode 100644 (file)
index 0000000..4c13498
--- /dev/null
@@ -0,0 +1,58 @@
+#ifndef __INTERNAL_ARM_COMPUTE_MATRIX_VIEW_H__
+#define __INTERNAL_ARM_COMPUTE_MATRIX_VIEW_H__
+
+#include "util/matrix/Shape.h"
+#include "util/matrix/Reader.h"
+
+#include <arm_compute/core/ITensor.h>
+
+namespace internal
+{
+namespace arm_compute
+{
+namespace matrix
+{
+
+template <typename T> class View final : public nnfw::util::matrix::Reader<T>
+{
+public:
+  View(::arm_compute::ITensor *tensor) : _tensor{tensor}
+  {
+    // DO NOTHING
+  }
+
+public:
+  T at(uint32_t row, uint32_t col) const override
+  {
+    const auto offset = matrix_index_to_byte_offset(row, col);
+
+    T *ptr = reinterpret_cast<T *>(_tensor->buffer() + offset);
+
+    return *ptr;
+  }
+
+public:
+  T &at(uint32_t row, uint32_t col)
+  {
+    const auto offset = matrix_index_to_byte_offset(row, col);
+
+    T *ptr = reinterpret_cast<T *>(_tensor->buffer() + offset);
+
+    return *ptr;
+  }
+
+private:
+  size_t matrix_index_to_byte_offset(uint32_t row, uint32_t col) const
+  {
+    return _tensor->info()->offset_element_in_bytes(::arm_compute::Coordinates{col, row});
+  }
+
+private:
+  ::arm_compute::ITensor *_tensor;
+};
+
+} // namespace matrix
+} // namespace arm_compute
+} // namespace internal
+
+#endif // __INTERNAL_ARM_COMPUTE_MATRIX_VIEW_H__
diff --git a/runtimes/pure_arm_compute/src/internal/nnapi/matrix/Reader.h b/runtimes/pure_arm_compute/src/internal/nnapi/matrix/Reader.h
new file mode 100644 (file)
index 0000000..20e12bf
--- /dev/null
@@ -0,0 +1,52 @@
+#ifndef __INTERNAL_NNAPI_MATRIX_READER_H__
+#define __INTERNAL_NNAPI_MATRIX_READER_H__
+
+#include "util/matrix/Shape.h"
+#include "util/matrix/Reader.h"
+
+namespace internal
+{
+namespace nnapi
+{
+namespace matrix
+{
+
+template <typename T> class Reader final : public nnfw::util::matrix::Reader<T>
+{
+public:
+  Reader(const ::nnfw::util::matrix::Shape &shape, const uint8_t *base, size_t size)
+      : _shape{shape}, _base{base}, _size{size}
+  {
+    // DO NOTHING
+  }
+
+public:
+  const nnfw::util::matrix::Shape &shape(void) const { return _shape; }
+
+public:
+  T at(uint32_t row, uint32_t col) const override
+  {
+    // NNAPI uses NHWC ordering
+    uint32_t index = 0;
+
+    index += row * _shape.W;
+    index += col;
+
+    const T *ptr = reinterpret_cast<const T *>(_base);
+
+    return ptr[index];
+  }
+
+private:
+  nnfw::util::matrix::Shape _shape;
+
+private:
+  const uint8_t *_base;
+  const size_t _size;
+};
+
+} // namespace matrix
+} // namespace nnapi
+} // namespace internal
+
+#endif // __INTERNAL_NNAPI_MATRIX_READER_H__