QMCPACK
test_pooled_memory.cpp
Go to the documentation of this file.
1 /////////////////////////////////////////////////////////////////////////////////////
2 // This file is distributed under the University of Illinois/NCSA Open Source License.
3 // See LICENSE file in top directory for details.
4 //
5 // Copyright (c) 2017 Jeongnim Kim and QMCPACK developers.
6 //
7 // File developed by: Mark Dewing, markdewing@gmail.com, University of Illinois at Urbana-Champaign
8 //
9 // File created by: Mark Dewing, markdewing@gmail.com, University of Illinois at Urbana-Champaign
10 //////////////////////////////////////////////////////////////////////////////////////
11 
12 
13 #include "catch.hpp"
14 
15 #include "Pools/PooledMemory.h"
16 #include "Pools/PooledData.h"
17 #include "Utilities/Timer.h"
18 #include <iostream>
19 #include <stdio.h>
20 #include <string>
21 #include <vector>
22 #include <random>
23 #include <complex>
24 
25 
26 //#define CHECK_ALLOCATION_PERF
27 
28 using std::complex;
29 using std::string;
30 using std::vector;
31 namespace qmcplusplus
32 {
33 TEST_CASE("pack scalar", "[utilities]")
34 {
36  int i0 = 1;
37  long i1 = (1L << 30) + (1L << 29);
38  float i2 = 0.33;
39  double i3 = 0.23;
40  complex<float> i4(0.23, 0.33);
41  complex<double> i5(0.33, 0.23);
42  std::vector<complex<double>> i6_dummy(3);
43  std::vector<complex<double>> i6(3);
44  i6[0] = complex<double>(0.23, 0.33);
45  i6[1] = complex<double>(0.33, 0.23);
46  i6[2] = complex<double>(0.56, 0.65);
47 
48  p.add(i0);
49  p.add(i1);
50  p.add(i2);
51  p.add(i3);
52  p.add(i4);
53  p.add(i5);
54  p.add(i6_dummy.data(), i6_dummy.data() + i6_dummy.size());
55  p.add(i6.data(), i6.data() + i6.size());
56 
57  p.allocate();
58  p.rewind();
59 
60  p << i0;
61  p << i1;
62  p << i2;
63  p << i3;
64  p << i4;
65  p << i5;
66  p.put(i6_dummy.data(), i6_dummy.data() + i6_dummy.size());
67  p.put(i6.data(), i6.data() + i6.size());
68 
69  p.rewind();
70  int j0 = i0;
71  i0 = 0;
72  long j1 = i1;
73  i1 = 0;
74  float j2 = i2;
75  i2 = 0;
76  double j3 = i3;
77  i3 = 0;
78  complex<float> j4 = i4;
79  i4 = 0;
80  complex<double> j5 = i5;
81  i5 = 0;
82  std::vector<complex<double>> j6(i6);
83  i6[0] = 0;
84  i6[1] = 0;
85  i6[2] = 0;
86  p >> i0;
87  p >> i1;
88  p >> i2;
89  p >> i3;
90  p >> i4;
91  p >> i5;
92 
93  p.get(i6_dummy.data(), i6_dummy.data() + i6_dummy.size());
94  bool not_aligned = (((size_t)p.data()) + p.current()) & (QMC_SIMD_ALIGNMENT - 1);
95  REQUIRE(!not_aligned);
96 
97  p.get(i6.data(), i6.data() + i6.size());
98 
99  REQUIRE(i0 == j0);
100  REQUIRE(i1 == j1);
101  REQUIRE(i2 == j2);
102  REQUIRE(i3 == j3);
103  REQUIRE(i4 == j4);
104  REQUIRE(i5 == j5);
105  REQUIRE(i6[0] == i6[0]);
106  REQUIRE(i6[1] == i6[1]);
107  REQUIRE(i6[2] == i6[2]);
108 
109 #ifdef CHECK_ALLOCATION_PERF
110  // up to 512 MB.
111  for (size_t size_scale = 15; size_scale < 30; size_scale++)
112  {
113  const size_t size = (1 << size_scale) + 17 * 8;
114  {
115  PooledMemory<double> pm_walker;
116  pm_walker.Current = size;
117  Timer PoolTimer;
118  pm_walker.allocate();
119  std::cout << "PooledMemory Allocate " << pm_walker.byteSize() << " bytes Time " << PoolTimer.elapsed()
120  << std::endl;
121  PoolTimer.restart();
122  PooledMemory<double> pm_walker_copy(pm_walker);
123  std::cout << "PooledMemory Copy Time " << PoolTimer.elapsed() << std::endl;
124  }
125 
126  {
127  PooledData<double> pd_walker;
128  Timer PoolTimer;
129  pd_walker.resize(size / 8);
130  std::cout << "PooledData Allocate " << pd_walker.byteSize() << " bytes Time " << PoolTimer.elapsed() << std::endl;
131  PoolTimer.restart();
132  PooledData<double> pd_walker_copy(pd_walker);
133  std::cout << "PooledData Copy Time " << PoolTimer.elapsed() << std::endl;
134  }
135 
136  std::cout << std::endl;
137  }
138 #endif
139 }
140 
141 } // namespace qmcplusplus
double elapsed() const
Definition: Timer.h:30
void restart()
Definition: Timer.h:29
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
TEST_CASE("complex_helper", "[type_traits]")
void allocate()
allocate the data
Definition: PooledMemory.h:104
Timer class.
REQUIRE(std::filesystem::exists(filename))
T * data()
return the address of the first element
Definition: PooledMemory.h:187
size_type byteSize() const
return the size of the data
Definition: PooledMemory.h:70
void resize(size_type n, T val=T())
resize
Definition: PooledData.h:77
size_type byteSize() const
return the size of the data
Definition: PooledData.h:45
size_type current() const
Definition: PooledMemory.h:76
void rewind(size_type cur=0, size_type cur_scalar=0)
set the cursors
Definition: PooledMemory.h:85
void put(std::complex< T1 > &x)
Definition: PooledMemory.h:165
Define a serialized buffer to store anonymous data.
void add(std::complex< T1 > &x)
Definition: PooledMemory.h:113
void get(std::complex< T1 > &x)
Definition: PooledMemory.h:132