[neurun] Apply BumpAllocator to TensorBuilder (#3172)
author김용섭/동작제어Lab(SR)/Engineer/삼성전자 <yons.kim@samsung.com>
Tue, 16 Oct 2018 06:12:50 +0000 (15:12 +0900)
committer오형석/동작제어Lab(SR)/Staff Engineer/삼성전자 <hseok82.oh@samsung.com>
Tue, 16 Oct 2018 06:12:50 +0000 (15:12 +0900)
Applies BumpAllocator to TensorBuilder so that now one memory allocator
has started allocating tensors.

Signed-off-by: Yongseop Kim <yons.kim@samsung.com>
runtimes/neurun/src/backend/cpu/TensorBuilder.cc
runtimes/neurun/src/backend/cpu/TensorBuilder.h
runtimes/neurun/src/backend/cpu/operand/Tensor.h

index 885cb7f..74f1b25 100644 (file)
@@ -19,6 +19,7 @@
 #include <cassert>
 
 #include "operand/Object.h"
+#include "MemoryAllocator.h"
 
 namespace neurun
 {
@@ -44,12 +45,42 @@ void TensorBuilder::prepare(void)
 {
   assert(_tensors.size() == 0);
 
+  // TODO Do not use global var for accessing MemoryAllocator
+  auto &mem_alloc = BumpAllocator::instance();
+
+  // TODO Remove this when okay to pass tests in runtime_android_nn_test
+  mem_alloc.reset();
+
   for (auto &entry : _tensor_info_map)
   {
     auto ind = entry.first;
     const auto &info = entry.second;
     auto tensor = std::make_shared<operand::Tensor>(info);
     _tensors[ind] = tensor;
+    // If we do not make tensor here currently, stages would cause segment fault
+
+    const auto size = info.total_size(); // NOTE This size may not be accurate
+    auto mem_id = mem_alloc.allocate(size);
+    _tensor_mem_map[ind] = mem_id;
+  }
+  assert(_tensor_info_map.size() == _tensor_mem_map.size());
+
+  // TODO below code can be moved in TensorBuild::allocate()
+  // if StageGerator was modified like
+  //   from
+  //     fn->configure(ifm_alloc->buffer(), param.ifm_shape, ker_alloc->buffer(), param.ker_shape,
+  //   to
+  //     fn->configure(ifm_alloc, param.ifm_shape, ker_alloc, param.ker_shape,
+  mem_alloc.finalize();
+  assert(mem_alloc.base());
+
+  for (auto &entry : _tensor_mem_map)
+  {
+    auto ind = entry.first;
+    auto mem_id = entry.second;
+    auto mem_blk = mem_alloc.getMemoryBlock(mem_id);
+    auto &tensor = _tensors[ind];
+    tensor->setBuffer(mem_alloc.base() + mem_blk.base_offset);
   }
 }
 
@@ -58,7 +89,6 @@ void TensorBuilder::allocate(void)
   assert(_tensor_info_map.size() == _tensors.size());
 
   // NOTE For now nothing to do. Allocation is done in prepare stage, which is wrong
-  //      See also: comment in `prepare()`
 }
 
 std::shared_ptr<::arm_compute::ITensor> TensorBuilder::tensorAt(const graph::operand::Index &ind)
index cd4d25f..a4cb260 100644 (file)
@@ -51,6 +51,7 @@ public:
 private:
   std::unordered_map<graph::operand::Index, ::arm_compute::TensorInfo> _tensor_info_map;
   std::unordered_map<graph::operand::Index, std::shared_ptr<operand::Tensor>> _tensors;
+  std::unordered_map<graph::operand::Index, uint32_t> _tensor_mem_map;
 };
 
 } // namespace cpu
index 83a99ac..5ac7e67 100644 (file)
@@ -36,9 +36,7 @@ public:
 
   Tensor(::arm_compute::TensorInfo info) : _info(info)
   {
-    // TODO Do not allocate buffer here. This tensor is just an abstract Tensor object for cpu.
-    uint32_t size = _info.total_size(); // NOTE This size may not be accurate
-    _buffer = new uint8_t[size];        // NOTE The allocated buffer is never deallocated.
+    // DO NOTHING
   }
 
   Tensor(uint8_t *buffer) : _buffer(buffer)