Teuchos - Trilinos Tools Package Version of the Day
Loading...
Searching...
No Matches
Teuchos_Workspace.cpp
1// @HEADER
2// *****************************************************************************
3// Teuchos: Common Tools Package
4//
5// Copyright 2004 NTESS and the Teuchos contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#include "Teuchos_Workspace.hpp"
11
12namespace {
13Teuchos::RCP<Teuchos::WorkspaceStore> default_workspace_store(Teuchos::null);
14}
15
16// Global functions
17
22
27
29{
30 if( workspace_store ) {
31 out
32 << "\n*** Statistics for autmatic array workspace:"
33 << "\n Number of megabytes of preallocated workspace = "
34 << (workspace_store->num_bytes_total()*1e-6)
35 << "\n Number of megabytes needed = "
36 << (workspace_store->num_max_bytes_needed()*1e-6)
37 << "\n Number of allocations using preallocated workspace = "
38 << workspace_store->num_static_allocations()
39 << "\n Number of dynamic allocations beyond preallocated workspace = "
40 << workspace_store->num_dyn_allocations()
41 << "\n";
42 }
43 else {
44 out
45 << "\n*** Statistics for autmatic array workspace:"
46 << "\n No workspace storage was allocated!\n";
47 }
48}
49
50namespace Teuchos {
51
52// WorkspaceStore
53
55 : workspace_begin_(NULL)
56 , workspace_end_(NULL)
57 , curr_ws_ptr_(NULL)
58 , num_static_allocations_(0)
59 , num_dyn_allocations_(0)
60 , num_current_bytes_total_(0)
61 , num_max_bytes_needed_(0)
62{
63 if(num_bytes)
64 protected_initialize(num_bytes);
65}
66
68 if(workspace_begin_) delete [] workspace_begin_;
69}
70
72{
74 curr_ws_ptr_ != workspace_begin_, std::logic_error
75 ,"WorkspaceStore::set_workspace_size(...) : Error, "
76 "You can not reset the workspace size when any RawWorkspace objects "
77 "are using workspace!" );
78 if(workspace_begin_) delete [] workspace_begin_;
79 workspace_begin_ = ::new char[num_bytes];
80 workspace_end_ = workspace_begin_ + num_bytes;
81 curr_ws_ptr_ = workspace_begin_;
82 num_static_allocations_ = 0;
83 num_dyn_allocations_ = 0;
84 num_current_bytes_total_= 0;
85 num_max_bytes_needed_ = 0;
86}
87
88// RawWorkspace
89
90RawWorkspace::RawWorkspace(WorkspaceStore* workspace_store, size_t num_bytes_in)
91{
92 if(num_bytes_in) {
93 workspace_store_ = workspace_store;
94 if( !workspace_store_ || workspace_store_->num_bytes_remaining() < num_bytes_in ) {
95 workspace_begin_ = ::new char[num_bytes_in];
96 workspace_end_ = workspace_begin_ + num_bytes_in;
97 owns_memory_ = true;
98 if(workspace_store_)
99 workspace_store_->num_dyn_allocations_++;
100 }
101 else {
102 workspace_begin_ = workspace_store_->curr_ws_ptr_;
103 workspace_end_ = workspace_begin_ + num_bytes_in;
104 owns_memory_ = false;
105 workspace_store_->curr_ws_ptr_ += num_bytes_in;
106 workspace_store_->num_static_allocations_++;
107 }
108 }
109 else {
110 workspace_store_ = NULL;
111 workspace_begin_ = NULL;
112 workspace_end_ = NULL;
113 owns_memory_ = false;
114 }
115 if(workspace_store_) {
116 workspace_store_->num_current_bytes_total_ += num_bytes_in;
117 if( workspace_store_->num_current_bytes_total_ > workspace_store_->num_max_bytes_needed_ )
118 workspace_store_->num_max_bytes_needed_ = workspace_store_->num_current_bytes_total_;
119 }
120}
121
123{
124 if(workspace_store_)
125 workspace_store_->num_current_bytes_total_ -= this->num_bytes();
126 if(owns_memory_) {
127 if(workspace_begin_) delete [] workspace_begin_;
128 }
129 else {
130 if(workspace_store_) {
132 workspace_store_->curr_ws_ptr_ != workspace_end_
133 ,"RawWorkspace::~RawWorkspace(...): Error, "
134 "Invalid usage of RawWorkspace class, corrupted WorspaceStore object!" );
135 workspace_store_->curr_ws_ptr_ = workspace_begin_;
136 }
137 }
138}
139
140#ifdef __PGI // Should not have to define this since it should not be called!
141void* RawWorkspace::operator new(size_t)
142{
143 assert(0);
144 return NULL;
145}
146#endif
147
148} // end namespace Teuchos
Smart reference counting pointer class for automatic garbage collection.
size_t num_bytes() const
Return the number of bytes of raw workspace.
~RawWorkspace()
Deallocate workspace.
Workspace encapsulation class.
void protected_initialize(size_t num_bytes)
size_t num_bytes_remaining() const
Return the number of bytes remaining currently.
WorkspaceStore(size_t num_bytes)
#define TEUCHOS_TEST_FOR_TERMINATION(terminate_test, msg)
This macro is to be used instead of TEUCHOS_TEST_FOR_EXCEPTION() to report an error in situations whe...
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...
TEUCHOSCORE_LIB_DLL_EXPORT void print_memory_usage_stats(const WorkspaceStore *workspace_store, std::ostream &out)
Print statistics on memory usage.
TEUCHOSCORE_LIB_DLL_EXPORT Teuchos::RCP< WorkspaceStore > get_default_workspace_store()
Get the global workspace object set by set_default_workspace_store().
TEUCHOSCORE_LIB_DLL_EXPORT void set_default_workspace_store(const Teuchos::RCP< WorkspaceStore > &default_workspace_store)
Set pointer to global workspace object.