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.h 1.2 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #pragma once
  2. #include <cstddef>
  3. #include <mutex>
  4. #include <unordered_map>
  5. #include "megdnn/handle.h"
  6. namespace megdnn {
  7. namespace test {
  8. class MemoryManager {
  9. public:
  10. MemoryManager() = default;
  11. virtual ~MemoryManager() = default;
  12. virtual void* malloc(size_t size) = 0;
  13. virtual void free(void* ptr) = 0;
  14. };
  15. /**
  16. * \brief manages mapping from Handle* to MemoryManager*
  17. *
  18. * this class is a singleton
  19. */
  20. class MemoryManagerHolder {
  21. private:
  22. static MemoryManagerHolder m_instance;
  23. std::unordered_map<Handle*, std::unique_ptr<MemoryManager>> m_map;
  24. std::mutex m_map_mutex;
  25. public:
  26. static MemoryManagerHolder* instance() { return &m_instance; }
  27. MemoryManager* get(Handle* handle);
  28. void update(Handle* handle, std::unique_ptr<MemoryManager> memory_manager);
  29. void clear();
  30. };
  31. /**
  32. * \brief HandleMemoryManager utilizes megcore device handle in megdnn handle to
  33. * perform memory operations
  34. */
  35. class HandleMemoryManager : public MemoryManager {
  36. private:
  37. Handle* m_handle;
  38. public:
  39. HandleMemoryManager(Handle* handle);
  40. void* malloc(size_t size) override;
  41. void free(void* ptr) override;
  42. };
  43. } // namespace test
  44. } // namespace megdnn
  45. // vim: syntax=cpp.doxygen