Skip to content
This repository has been archived by the owner on Nov 17, 2023. It is now read-only.

Commit

Permalink
[storage] storage managers
Browse files Browse the repository at this point in the history
  • Loading branch information
hotpxl committed Aug 11, 2015
1 parent 21674ef commit 2214ce3
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 4 deletions.
2 changes: 1 addition & 1 deletion src/storage/naive_storage_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class NaiveStorageManager final : public StorageManager {
*/
~NaiveStorageManager() = default;
void* Alloc(size_t size) override;
void Free(void* ptr) override;
void Free(void* ptr, size_t) override;

private:
DISALLOW_COPY_AND_ASSIGN(NaiveStorageManager);
Expand Down
42 changes: 40 additions & 2 deletions src/storage/pooled_storage_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
#ifndef MXNET_STORAGE_POOLED_STORAGE_MANAGER_H_
#define MXNET_STORAGE_POOLED_STORAGE_MANAGER_H_

#include <unordered_map>
#include <vector>
#include "./storage_manager.h"
#include "mxnet/base.h"

Expand All @@ -15,7 +17,7 @@ namespace storage {
/*!
* \brief Storage manager with a memory pool.
*/
template <class DeviceStorage>
template <class DeviceStorage, size_t kThreshold>
class PooledStorageManager final : public StorageManager {
public:
/*!
Expand All @@ -27,12 +29,48 @@ class PooledStorageManager final : public StorageManager {
*/
~PooledStorageManager() = default;
void* Alloc(size_t size) override;
void Free(void* ptr) override;
void Free(void* ptr, size_t size) override;

private:
void ReleaseAll();
size_t used_memory_ = 0;
std::unordered_map<size_t, std::vector<void*>> memory_pool_;
DISALLOW_COPY_AND_ASSIGN(PooledStorageManager);
};

templace <class DeviceStorage, size_t kThreshold>
void* PooledStorageManager<DeviceStorage, kThreshold>::Alloc(size_t size) {
auto&& reuse_it = memory_pool_.find(size);
if (reuse_it == memory_pool_.end() || reuse_it->second.size() == 0) {
if (kThreshold <= used_memory_) {
ReleaseAll();
}
used_memory_ += size;
return DeviceStorage::Alloc(size);
} else {
auto&& reuse_pool = reuse_it->second;
auto ret = reuse_pool.back();
reuse_pool.pop_back();
return ret;
}
}

templace <class DeviceStorage, size_t kThreshold>
void PooledStorageManager<DeviceStorage, kThreshold>::Free(void* ptr, size_t size) {
auto&& reuse_pool = memory_pool_[size];
reuse_pool.push_back(ptr);
}

template <class DeviceStorage, size_t kThreshold>
void PooledStorageManager<DeviceStorage, kThreshold>::ReleaseAll() {
for (auto&& i : memory_pool_) {
for (auto&& j : i.second) {
DeviceStorage::Free(i.second);
used_memory_ -= i.first;
}
}
}

} // namespace storage
} // namespace mxnet

Expand Down
3 changes: 2 additions & 1 deletion src/storage/storage_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,9 @@ class StorageManager {
/*!
* \brief Deallocation.
* \param ptr Pointer to deallocate.
* \param size Size of the storage.
*/
virtual void* Free(void* ptr) = 0;
virtual void* Free(void* ptr, size_t size) = 0;
/*!
* \brief Destructor.
*/
Expand Down

0 comments on commit 2214ce3

Please sign in to comment.