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 1.9 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include "./memory_manager.h"
  2. #include "src/common/utils.h"
  3. #include "test/common/utils.h"
  4. namespace {
  5. using namespace megdnn;
  6. using namespace test;
  7. std::unique_ptr<MemoryManager> create_memory_manager_from_handle(Handle* handle) {
  8. return make_unique<HandleMemoryManager>(handle);
  9. }
  10. } // anonymous namespace
  11. megdnn::test::MemoryManagerHolder megdnn::test::MemoryManagerHolder::m_instance;
  12. megdnn::test::HandleMemoryManager::HandleMemoryManager(Handle* handle)
  13. : MemoryManager(), m_handle(handle) {}
  14. void* megdnn::test::HandleMemoryManager::malloc(size_t size) {
  15. auto comp_handle = m_handle->megcore_computing_handle();
  16. megcoreDeviceHandle_t dev_handle;
  17. megcore_check(megcoreGetDeviceHandle(comp_handle, &dev_handle));
  18. void* ptr;
  19. megcore_check(megcoreMalloc(dev_handle, &ptr, size));
  20. return ptr;
  21. }
  22. void megdnn::test::HandleMemoryManager::free(void* ptr) {
  23. auto comp_handle = m_handle->megcore_computing_handle();
  24. megcoreDeviceHandle_t dev_handle;
  25. megcore_check(megcoreGetDeviceHandle(comp_handle, &dev_handle));
  26. megcore_check(megcoreFree(dev_handle, ptr));
  27. }
  28. megdnn::test::MemoryManager* megdnn::test::MemoryManagerHolder::get(Handle* handle) {
  29. std::lock_guard<std::mutex> lock(m_map_mutex);
  30. auto i = m_map.find(handle);
  31. if (i != m_map.end()) {
  32. // found
  33. return i->second.get();
  34. } else {
  35. // not found. create it
  36. auto mm = create_memory_manager_from_handle(handle);
  37. auto res = mm.get();
  38. m_map.emplace(std::make_pair(handle, std::move(mm)));
  39. return res;
  40. }
  41. }
  42. void MemoryManagerHolder::update(
  43. Handle* handle, std::unique_ptr<MemoryManager> memory_manager) {
  44. std::lock_guard<std::mutex> lock(m_map_mutex);
  45. m_map[handle] = std::move(memory_manager);
  46. }
  47. void MemoryManagerHolder::clear() {
  48. std::lock_guard<std::mutex> lock(m_map_mutex);
  49. m_map.clear();
  50. }
  51. // vim: syntax=cpp.doxygen