13#ifndef SRC_MADNESS_WORLD_CLOUD_H_
14#define SRC_MADNESS_WORLD_CLOUD_H_
52 struct type_name<
std::vector<Function<double,1>>> {
static const char*
value() {
return "std::vector<Function<double,1>>"; } };
54 struct type_name<
std::vector<Function<double,2>>> {
static const char*
value() {
return "std::vector<Function<double,2>>"; } };
56 struct type_name<
std::vector<Function<double,3>>> {
static const char*
value() {
return "std::vector<Function<double,3>>"; } };
58 struct type_name<
std::vector<Function<double,4>>> {
static const char*
value() {
return "std::vector<Function<double,4>>"; } };
60 struct type_name<
std::vector<Function<double,5>>> {
static const char*
value() {
return "std::vector<Function<double,5>>"; } };
62 struct type_name<
std::vector<Function<double,6>>> {
static const char*
value() {
return "std::vector<Function<double,6>>"; } };
64template<
typename keyT>
75 for (
auto &l2 : list2.
list)
list.push_back(l2);
103 template <
typename T>
106 template <
typename T>
109 template<
typename T, std::
size_t NDIM>
112 template<
typename T, std::
size_t NDIM>
115 template<
typename keyQ,
typename valueT>
118 template<
typename keyQ,
typename valueT>
121 template<
typename T, std::
size_t NDIM>
141 std::size_t hashtype =
typeid(
T).hash_code();
228 using valueT = std::vector<unsigned char>;
229 typedef std::map<keyT, cached_objT>
cacheT;
238 template <
typename T>
241 template <
typename T>
281 std::size_t memsize=0;
282 std::size_t max_record_size=0;
284 memsize+=item.second.size();
285 max_record_size=std::max(max_record_size,item.second.size());
287 std::size_t global_memsize=memsize;
288 std::size_t max_memsize=memsize;
289 std::size_t min_memsize=memsize;
290 universe.
gop.
sum(global_memsize);
291 universe.
gop.
max(max_memsize);
292 universe.
gop.
max(max_record_size);
293 universe.
gop.
min(min_memsize);
296 auto global_size=local_size;
297 universe.
gop.
sum(global_size);
298 double byte2gbyte=1.0/(1024*1024*1024);
300 if (universe.
rank()==0) {
301 print(
"Cloud memory:");
303 print(
"size of cloud (total)");
304 print(
" number of records: ",global_size);
305 print(
" memory in GBytes: ",global_memsize*byte2gbyte);
306 print(
"size of cloud (average per node)");
307 print(
" number of records: ",
double(global_size)/universe.
size());
308 print(
" memory in GBytes: ",global_memsize*byte2gbyte/universe.
size());
309 print(
"min/max of node");
310 print(
" memory in GBytes: ",min_memsize*byte2gbyte,max_memsize*byte2gbyte);
311 print(
" max record size in GBytes:",max_record_size*byte2gbyte);
314 return std::tie(global_size,global_memsize);
323 universe.
gop.
max(rtime_max);
324 universe.
gop.
sum(rtime_acc);
325 rtime_av = rtime_acc/universe.
size();
332 universe.
gop.
sum(cstores);
333 if (universe.
rank() == 0) {
334 auto precision = std::cout.precision();
335 std::cout << std::fixed << std::setprecision(1);
336 print(
"cloud storing wall time", wtime * 0.001);
337 print(
"cloud replication wall time", ptime * 0.001);
338 print(
"cloud max reading time (all procs)", rtime_max * 0.001, std::defaultfloat);
339 print(
"cloud average reading cpu time (all procs)", rtime_av * 0.001, std::defaultfloat);
340 print(
"cloud accumulated reading cpu time (all procs)", rtime_acc * 0.001, std::defaultfloat);
341 std::cout << std::setprecision(precision) << std::scientific;
342 print(
"cloud cache stores ",
long(cstores));
343 print(
"cloud cache loads ",
long(creads));
375 return forward_load<T>(world, rlist);
387 return forward_load<T>(world, recordlist);
398 return load_tuple<T>(world, recordlist);
401 target.cloud_load(world, *
this, recordlist);
404 return do_load<T>(world, recordlist);
412 print(
"Cloud contents are replicated and read-only!");
425 recordlist+=
source.cloud_store(world,*
this);
450 std::list<keyT> keylist;
452 keylist.push_back(it->first);
456 if (rank == world.
rank()) {
457 std::size_t keylistsize = keylist.size();
460 for (
auto key : keylist) {
464 auto data = acc->second;
465 std::size_t sz=
data.size();
471 for (std::size_t start=0; start<sz; start+=chunk_size) {
472 std::size_t remainder = std::min(sz - start, chunk_size);
479 std::size_t keylistsize;
481 for (
size_t i=0; i<keylistsize; i++) {
488 for (std::size_t start=0; start<sz; start+=chunk_size) {
489 std::size_t remainder=std::min(sz-start,chunk_size);
499 if (
debug and (world.
rank()==0))
print(
"replication ended after ",cpu1-cpu0,
" seconds");
511 template<
typename>
struct is_tuple : std::false_type { };
512 template<
typename ...T>
struct is_tuple<
std::tuple<T...>> : std::true_type { };
514 template<
typename Q>
struct is_vector : std::false_type { };
515 template<
typename Q>
struct is_vector<
std::vector<Q>> : std::true_type { };
520 template<
typename T, std::
size_t NDIM>
551 if (
auto obj = std::any_cast<T>(&
cached_objects.find(record)->second))
return *obj;
585 if (is_already_present) std::cout <<
"skipping ";
588 <<
" to record " << record << std::endl;
590 std::cout <<
"storing object of " <<
type_name<T>::value() <<
" to record " << record << std::endl;
593 if (
source.is_compressed() and T::dimT>3)
print(
"WARNING: storing compressed hi-dim `function");
597 if (is_already_present) {
627 typename std::enable_if<is_vector<T>::value,
T>
::type
629 std::size_t sz = do_load<std::size_t>(world, recordlist);
631 for (std::size_t i = 0; i < sz; ++i) {
632 target[i] = do_load<typename T::value_type>(world, recordlist);
642 typename std::enable_if<!is_vector<T>::value,
T>
::type
644 keyT record = recordlist.pop_front_and_return();
647 if (
is_cached(record))
return load_from_cache<T>(world, record);
659 std::shared_ptr<implT> impl;
665 print(
"failed to load function pointer from cloud, maybe the target is out of scope?");
666 print(
"record:", record,
"world:", world.
id());
697 if (
debug and world.
rank()==0) std::cout <<
"done with vector storing; container size "
703 template<
typename... Ts>
706 auto storeaway = [&](
const auto &
arg) {
709 auto l = [&](Ts
const &...
arg) {
710 ((storeaway(
arg)), ...);
712 std::apply(l, input);
722 if (
debug) std::cout <<
"loading tuple of type " <<
typeid(
T).
name() <<
" to world " << world.
id() << std::endl;
724 std::apply([&](
auto &&... args) {
725 ((args =
forward_load<
typename std::remove_reference<
decltype(args)>
::type>(world, recordlist)), ...);
cloud class
Definition cloud.h:178
bool is_cached(const keyT &key) const
Definition cloud.h:557
void clear()
Definition cloud.h:352
void replicate_per_node(const std::size_t chunk_size=INT_MAX)
Definition cloud.h:433
bool is_in_container(const keyT &key) const
checks if a (universe) container record is used
Definition cloud.h:565
bool force_load_from_cache
forces load from cache (mainly for debugging)
Definition cloud.h:183
bool debug
prints debug output
Definition cloud.h:180
ReplicationPolicy replication_policy
Definition cloud.h:222
std::atomic< long > writing_time1
Definition cloud.h:506
std::enable_if< is_vector< T >::value, T >::type do_load(World &world, recordlistT &recordlist) const
Definition cloud.h:628
recordlistT store_other(madness::World &world, const std::vector< T > &source)
Definition cloud.h:691
std::any cached_objT
Definition cloud.h:226
recordlistT store(madness::World &world, const T &source)
Definition cloud.h:410
T load_tuple(madness::World &world, recordlistT &recordlist) const
Definition cloud.h:721
std::is_base_of< archive::ParallelSerializableObject, T > is_parallel_serializable_object
Definition cloud.h:524
madness::archive::ContainerRecordOutputArchive::keyT keyT
Definition cloud.h:227
std::atomic< long > replication_time
Definition cloud.h:507
Recordlist< keyT > recordlistT
Definition cloud.h:230
StoragePolicy storage_policy
current policy for loading/storing/replicating
Definition cloud.h:221
std::is_constructible< T, World & > is_world_constructible
Definition cloud.h:526
recordlistT store_other(madness::World &world, const T &source)
Definition cloud.h:581
bool is_replicated
if contents of the container are replicated
Definition cloud.h:181
void set_force_load_from_cache(bool value)
Definition cloud.h:259
std::tuple< size_t, double > print_size(World &universe)
Definition cloud.h:279
decltype(std::declval< T >().cloud_store(std::declval< World & >(), std::declval< Cloud & >())) member_cloud_serialize_t
Definition cloud.h:239
void replicate(const std::size_t chunk_size=INT_MAX)
Definition cloud.h:441
recordlistT local_list_of_container_keys
Definition cloud.h:235
std::atomic< long > reading_time
Definition cloud.h:504
void clear_timings()
Definition cloud.h:356
recordlistT store_tuple(World &world, const std::tuple< Ts... > &input)
store a tuple in multiple records
Definition cloud.h:704
void set_debug(bool value)
Definition cloud.h:251
std::enable_if<!is_vector< T >::value, T >::type do_load(World &world, recordlistT &recordlist) const
Definition cloud.h:643
T load(madness::World &world, const recordlistT recordlist) const
load a single object from the cloud, recordlist is kept unchanged
Definition cloud.h:370
void cache(madness::World &world, const T &obj, const keyT &record) const
Definition cloud.h:542
void set_fence(bool value)
Definition cloud.h:255
std::atomic< long > cache_reads
Definition cloud.h:508
ReplicationPolicy get_replication_policy() const
Definition cloud.h:267
Cloud(madness::World &universe)
Definition cloud.h:247
cacheT cached_objects
Definition cloud.h:234
void clear_cache(World &subworld)
Definition cloud.h:346
ReplicationPolicy
Definition cloud.h:211
@ NodeReplicated
Definition cloud.h:216
@ Distributed
Definition cloud.h:212
@ RankReplicated
Definition cloud.h:214
void set_replication_policy(const ReplicationPolicy value)
Definition cloud.h:263
StoragePolicy get_storing_policy() const
Definition cloud.h:275
T load_from_cache(madness::World &world, const keyT &record) const
load an object from the cache, record is unchanged
Definition cloud.h:548
madness::meta::is_detected< member_cloud_serialize_t, T > has_cloud_serialize
Definition cloud.h:242
std::vector< unsigned char > valueT
Definition cloud.h:228
bool dofence
fences after load/store
Definition cloud.h:182
void print_timings(World &universe) const
Definition cloud.h:317
T allocator(World &world) const
Definition cloud.h:572
std::atomic< long > writing_time
Definition cloud.h:505
void set_storing_policy(const StoragePolicy value)
Definition cloud.h:271
madness::WorldContainer< keyT, valueT > container
Definition cloud.h:233
T forward_load(madness::World &world, recordlistT &recordlist) const
load a single object from the cloud, recordlist is consumed while loading elements
Definition cloud.h:392
StoragePolicy
Definition cloud.h:204
@ StoreFunctionPointer
Definition cloud.h:207
@ StoreFunction
Definition cloud.h:205
std::map< keyT, cached_objT > cacheT
Definition cloud.h:229
T consuming_load(madness::World &world, recordlistT &recordlist) const
similar to load, but will consume the recordlist
Definition cloud.h:383
std::atomic< long > cache_stores
Definition cloud.h:509
FunctionImpl holds all Function state to facilitate shallow copy semantics.
Definition funcimpl.h:945
A multiresolution adaptive numerical function.
Definition mra.h:139
A tensor is a multidimensional array.
Definition tensor.h:317
Makes a distributed container with specified attributes.
Definition worlddc.h:866
bool find(accessor &acc, const keyT &key)
Write access to LOCAL value by key. Returns true if found, false otherwise (always false for remote).
Definition worlddc.h:987
void max(T *buf, size_t nelem)
Inplace global max while still processing AM & tasks.
Definition worldgop.h:884
void fence(bool debug=false)
Synchronizes all processes in communicator AND globally ensures no pending AM or tasks.
Definition worldgop.cc:161
void min(T *buf, size_t nelem)
Inplace global min while still processing AM & tasks.
Definition worldgop.h:878
void sum(T *buf, size_t nelem)
Inplace global sum while still processing AM & tasks.
Definition worldgop.h:872
void Bcast(T *buffer, int count, int root) const
MPI broadcast an array of count elements.
Definition worldmpi.h:416
A parallel world class.
Definition world.h:132
ProcessID rank() const
Returns the process rank in this World (same as MPI_Comm_rank()).
Definition world.h:320
WorldMpiInterface & mpi
MPI interface.
Definition world.h:204
ProcessID size() const
Returns the number of processes in this World (same as MPI_Comm_size()).
Definition world.h:330
unsigned long id() const
Definition world.h:315
WorldGopInterface & gop
Global operations.
Definition world.h:207
Definition parallel_dc_archive.h:14
long keyT
Definition parallel_dc_archive.h:16
An archive for storing local or parallel data wrapping a BinaryFstreamOutputArchive.
Definition parallel_archive.h:321
auto T(World &world, response_space &f) -> response_space
Definition global_functions.cc:28
Tensor< typename Tensor< T >::scalar_type > arg(const Tensor< T > &t)
Return a new tensor holding the argument of each element of t (complex types only)
Definition tensor.h:2503
static const double v
Definition hatom_sf_dirac.cc:20
#define MADNESS_CHECK(condition)
Check a condition — even in a release build the condition is always evaluated so it can have side eff...
Definition madness_exception.h:182
#define MADNESS_EXCEPTION(msg, value)
Macro for throwing a MADNESS exception.
Definition madness_exception.h:119
Definition array_addons.h:50
Namespace for all elements and tools of MADNESS.
Definition DFParameters.h:10
void hash_range(hashT &seed, It first, It last)
Definition worldhash.h:280
static double cpu_time()
Returns the cpu time in seconds relative to an arbitrary origin.
Definition timers.h:127
void hash_combine(hashT &seed, const T &v)
Combine hash values.
Definition worldhash.h:260
static class madness::twoscale_cache_class cache[kmax+1]
void print(const T &t, const Ts &... ts)
Print items to std::cout (items separated by spaces) and terminate with a new line.
Definition print.h:226
double wall_time()
Returns the wall time in seconds relative to an arbitrary origin.
Definition timers.cc:48
std::string type(const PairType &n)
Definition PNOParameters.h:18
std::string name(const FuncType &type, const int ex=-1)
Definition ccpairfunction.h:28
madness::hashT hash_value(const std::array< T, N > &a)
Hash std::array with madness hash.
Definition array_addons.h:78
Definition hatom_sf_dirac.cc:91
Definition test_ccpairfunction.cc:22
std::atomic< long > & rtime
Definition cloud.h:531
World & world
Definition cloud.h:529
double wall0
Definition cloud.h:530
~cloudtimer()
Definition cloud.h:535
cloudtimer(World &world, std::atomic< long > &readtime)
Definition cloud.h:533
static keyT compute_record(const std::vector< T > &arg)
Definition cloud.h:125
keyT pop_front_and_return()
Definition cloud.h:84
static keyT compute_record(const Function< T, NDIM > &arg)
Definition cloud.h:110
Recordlist(const Recordlist &other)
Definition cloud.h:72
Recordlist(const keyT &key)
Definition cloud.h:70
static keyT compute_record(const std::shared_ptr< T > &arg)
Definition cloud.h:131
static keyT compute_record(const T &arg)
Definition cloud.h:134
std::size_t size() const
Definition cloud.h:90
madness::meta::is_detected< member_id_t, T > has_member_id
Definition cloud.h:100
decltype(std::declval< T >().id()) member_id_t
Definition cloud.h:97
friend std::ostream & operator<<(std::ostream &os, const Recordlist &arg)
Definition cloud.h:148
Recordlist & operator+=(const Recordlist &list2)
Definition cloud.h:74
static keyT compute_record(const WorldContainer< keyQ, valueT > &arg)
Definition cloud.h:116
decltype(std::declval< T >().hash()) member_hash_t
Definition cloud.h:104
static keyT compute_record(const std::shared_ptr< WorldContainer< keyQ, valueT > > &arg)
Definition cloud.h:119
std::list< keyT > list
Definition cloud.h:66
Recordlist & operator+=(const keyT &key)
Definition cloud.h:79
static keyT compute_record(const FunctionImpl< T, NDIM > *arg)
Definition cloud.h:113
static keyT compute_record(const std::shared_ptr< madness::FunctionImpl< T, NDIM > > &arg)
Definition cloud.h:122
static keyT compute_record(const Tensor< T > &arg)
Definition cloud.h:128
madness::meta::is_detected< member_hash_t, T > has_member_hash
Definition cloud.h:107
Recordlist()
Definition cloud.h:68
class to temporarily redirect output to cout
Definition print.h:277
static const char * value()
Definition cloud.h:39
static const char * value()
Definition cloud.h:41
static const char * value()
Definition cloud.h:43
static const char * value()
Definition cloud.h:45
static const char * value()
Definition cloud.h:47
static const char * value()
Definition cloud.h:49
static const char * value()
Definition cloud.h:52
static const char * value()
Definition cloud.h:54
static const char * value()
Definition cloud.h:56
static const char * value()
Definition cloud.h:58
static const char * value()
Definition cloud.h:60
static const char * value()
Definition cloud.h:62
A utility to get the name of a type as a string from chatGPT.
Definition cloud.h:34
static const char * value()
Definition cloud.h:35
#define MPI_BYTE
Definition stubmpi.h:77
double source(const coordT &r)
Definition testperiodic.cc:48
int ProcessID
Used to clearly identify process number/rank.
Definition worldtypes.h:43
FLOAT target(const FLOAT &x)
Definition y.cc:295