aboutsummaryrefslogtreecommitdiff
path: root/Carpet/CarpetLib/src/mem.cc
diff options
context:
space:
mode:
authorErik Schnetter <schnetter@gmail.com>2012-11-16 18:55:47 -0500
committerErik Schnetter <schnetter@gmail.com>2012-11-22 09:59:16 -0500
commit53a1c146bc09c67ea709c14dab4c73ebebed86dc (patch)
treeb5bd034cf3c0e6de4cb422ceffe52e01de06f505 /Carpet/CarpetLib/src/mem.cc
parentdf843816d07d18e2c0407915d1b8113bfe7ab720 (diff)
Allow padding in transport operators
Rewrite padding infrastructure. Add padded array extents to transport operator APIs.
Diffstat (limited to 'Carpet/CarpetLib/src/mem.cc')
-rw-r--r--Carpet/CarpetLib/src/mem.cc25
1 files changed, 19 insertions, 6 deletions
diff --git a/Carpet/CarpetLib/src/mem.cc b/Carpet/CarpetLib/src/mem.cc
index 27f86e951..f3a4fa6ff 100644
--- a/Carpet/CarpetLib/src/mem.cc
+++ b/Carpet/CarpetLib/src/mem.cc
@@ -20,7 +20,12 @@ using namespace std;
-double const gmem::MEGA = 1000*1000;
+double const gmem::KILO = 1000.0;
+double const gmem::MEGA = 1000.0*1000.0;
+double const gmem::GIGA = 1000.0*1000.0*1000.0;
+double const gmem::TERA = 1000.0*1000.0*1000.0*1000.0;
+double const gmem::PETA = 1000.0*1000.0*1000.0*1000.0*1000.0;
+double const gmem::EXA = 1000.0*1000.0*1000.0*1000.0*1000.0*1000.0;
// Total number of currently allocated bytes and objects
double gmem::total_allocated_bytes = 0;
@@ -38,7 +43,8 @@ template<typename T>
mem<T>::
mem (size_t const vectorlength, size_t const nelems,
T * const memptr, size_t const memsize)
- : storage_ (memptr),
+ : storage_base_ (memptr),
+ storage_ (memptr),
nelems_ (nelems),
vectorlength_ (vectorlength),
owns_storage_ (false),
@@ -62,7 +68,10 @@ mem (size_t const vectorlength, size_t const nelems,
int(max_allowed_memory_MB));
}
try {
- storage_ = new T [vectorlength * nelems];
+ // TODO: align and pad storage
+ size_t const padding = 0;
+ storage_base_ = new T [vectorlength * nelems + padding];
+ storage_ = storage_base_ + padding;
owns_storage_ = true;
} catch (...) {
T Tdummy;
@@ -77,7 +86,9 @@ mem (size_t const vectorlength, size_t const nelems,
total_allocated_bytes += nbytes;
max_allocated_bytes = max (max_allocated_bytes, total_allocated_bytes);
if (poison_new_memory) {
- memset (storage_, poison_value, vectorlength * nelems * sizeof (T));
+ memset (storage_base_,
+ poison_value, (vectorlength * nelems +
+ storage_ - storage_base_) * sizeof (T));
}
} else {
assert (memsize >= vectorlength * nelems * sizeof (T));
@@ -96,7 +107,7 @@ mem<T>::
{
assert (not has_clients());
if (owns_storage_) {
- delete [] storage_;
+ delete [] storage_base_;
const double nbytes = vectorlength_ * nelems_ * sizeof (T);
total_allocated_bytes -= nbytes;
}
@@ -144,13 +155,15 @@ memory ()
const
{
return
+ memoryof (storage_base_) +
memoryof (storage_) +
memoryof (nelems_) +
memoryof (vectorlength_) +
memoryof (owns_storage_) +
memoryof (clients_) +
memoryof (num_clients_) +
- (owns_storage_ ? sizeof (T) * vectorlength_ * nelems_ : 0);
+ (owns_storage_ ? (vectorlength_ * nelems_ +
+ storage_ - storage_base_) : 0) * sizeof (T);
}