don't reallocate blobs when shrinking memory use
authorJonathan L Long <jonlong@cs.berkeley.edu>
Wed, 2 Jul 2014 20:08:26 +0000 (13:08 -0700)
committerEvan Shelhamer <shelhamer@imaginarynumber.net>
Thu, 18 Sep 2014 19:41:45 +0000 (12:41 -0700)
This allows nets to be reshaped very quickly (essentially for free) as
long as sufficient memory has been allocated. Calling Blob::Reshape in
order to free up memory becomes impossible; however, this is not a
normal use case (and deleting blobs does free memory).

include/caffe/blob.hpp
src/caffe/blob.cpp

index b2a5c2f..c4f8b9e 100644 (file)
@@ -20,7 +20,7 @@ class Blob {
  public:
   Blob()
        : data_(), diff_(), num_(0), channels_(0), height_(0), width_(0),
-       count_(0) {}
+       count_(0), capacity_(0) {}
   explicit Blob(const int num, const int channels, const int height,
     const int width);
   void Reshape(const int num, const int channels, const int height,
@@ -120,6 +120,7 @@ class Blob {
   int height_;
   int width_;
   int count_;
+  int capacity_;
 
   DISABLE_COPY_AND_ASSIGN(Blob);
 };  // class Blob
index 9fd1232..cfffc37 100644 (file)
@@ -17,12 +17,10 @@ void Blob<Dtype>::Reshape(const int num, const int channels, const int height,
   height_ = height;
   width_ = width;
   count_ = num_ * channels_ * height_ * width_;
-  if (count_) {
-    data_.reset(new SyncedMemory(count_ * sizeof(Dtype)));
-    diff_.reset(new SyncedMemory(count_ * sizeof(Dtype)));
-  } else {
-    data_.reset(reinterpret_cast<SyncedMemory*>(NULL));
-    diff_.reset(reinterpret_cast<SyncedMemory*>(NULL));
+  if (count_ > capacity_) {
+    capacity_ = count_;
+    data_.reset(new SyncedMemory(capacity_ * sizeof(Dtype)));
+    diff_.reset(new SyncedMemory(capacity_ * sizeof(Dtype)));
   }
 }
 
@@ -33,7 +31,9 @@ void Blob<Dtype>::ReshapeLike(const Blob<Dtype>& other) {
 
 template <typename Dtype>
 Blob<Dtype>::Blob(const int num, const int channels, const int height,
-    const int width) {
+    const int width)
+  // capacity_ must be initialized before calling Reshape
+  : capacity_(0) {
   Reshape(num, channels, height, width);
 }