Test-scalarSpeed.C
Go to the documentation of this file.
1 #include "primitiveFields.H"
2 #include "Random.H"
3 #include "cpuTime.H"
4 #include "IOstreams.H"
5 #include "OFstream.H"
6 
7 using namespace Foam;
8 
9 int main()
10 {
11  Info<< "Initialising fields" << endl;
12 
13  const label nIter = 100;
14  const label size = 10000000;
15  const label rndAddrSkip = 40;
16  const label redFac = 6;
17  const label redSize = size/redFac;
18  Random genAddr(100);
19 
20  double* f1 = new double[size];
21  double* f2 = new double[size];
22  double* f3 = new double[size];
23  double* f4 = new double[size];
24  double* fr = new double[redSize];
25  label* addr = new label[size];
26  label* redAddr = new label[size];
27  label* redAddr2 = new label[size];
28 
29  for (label i=0; i<size; i++)
30  {
31  f1[i] = 1.0;
32  f2[i] = 1.0;
33  f3[i] = 1.0;
34  addr[i] = i;
35  redAddr[i] = i/redFac;
36  redAddr2[i] = (size - i - 1)/redFac;
37  }
38 
39  for (label i=0; i<size; i+=rndAddrSkip)
40  {
41  addr[i] = genAddr.integer(0, size-1);
42  }
43 
44  for (label i=0; i<redSize; i++)
45  {
46  fr[i] = 1.0;
47  }
48 
49  Info<< "Done\n" <<endl;
50 
51  {
52  Info<< "Single loop combined operation (expression templates)"
53  << endl;
54 
55  cpuTime executionTime;
56 
57  for (int j=0; j<nIter; j++)
58  {
59  for (label i=0; i<size; i++)
60  {
61  f4[i] = f1[i] + f2[i] - f3[i];
62  }
63  }
64 
65  Info<< "ExecutionTime = "
66  << executionTime.elapsedCpuTime()
67  << " s\n" << endl;
68 
69  Snull<< f4[1] << endl << endl;
70  }
71 
72  {
73  Info<< "Single loop combined operation with indirect addressing"
74  << endl;
75 
76  cpuTime executionTime;
77 
78  for (int j=0; j<nIter; j++)
79  {
80  for (label i=0; i<size; i++)
81  {
82  f4[addr[i]] = f1[addr[i]] + f2[addr[i]] - f3[addr[i]];
83  }
84  }
85 
86  Info<< "ExecutionTime = "
87  << executionTime.elapsedCpuTime()
88  << " s\n" << endl;
89 
90  Snull<< f4[1] << endl << endl;
91  }
92 
93  {
94  Info<< "Single loop reduction operation"
95  << endl;
96 
97  cpuTime executionTime;
98  label redOffset = (size - 1)/redFac;
99 
100  for (int j=0; j<nIter; j++)
101  {
102  for (label i=0; i<size; i++)
103  {
104  label j = i/redFac;
105  fr[j] += f1[i];
106  fr[redOffset - j] -= f2[i];
107  }
108  }
109 
110  Info<< "ExecutionTime = "
111  << executionTime.elapsedCpuTime()
112  << " s\n" << endl;
113 
114  Snull<< fr[1] << endl << endl;
115  }
116 
117  {
118  Info<< "Single loop reduction operation with indirect addressing"
119  << endl;
120 
121  cpuTime executionTime;
122 
123  for (int j=0; j<nIter; j++)
124  {
125  for (label i=0; i<size; i++)
126  {
127  fr[redAddr[i]] += f1[i];
128  fr[redAddr2[i]] -= f2[i];
129  }
130  }
131 
132  Info<< "ExecutionTime = "
133  << executionTime.elapsedCpuTime()
134  << " s\n" << endl;
135 
136  Snull<< fr[1] << endl << endl;
137  }
138 
139  {
140  Info<< "Separate loops ?= operations" << endl;
141 
142  cpuTime executionTime;
143 
144  for (int j=0; j<nIter; j++)
145  {
146  for (label i=0; i<size; i++)
147  {
148  f4[i] = f1[i];
149  }
150  for (label i=0; i<size; i++)
151  {
152  f4[i] += f2[i];
153  }
154  for (label i=0; i<size; i++)
155  {
156  f4[i] -= f3[i];
157  }
158  }
159 
160  Info<< "ExecutionTime = "
161  << executionTime.elapsedCpuTime()
162  << " s\n" << endl;
163 
164  Snull<< f4[1] << endl << endl;
165  }
166 
167  {
168  Info<< "OpenFOAM field algebra" << endl;
169 
171  sf1(size, 1.0),
172  sf2(size, 1.0),
173  sf3(size, 1.0),
174  sf4(size);
175 
176  cpuTime executionTime;
177 
178  for (int j=0; j<nIter; j++)
179  {
180  //sf4 = sf1 + sf2 - sf3;
181  sf4 = sf1;
182  sf4 += sf2;
183  sf4 -= sf3;
184  }
185 
186  Info<< "ExecutionTime = "
187  << executionTime.elapsedCpuTime()
188  << " s\n" << endl;
189 
190  Snull<< sf4[1] << endl << endl;
191  }
192 }
Foam::cpuTime
Starts timing CPU usage and return elapsed time from start.
Definition: cpuTime.H:52
Foam::Random
Simple random number generator.
Definition: Random.H:49
IOstreams.H
Useful combination of include files which define Sin, Sout and Serr and the use of IO streams general...
Foam::Snull
OFstream Snull
Global predefined null output stream "/dev/null".
Foam::endl
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:251
primitiveFields.H
Specialisations of Field<T> for scalar, vector and tensor.
OFstream.H
Foam::label
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
Definition: label.H:59
Foam::Field
Pre-declare SubField and related Field type.
Definition: Field.H:57
Foam::Info
messageStream Info
f1
scalar f1
Definition: createFields.H:28
Foam::cpuTime::elapsedCpuTime
double elapsedCpuTime() const
Return CPU time (in seconds) from the start.
Definition: cpuTime.C:67
main
int main()
Definition: Test-scalarSpeed.C:9
Foam
Namespace for OpenFOAM.
Definition: combustionModel.C:30
cpuTime.H
Random.H
Foam::Random::integer
label integer(const label lower, const label upper)
Label [lower..upper].
Definition: Random.C:118