You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

memory_manager.cpp 2.3 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /**
  2. * \file dnn/test/common/memory_manager.cpp
  3. * MegEngine is Licensed under the Apache License, Version 2.0 (the "License")
  4. *
  5. * Copyright (c) 2014-2020 Megvii Inc. All rights reserved.
  6. *
  7. * Unless required by applicable law or agreed to in writing,
  8. * software distributed under the License is distributed on an
  9. * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. */
  11. #include "./memory_manager.h"
  12. #include "test/common/utils.h"
  13. #include "src/common/utils.h"
  14. namespace {
  15. using namespace megdnn;
  16. using namespace test;
  17. std::unique_ptr<MemoryManager> create_memory_manager_from_handle(Handle *handle)
  18. {
  19. return make_unique<HandleMemoryManager>(handle);
  20. }
  21. } // anonymous namespace
  22. megdnn::test::MemoryManagerHolder megdnn::test::MemoryManagerHolder::m_instance;
  23. megdnn::test::HandleMemoryManager::HandleMemoryManager(Handle *handle)
  24. : MemoryManager(), m_handle(handle)
  25. {}
  26. void* megdnn::test::HandleMemoryManager::malloc(size_t size)
  27. {
  28. auto comp_handle = m_handle->megcore_computing_handle();
  29. megcoreDeviceHandle_t dev_handle;
  30. megcore_check(megcoreGetDeviceHandle(comp_handle, &dev_handle));
  31. void *ptr;
  32. megcore_check(megcoreMalloc(dev_handle, &ptr, size));
  33. return ptr;
  34. }
  35. void megdnn::test::HandleMemoryManager::free(void* ptr)
  36. {
  37. auto comp_handle = m_handle->megcore_computing_handle();
  38. megcoreDeviceHandle_t dev_handle;
  39. megcore_check(megcoreGetDeviceHandle(comp_handle, &dev_handle));
  40. megcore_check(megcoreFree(dev_handle, ptr));
  41. }
  42. megdnn::test::MemoryManager*
  43. megdnn::test::MemoryManagerHolder::get(Handle* handle)
  44. {
  45. std::lock_guard<std::mutex> lock(m_map_mutex);
  46. auto i = m_map.find(handle);
  47. if (i != m_map.end()) {
  48. // found
  49. return i->second.get();
  50. } else {
  51. // not found. create it
  52. auto mm = create_memory_manager_from_handle(handle);
  53. auto res = mm.get();
  54. m_map.emplace(std::make_pair(handle, std::move(mm)));
  55. return res;
  56. }
  57. }
  58. void MemoryManagerHolder::update(Handle* handle,
  59. std::unique_ptr<MemoryManager> memory_manager)
  60. {
  61. std::lock_guard<std::mutex> lock(m_map_mutex);
  62. m_map[handle] = std::move(memory_manager);
  63. }
  64. void MemoryManagerHolder::clear()
  65. {
  66. std::lock_guard<std::mutex> lock(m_map_mutex);
  67. m_map.clear();
  68. }
  69. // vim: syntax=cpp.doxygen

MegEngine 安装包中集成了使用 GPU 运行代码所需的 CUDA 环境,不用区分 CPU 和 GPU 版。 如果想要运行 GPU 程序,请确保机器本身配有 GPU 硬件设备并安装好驱动。 如果你想体验在云端 GPU 算力平台进行深度学习开发的感觉,欢迎访问 MegStudio 平台