MFEM
v4.3.0
Finite element discretization library
|
Class used by MFEM to store pointers to host and/or device memory. More...
#include <mem_manager.hpp>
Public Member Functions | |
Memory () | |
Default constructor: no initialization. More... | |
Memory (const Memory &orig)=default | |
Copy constructor: default. More... | |
Memory (Memory &&orig)=default | |
Move constructor: default. More... | |
Memory & | operator= (const Memory &orig)=default |
Copy-assignment operator: default. More... | |
Memory & | operator= (Memory &&orig)=default |
Move-assignment operator: default. More... | |
Memory (int size) | |
Allocate host memory for size entries. More... | |
Memory (int size, MemoryType mt) | |
Allocate memory for size entries with the given MemoryType mt. More... | |
Memory (int size, MemoryType h_mt, MemoryType d_mt) | |
Allocate memory for size entries with the given host MemoryType h_mt and device MemoryType d_mt. More... | |
Memory (T *ptr, int size, bool own) | |
Wrap an externally allocated host pointer, ptr with the current host memory type returned by MemoryManager::GetHostMemoryType(). More... | |
Memory (T *ptr, int size, MemoryType mt, bool own) | |
Wrap an externally allocated pointer, ptr, of the given MemoryType. More... | |
Memory (const Memory &base, int offset, int size) | |
Alias constructor. Create a Memory object that points inside the Memory object base. More... | |
~Memory ()=default | |
Destructor: default. More... | |
bool | OwnsHostPtr () const |
Return true if the host pointer is owned. Ownership indicates whether the pointer will be deleted by the method Delete(). More... | |
void | SetHostPtrOwner (bool own) const |
Set/clear the ownership flag for the host pointer. Ownership indicates whether the pointer will be deleted by the method Delete(). More... | |
bool | OwnsDevicePtr () const |
Return true if the device pointer is owned. Ownership indicates whether the pointer will be deleted by the method Delete(). More... | |
void | SetDevicePtrOwner (bool own) const |
Set/clear the ownership flag for the device pointer. Ownership indicates whether the pointer will be deleted by the method Delete(). More... | |
void | ClearOwnerFlags () const |
Clear the ownership flags for the host and device pointers, as well as any internal data allocated by the Memory object. More... | |
bool | UseDevice () const |
Read the internal device flag. More... | |
void | UseDevice (bool use_dev) const |
Set the internal device flag. More... | |
int | Capacity () const |
Return the size of the allocated memory. More... | |
void | Reset () |
Reset the memory to be empty, ensuring that Delete() will be a no-op. More... | |
void | Reset (MemoryType host_mt) |
Reset the memory and set the host memory type. More... | |
bool | Empty () const |
Return true if the Memory object is empty, see Reset(). More... | |
void | New (int size) |
Allocate host memory for size entries with the current host memory type returned by MemoryManager::GetHostMemoryType(). More... | |
void | New (int size, MemoryType mt) |
Allocate memory for size entries with the given MemoryType. More... | |
void | New (int size, MemoryType h_mt, MemoryType d_mt) |
Allocate memory for size entries with the given host MemoryType h_mt and device MemoryType d_mt. More... | |
void | Wrap (T *ptr, int size, bool own) |
Wrap an externally allocated host pointer, ptr with the current host memory type returned by MemoryManager::GetHostMemoryType(). More... | |
void | Wrap (T *ptr, int size, MemoryType mt, bool own) |
Wrap an externally allocated pointer, ptr, of the given MemoryType. More... | |
void | Wrap (T *h_ptr, T *d_ptr, int size, MemoryType h_mt, bool own) |
void | MakeAlias (const Memory &base, int offset, int size) |
Create a memory object that points inside the memory object base. More... | |
void | SetDeviceMemoryType (MemoryType d_mt) |
Set the device MemoryType to be used by the Memory object. More... | |
void | Delete () |
Delete the owned pointers. The Memory is not reset by this method, i.e. it will, generally, not be Empty() after this call. More... | |
void | DeleteDevice (bool copy_to_host=true) |
Delete the device pointer, if owned. If copy_to_host is true and the data is valid only on device, move it to host before deleting. Invalidates the device memory. More... | |
T & | operator[] (int idx) |
Array subscript operator for host memory. More... | |
const T & | operator[] (int idx) const |
Array subscript operator for host memory, const version. More... | |
operator T * () | |
Direct access to the host memory as T* (implicit conversion). More... | |
operator const T * () const | |
Direct access to the host memory as const T* (implicit conversion). More... | |
template<typename U > | |
operator U * () | |
Direct access to the host memory via explicit typecast. More... | |
template<typename U > | |
operator const U * () const | |
Direct access to the host memory via explicit typecast, const version. More... | |
T * | ReadWrite (MemoryClass mc, int size) |
Get read-write access to the memory with the given MemoryClass. More... | |
const T * | Read (MemoryClass mc, int size) const |
Get read-only access to the memory with the given MemoryClass. More... | |
T * | Write (MemoryClass mc, int size) |
Get write-only access to the memory with the given MemoryClass. More... | |
void | Sync (const Memory &other) const |
Copy the host/device pointer validity flags from other to *this. More... | |
void | SyncAlias (const Memory &base, int alias_size) const |
Update the alias Memory *this to match the memory location (all valid locations) of its base Memory, base. More... | |
MemoryType | GetMemoryType () const |
Return a MemoryType that is currently valid. If both the host and the device pointers are currently valid, then the device memory type is returned. More... | |
MemoryType | GetHostMemoryType () const |
Return the host MemoryType of the Memory object. More... | |
MemoryType | GetDeviceMemoryType () const |
Return the device MemoryType of the Memory object. If the device MemoryType is not set, return MemoryType::DEFAULT. More... | |
bool | HostIsValid () const |
Return true if host pointer is valid. More... | |
bool | DeviceIsValid () const |
Return true if device pointer is valid. More... | |
void | CopyFrom (const Memory &src, int size) |
Copy size entries from src to *this. More... | |
void | CopyFromHost (const T *src, int size) |
Copy size entries from the host pointer src to *this. More... | |
void | CopyTo (Memory &dest, int size) const |
Copy size entries from *this to dest. More... | |
void | CopyToHost (T *dest, int size) const |
Copy size entries from *this to the host pointer dest. More... | |
void | PrintFlags () const |
Print the internal flags. More... | |
int | CompareHostAndDevice (int size) const |
If both the host and the device data are valid, compare their contents. More... | |
Protected Types | |
enum | FlagMask : unsigned { REGISTERED = 1 << 0, OWNS_HOST = 1 << 1, OWNS_DEVICE = 1 << 2, OWNS_INTERNAL = 1 << 3, VALID_HOST = 1 << 4, VALID_DEVICE = 1 << 5, USE_DEVICE = 1 << 6, ALIAS = 1 << 7 } |
Protected Attributes | |
T * | h_ptr |
Pointer to host memory. Not owned. More... | |
int | capacity |
Size of the allocated memory. More... | |
MemoryType | h_mt |
Host memory type. More... | |
unsigned | flags |
Bit flags defined from the FlagMask enum. More... | |
Friends | |
class | MemoryManager |
void | MemoryPrintFlags (unsigned flags) |
Print the state of a Memory object based on its internal flags. Useful in a debugger. See also Memory<T>::PrintFlags(). More... | |
Class used by MFEM to store pointers to host and/or device memory.
The template class parameter, T, must be a plain-old-data (POD) type.
In many respects this class behaves like a pointer: When destroyed, a Memory object does NOT automatically delete any allocated memory. Only the method Delete() will deallocate a Memory object. Other methods that modify the object (e.g. New(), Wrap(), etc) will simply overwrite the old contents. One difference with a pointer is that a const Memory object does not allow modification of the content (unlike e.g. a const pointer).
A Memory object stores up to two different pointers: one host pointer (with MemoryType from MemoryClass::HOST) and one device pointer (currently one of MemoryType: DEVICE, DEVICE_DEBUG, DEVICE_UMPIRE or MANAGED).
A Memory object can hold (wrap) an externally allocated pointer with any given MemoryType.
Access to the content of the Memory object can be requested with any given MemoryClass through the methods ReadWrite(), Read(), and Write(). Requesting such access may result in additional (internally handled) memory allocation and/or memory copy. When ReadWrite() is called, the returned pointer becomes the only valid pointer. When Read() is called, the returned pointer becomes valid, however the other pointer (host or device) may remain valid as well. When Write() is called, the returned pointer becomes the only valid pointer, however, unlike ReadWrite(), no memory copy will be performed.
The host memory (pointer from MemoryClass::HOST) can be accessed through the inline methods: operator[]()
, operator*()
, the implicit conversion functions operator T*()
, operator const T*()
, and the explicit conversion template functions operator U*()
, operator const U*()
(with any suitable type U). In certain cases, using these methods may have undefined behavior, e.g. if the host pointer is not currently valid.
Definition at line 146 of file mem_manager.hpp.
|
protected |
Enumerator | |
---|---|
REGISTERED |
The host pointer is registered with the MemoryManager |
OWNS_HOST |
The host pointer will be deleted by Delete() |
OWNS_DEVICE |
The device pointer will be deleted by Delete() |
OWNS_INTERNAL |
Ownership flag for internal Memory data. |
VALID_HOST |
Host pointer is valid. |
VALID_DEVICE |
Device pointer is valid |
USE_DEVICE |
Internal device flag, see e.g. Vector::UseDevice() |
ALIAS |
Pointer is an alias. |
Definition at line 152 of file mem_manager.hpp.
|
inline |
Default constructor: no initialization.
Definition at line 179 of file mem_manager.hpp.
|
default |
Copy constructor: default.
|
default |
Move constructor: default.
|
inlineexplicit |
Allocate host memory for size entries.
The allocation uses the current host memory type returned by MemoryManager::GetHostMemoryType().
Definition at line 196 of file mem_manager.hpp.
|
inline |
Allocate memory for size entries with the given MemoryType mt.
The newly allocated memory is not initialized, however the given MemoryType is still set as valid.
Definition at line 202 of file mem_manager.hpp.
|
inline |
Allocate memory for size entries with the given host MemoryType h_mt and device MemoryType d_mt.
The newly allocated memory is not initialized. The host pointer is set as valid.
Definition at line 208 of file mem_manager.hpp.
|
inlineexplicit |
Wrap an externally allocated host pointer, ptr with the current host memory type returned by MemoryManager::GetHostMemoryType().
The parameter own determines whether ptr will be deleted when the method Delete() is called.
Definition at line 214 of file mem_manager.hpp.
|
inline |
Wrap an externally allocated pointer, ptr, of the given MemoryType.
The new memory object will have the given MemoryType set as valid.
The given ptr must be allocated appropriately for the given MemoryType.
The parameter own determines whether ptr will be deleted when the method Delete() is called.
Definition at line 224 of file mem_manager.hpp.
|
inline |
Alias constructor. Create a Memory object that points inside the Memory object base.
The new Memory object uses the same MemoryType(s) as base.
Definition at line 230 of file mem_manager.hpp.
|
default |
Destructor: default.
|
inline |
Return the size of the allocated memory.
Definition at line 268 of file mem_manager.hpp.
|
inline |
Clear the ownership flags for the host and device pointers, as well as any internal data allocated by the Memory object.
Definition at line 257 of file mem_manager.hpp.
|
inline |
If both the host and the device data are valid, compare their contents.
This method can be useful for debugging. It is explicitly instantiated for Memory<T> with T = int and T = double.
Definition at line 1205 of file mem_manager.hpp.
|
inline |
Copy size entries from src to *this.
The given size should not exceed the Capacity() of the source src and the destination, *this.
Definition at line 1137 of file mem_manager.hpp.
|
inline |
Copy size entries from the host pointer src to *this.
The given size should not exceed the Capacity() of *this.
Definition at line 1156 of file mem_manager.hpp.
|
inline |
Copy size entries from *this to dest.
The given size should not exceed the Capacity() of *this and the destination, dest.
Definition at line 497 of file mem_manager.hpp.
|
inline |
Copy size entries from *this to the host pointer dest.
The given size should not exceed the Capacity() of *this.
Definition at line 1175 of file mem_manager.hpp.
|
inline |
Delete the owned pointers. The Memory is not reset by this method, i.e. it will, generally, not be Empty() after this call.
Definition at line 974 of file mem_manager.hpp.
|
inline |
Delete the device pointer, if owned. If copy_to_host is true and the data is valid only on device, move it to host before deleting. Invalidates the device memory.
Definition at line 988 of file mem_manager.hpp.
|
inline |
Return true if device pointer is valid.
Definition at line 1131 of file mem_manager.hpp.
|
inline |
Return true if the Memory object is empty, see Reset().
Default-constructed objects are uninitialized, so they are not guaranteed to be empty.
Definition at line 283 of file mem_manager.hpp.
|
inline |
Return the device MemoryType of the Memory object. If the device MemoryType is not set, return MemoryType::DEFAULT.
Definition at line 1118 of file mem_manager.hpp.
|
inline |
Return the host MemoryType of the Memory object.
Definition at line 473 of file mem_manager.hpp.
|
inline |
Return a MemoryType that is currently valid. If both the host and the device pointers are currently valid, then the device memory type is returned.
Definition at line 1111 of file mem_manager.hpp.
|
inline |
Return true if host pointer is valid.
Definition at line 1125 of file mem_manager.hpp.
|
inline |
Create a memory object that points inside the memory object base.
The new Memory object uses the same MemoryType(s) as base.
Definition at line 924 of file mem_manager.hpp.
|
inline |
Allocate host memory for size entries with the current host memory type returned by MemoryManager::GetHostMemoryType().
Definition at line 831 of file mem_manager.hpp.
|
inline |
Allocate memory for size entries with the given MemoryType.
The newly allocated memory is not initialized, however the given MemoryType is still set as valid.
When mt is a host type, the device MemoryType will be set later, if requested, using the dual type of mt, see MemoryManager::GetDualMemoryType().
When mt is a device type, the host MemoryType will be set immediately to be the dual of mt, see MemoryManager::GetDualMemoryType().
Definition at line 841 of file mem_manager.hpp.
|
inline |
Allocate memory for size entries with the given host MemoryType h_mt and device MemoryType d_mt.
The newly allocated memory is not initialized. The host pointer is set as valid.
Definition at line 853 of file mem_manager.hpp.
|
inline |
Direct access to the host memory as const T* (implicit conversion).
This method can be used only if the host pointer is currently valid (the device pointer may be valid or invalid).
When the Memory is empty, this method can be used and it returns NULL.
Definition at line 1023 of file mem_manager.hpp.
|
inlineexplicit |
Direct access to the host memory via explicit typecast, const version.
A pointer to type T must be reinterpret_cast-able to a pointer to type const U.
This method can be used only if the host pointer is currently valid (the device pointer may be valid or invalid).
When the Memory is empty, this method can be used and it returns NULL.
Definition at line 1040 of file mem_manager.hpp.
|
inline |
Direct access to the host memory as T* (implicit conversion).
When the type T is const-qualified, this method can be used only if the host pointer is currently valid (the device pointer may be valid or invalid).
When the type T is not const-qualified, this method can be used only if the host pointer is the only valid pointer.
When the Memory is empty, this method can be used and it returns NULL.
Definition at line 1013 of file mem_manager.hpp.
Direct access to the host memory via explicit typecast.
A pointer to type T must be reinterpret_cast-able to a pointer to type U. In particular, this method cannot be used to cast away const-ness from the base type T.
When the type U is const-qualified, this method can be used only if the host pointer is currently valid (the device pointer may be valid or invalid).
When the type U is not const-qualified, this method can be used only if the host pointer is the only valid pointer.
When the Memory is empty, this method can be used and it returns NULL.
Definition at line 1030 of file mem_manager.hpp.
|
default |
Copy-assignment operator: default.
|
default |
Move-assignment operator: default.
|
inline |
Array subscript operator for host memory.
Definition at line 998 of file mem_manager.hpp.
|
inline |
Array subscript operator for host memory, const version.
Definition at line 1006 of file mem_manager.hpp.
|
inline |
Return true if the device pointer is owned. Ownership indicates whether the pointer will be deleted by the method Delete().
Definition at line 248 of file mem_manager.hpp.
|
inline |
Return true if the host pointer is owned. Ownership indicates whether the pointer will be deleted by the method Delete().
Definition at line 239 of file mem_manager.hpp.
|
inline |
Print the internal flags.
This method can be useful for debugging. It is explicitly instantiated for Memory<T> with T = int and T = double.
Definition at line 1199 of file mem_manager.hpp.
|
inline |
Get read-only access to the memory with the given MemoryClass.
The parameter size must not exceed the Capacity().
Definition at line 1060 of file mem_manager.hpp.
|
inline |
Get read-write access to the memory with the given MemoryClass.
If only read or only write access is needed, then the methods Read() or Write() should be used instead of this method.
The parameter size must not exceed the Capacity().
Definition at line 1047 of file mem_manager.hpp.
|
inline |
Reset the memory to be empty, ensuring that Delete() will be a no-op.
This is the Memory class equivalent to setting a pointer to NULL, see Empty().
Definition at line 813 of file mem_manager.hpp.
|
inline |
Reset the memory and set the host memory type.
Definition at line 822 of file mem_manager.hpp.
|
inline |
Set the device MemoryType to be used by the Memory object.
If the specified d_mt is not a device MemoryType, i.e. not one of the types in MemoryClass::DEVICE, then this method will return immediately.
If the device MemoryType has been previously set to a different type and the actual device memory has been allocated, this method will trigger an error. This method will not perform the actual device memory allocation, however, the allocation may already exist if the MemoryType is the same as the current one.
If the Memory is an alias Memory, the device MemoryType of its base will be updated as described above.
Definition at line 962 of file mem_manager.hpp.
|
inline |
Set/clear the ownership flag for the device pointer. Ownership indicates whether the pointer will be deleted by the method Delete().
Definition at line 252 of file mem_manager.hpp.
|
inline |
Set/clear the ownership flag for the host pointer. Ownership indicates whether the pointer will be deleted by the method Delete().
Definition at line 243 of file mem_manager.hpp.
|
inline |
Copy the host/device pointer validity flags from other to *this.
This method synchronizes the pointer validity flags of two Memory objects that use the same host/device pointers, or when *this is an alias (sub-Memory) of other. Typically, this method should be called after other is manipulated in a way that changes its pointer validity flags (e.g. it was moved from device to host memory).
Definition at line 1086 of file mem_manager.hpp.
|
inline |
Update the alias Memory *this to match the memory location (all valid locations) of its base Memory, base.
This method is useful when alias Memory is moved and manipulated in a different memory space. Such operations render the pointer validity flags of the base incorrect. Calling this method will ensure that base is up-to-date. Note that this is achieved by moving/copying *this (if necessary), and not base.
Definition at line 1100 of file mem_manager.hpp.
|
inline |
Read the internal device flag.
Definition at line 261 of file mem_manager.hpp.
|
inline |
Set the internal device flag.
Definition at line 264 of file mem_manager.hpp.
|
inline |
Wrap an externally allocated host pointer, ptr with the current host memory type returned by MemoryManager::GetHostMemoryType().
The parameter own determines whether ptr will be deleted when the method Delete() is called.
Definition at line 863 of file mem_manager.hpp.
|
inline |
Wrap an externally allocated pointer, ptr, of the given MemoryType.
The new memory object will have the given MemoryType set as valid.
The given ptr must be allocated appropriately for the given MemoryType.
The parameter own determines whether ptr will be deleted when the method Delete() is called.
Definition at line 885 of file mem_manager.hpp.
|
inline |
Wrap an externally pair of allocated pointers, h_ptr and d_ptr, of the given host MemoryType h_mt. The new memory object will have the device MemoryType set as valid.
The given h_ptr and d_ptr must be allocated appropriately for the given host MemoryType and its dual device MemoryType as defined by MemoryManager::GetDualMemoryType().
The parameter own determines whether both h_ptr and d_ptr will be deleted when the method Delete() is called.
Definition at line 910 of file mem_manager.hpp.
|
inline |
Get write-only access to the memory with the given MemoryClass.
The parameter size must not exceed the Capacity().
The contents of the returned pointer is undefined, unless it was validated by a previous call to Read() or ReadWrite() with the same MemoryClass.
Definition at line 1073 of file mem_manager.hpp.
|
friend |
Definition at line 149 of file mem_manager.hpp.
|
friend |
Print the state of a Memory object based on its internal flags. Useful in a debugger. See also Memory<T>::PrintFlags().
Definition at line 1658 of file mem_manager.cpp.
|
protected |
Size of the allocated memory.
Definition at line 171 of file mem_manager.hpp.
|
mutableprotected |
Bit flags defined from the FlagMask enum.
Definition at line 173 of file mem_manager.hpp.
|
protected |
Host memory type.
Definition at line 172 of file mem_manager.hpp.
|
protected |
Pointer to host memory. Not owned.
The type of the pointer is given by the field h_mt; it can be any type from MemoryClass::HOST.
Definition at line 170 of file mem_manager.hpp.