NeoPZ
benchfad.cc
Go to the documentation of this file.
1 // Emacs will be in -*- Mode: c++ -*-
2 //
3 // ********** DO NOT REMOVE THIS BANNER **********
4 //
5 // Nicolas Di Cesare <Nicolas.Dicesare@ann.jussieu.fr>
6 // http://www.ann.jussieu.fr/~dicesare
7 //
8 // Big benchmark of TinyFad with and without
9 // exression template(ET)
10 //
11 //********************************************************
12 //
13 // KCC 3.3f (kai C++) and egcs 1.1.2 (cygnus)
14 // are OK.
15 // Memory Requirement :
16 // - 108 Mo with egcs
17 // (-Wall -O6 -mcpu=i686 -march=i686 -fstrict-aliasing)
18 // - 83 Mo with KCC
19 // (-w +K3 -O3)
20 //
21 //********************************************************
22 
23 // ANSI C++ include
24 #include <iostream>
25 #include <iomanip>
26 
27 // Include for time computation
28 #include <utils/timer.h>
29 
30 // Fad includes
31 #include <TinyFadET/tfad.h>
32 #include <TinyFad/tinyfad.h>
33 
34 using namespace std;
35 
36 template <int Num> void Bench_1_Op(const TinyFad<Num> & x, const int nloop);
37 
38 template <int Num> void Bench_2_Op(const TinyFad<Num> & x, const int nloop);
39 
40 template <int Num> void Bench_3_Op(const TinyFad<Num> & x, const int nloop);
41 
42 template <int Num> void Bench_4_Op(const TinyFad<Num> & x, const int nloop);
43 
44 template <int Num> void Bench_10_Op(const TinyFad<Num> & x, const int nloop);
45 
46 template <int Num> void Bench_20_Op(const TinyFad<Num> & x, const int nloop);
47 
48 
49 int main() {
50 
51  int nloop = 1000000;//100
52  TinyFad<1> un; TinyFad<2> deux; TinyFad<3> trois;
53  TinyFad<4> quatre; TinyFad<5> cinq; TinyFad<6> six;
54  TinyFad<7> sept; TinyFad<8> huit; TinyFad<9> neuf;TinyFad<10> dix;
55  TinyFad<11> onze; TinyFad<12> douze; TinyFad<13> treize;
56  TinyFad<14> quatorze; TinyFad<15> quinze; TinyFad<16> seize;
57  TinyFad<17> dixsept; TinyFad<18> dixhuit; TinyFad<19> dixneuf;TinyFad<20> vingt;
58 
59  cout << "Clean Cache" << endl;
60  Bench_4_Op(neuf,nloop);
61 
62  cout << "_Size_____TFad______TinyFad_______Hand_______Member___\n" ;
63 
64 // Bench_1_Op(un,nloop);
65 // Bench_1_Op(deux,nloop);
66 // Bench_1_Op(trois,nloop);
67 // Bench_1_Op(quatre,nloop);
68 // Bench_1_Op(cinq,nloop);
69 // Bench_1_Op(six,nloop);
70 // Bench_1_Op(sept,nloop);
71 // Bench_1_Op(huit,nloop);
72 // Bench_1_Op(neuf,nloop);
73 // Bench_1_Op(dix,nloop);
74 
75 // Bench_2_Op(un,nloop);
76 // Bench_2_Op(deux,nloop);
77 // Bench_2_Op(trois,nloop);
78 // Bench_2_Op(quatre,nloop);
79 // Bench_2_Op(cinq,nloop);
80 // Bench_2_Op(six,nloop);
81 // Bench_2_Op(sept,nloop);
82 // Bench_2_Op(huit,nloop);
83 // Bench_2_Op(neuf,nloop);
84 // Bench_2_Op(dix,nloop);
85 
86 // Bench_3_Op(un,nloop);
87 // Bench_3_Op(deux,nloop);
88 // Bench_3_Op(trois,nloop);
89 // Bench_3_Op(quatre,nloop);
90 // Bench_3_Op(cinq,nloop);
91 // Bench_3_Op(six,nloop);
92 // Bench_3_Op(sept,nloop);
93 // Bench_3_Op(huit,nloop);
94 // Bench_3_Op(neuf,nloop);
95 // Bench_3_Op(dix,nloop);
96 
97  Bench_4_Op(un,nloop);
98  Bench_4_Op(deux,nloop);
99  Bench_4_Op(trois,nloop);
100  Bench_4_Op(quatre,nloop);
101  Bench_4_Op(cinq,nloop);
102  Bench_4_Op(six,nloop);
103  Bench_4_Op(sept,nloop);
104  Bench_4_Op(huit,nloop);
105  Bench_4_Op(neuf,nloop);
106  Bench_4_Op(dix,nloop);
107  Bench_4_Op(onze,nloop);
108  Bench_4_Op(douze,nloop);
109  Bench_4_Op(treize,nloop);
110  Bench_4_Op(quatorze,nloop);
111  Bench_4_Op(quinze,nloop);
112  Bench_4_Op(seize,nloop);
113  Bench_4_Op(dixsept,nloop);
114  Bench_4_Op(dixhuit,nloop);
115  Bench_4_Op(dixneuf,nloop);
116  Bench_4_Op(vingt,nloop);
117 
118  Bench_10_Op(un,nloop);
119  Bench_10_Op(deux,nloop);
120  Bench_10_Op(trois,nloop);
121  Bench_10_Op(quatre,nloop);
122  Bench_10_Op(cinq,nloop);
123  Bench_10_Op(six,nloop);
124  Bench_10_Op(sept,nloop);
125  Bench_10_Op(huit,nloop);
126  Bench_10_Op(neuf,nloop);
127  Bench_10_Op(dix,nloop);
128  Bench_10_Op(onze,nloop);
129  Bench_10_Op(douze,nloop);
130  Bench_10_Op(treize,nloop);
131  Bench_10_Op(quatorze,nloop);
132  Bench_10_Op(quinze,nloop);
133  Bench_10_Op(seize,nloop);
134  Bench_10_Op(dixsept,nloop);
135  Bench_10_Op(dixhuit,nloop);
136  Bench_10_Op(dixneuf,nloop);
137  Bench_10_Op(vingt,nloop);
138 
139  Bench_20_Op(un,nloop);
140  Bench_20_Op(deux,nloop);
141  Bench_20_Op(trois,nloop);
142  Bench_20_Op(quatre,nloop);
143  Bench_20_Op(cinq,nloop);
144  Bench_20_Op(six,nloop);
145  Bench_20_Op(sept,nloop);
146  Bench_20_Op(huit,nloop);
147  Bench_20_Op(neuf,nloop);
148  Bench_20_Op(dix,nloop);
149  Bench_20_Op(onze,nloop);
150  Bench_20_Op(douze,nloop);
151  Bench_20_Op(treize,nloop);
152  Bench_20_Op(quatorze,nloop);
153  Bench_20_Op(quinze,nloop);
154  Bench_20_Op(seize,nloop);
155  Bench_20_Op(dixsept,nloop);
156  Bench_20_Op(dixhuit,nloop);
157  Bench_20_Op(dixneuf,nloop);
158  Bench_20_Op(vingt,nloop);
159 
160 
161  return 0;
162 }
163 
164 
165 template <int Num> void Bench_1_Op(const TinyFad<Num> & x, const int nloop){
166  int i,j,k;
167  const int ntest = 3;
168 
169  cout.setf(ios::fixed,ios::floatfield);
170  cout.width(4);
171  cout << Num;
172  cout.flush();
173 
174  float time1 = 0., time2 = 0., time3 = 0., time4 = 0.;
175 
176 
177  for (j=0; j<ntest; j++){
178 
179  TFad< Num > x1(2.f,0), x2(3.f), x4;
180 
181  Timer mytime;
182  mytime.start();
183 
184  for (i=0; i<nloop; ++i)
185  x4 = x1 + x2;
186 
187  mytime.stop();
188  time1 += mytime.elapsedSeconds();
189  //cout << "TFad : " << mytime.elapsedSeconds();// << endl;
190 
191 
192  TinyFad< Num > y1(2.,0), y2((float)3.), y4;
193 
194  mytime.start();
195 
196  for (i=0; i<nloop; ++i)
197  y4 = y1 + y2;
198 
199  mytime.stop();
200  time2 += mytime.elapsedSeconds();
201  //cout << " , TinyFad : " << mytime.elapsedSeconds();// << endl;
202 
203 
204  float z1=2., z2=3., z4;
205  float tz1[Num], tz2[Num], tz4[Num];
206 
207  mytime.start();
208 
209  for (i=0; i<nloop; ++i) {
210  z4 = z1 + z2;
211  for (k=0; k<Num; ++k)
212  tz4[k] = tz1[k]+tz2[k];
213  }
214 
215  mytime.stop();
216  time3 += mytime.elapsedSeconds();
217  //cout << " , float : " << mytime.elapsedSeconds();// << endl;
218 
219  mytime.start();
220 
221  for (i=0; i<nloop; ++i) {
222  y4.val() = y1.val() + y2.val();
223  for (k=0; k<Num; ++k)
224  y4.dx(k) = y1.dx(k) + y2.dx(k);
225  }
226 
227  mytime.stop();
228  time4 += mytime.elapsedSeconds();
229  //cout << " , Acess Members : " << mytime.elapsedSeconds() << endl;
230 
231 
232  }
233 
234  cout.width(12);
235  cout << (time4 / time3);
236  cout.width(12);
237  cout << (time1 / time3) ;
238  cout.width(12);
239  cout << (time2 / time3) << "\n";
240 
241 }
242 
243 
244 template <int Num> void Bench_2_Op(const TinyFad<Num> & x, const int nloop){
245  int i,j,k;
246  const int ntest = 3;
247 
248  cout.setf(ios::fixed,ios::floatfield);
249  cout.width(4);
250  cout << Num;
251  cout.flush();
252 
253  float time1 = 0., time2 = 0., time3 = 0., time4 = 0.;
254 
255 
256  TFad< Num > x1(2.,0), x2(3.), x3(5.), x4, x5(3.);
257 
258  for (j=0; j<ntest; j++){
259 
260  Timer mytime;
261  mytime.start();
262 
263  for (i=0; i<nloop; ++i)
264  x4 = x1+x2+x3;
265 
266  mytime.stop();
267  time1 += mytime.elapsedSeconds();
268  //cout << "TFad : " << mytime.elapsedSeconds();// << endl;
269 
270 
271  TinyFad< Num > y1(2.,0), y2((float)3.), y3((float)5.), y4, y5((float)3.);
272 
273  mytime.start();
274 
275  for (i=0; i<nloop; ++i)
276  y4 = y1+y2+y3;
277 
278  mytime.stop();
279  time2 += mytime.elapsedSeconds();
280  //cout << " , TinyFad : " << mytime.elapsedSeconds();// << endl;
281 
282 
283  float z1=2., z2=3., z3=5., z4, z5=3.;
284  float tz1[Num], tz2[Num], tz3[Num], tz4[Num], tz5[Num];
285 
286  mytime.start();
287 
288  for (i=0; i<nloop; ++i) {
289  z4 = z1+z2+z3;
290  for (k=0; k<Num; ++k)
291  tz4[k] = tz1[k]+tz2[k]+tz3[k];
292  }
293 
294  mytime.stop();
295  time3 += mytime.elapsedSeconds();
296  //cout << " , float : " << mytime.elapsedSeconds();// << endl;
297 
298  mytime.start();
299 
300  for (i=0; i<nloop; ++i) {
301  y4.val() = y1.val()+y2.val()+y3.val();
302  for (k=0; k<Num; ++k)
303  y4.dx(k) = y1.dx(k)+y2.dx(k)+y3.dx(k);
304  }
305 
306  mytime.stop();
307  time4 += mytime.elapsedSeconds();
308  //cout << " , Acess Members : " << mytime.elapsedSeconds() << endl;
309 
310 
311  }
312 
313  cout.width(12);
314  cout << (time4 / time3);
315  cout.width(12);
316  cout << (time1 / time3) ;
317  cout.width(12);
318  cout << (time2 / time3) << "\n";
319 
320 }
321 
322 
323 template <int Num> void Bench_3_Op(const TinyFad<Num> & x, const int nloop){
324  int i,j,k;
325  const int ntest = 3;
326 
327  cout.setf(ios::fixed,ios::floatfield);
328  cout.width(4);
329  cout << Num;
330  cout.flush();
331 
332  float time1 = 0., time2 = 0., time3 = 0., time4 = 0.;
333 
334 
335  TFad<Num > x1(2.,0), x2(3.), x3(5.), x4, x5(3.);
336 
337  for (j=0; j<ntest; j++){
338 
339  Timer mytime;
340  mytime.start();
341 
342  for (i=0; i<nloop; ++i)
343  x4 = x1+x2+x3+x3;
344 
345  mytime.stop();
346  time1 += mytime.elapsedSeconds();
347  //cout << "TFad : " << mytime.elapsedSeconds();// << endl;
348 
349 
350  TinyFad< Num > y1(2.,0), y2((float)3.), y3((float)5.), y4, y5((float)3.);
351 
352  mytime.start();
353 
354  for (i=0; i<nloop; ++i)
355  y4 = y1+y2+y3+y3;
356 
357  mytime.stop();
358  time2 += mytime.elapsedSeconds();
359  //cout << " , TinyFad : " << mytime.elapsedSeconds();// << endl;
360 
361 
362  float z1=2., z2=3., z3=5., z4, z5=3.;
363  float tz1[Num], tz2[Num], tz3[Num], tz4[Num], tz5[Num];
364 
365  mytime.start();
366 
367  for (i=0; i<nloop; ++i) {
368  z4 = z1+z2+z3+z3;
369  for (k=0; k<Num; ++k)
370  tz4[k] = tz1[k]+tz2[k]+tz3[k]+tz3[k];
371  }
372 
373  mytime.stop();
374  time3 += mytime.elapsedSeconds();
375  //cout << " , float : " << mytime.elapsedSeconds();// << endl;
376 
377  mytime.start();
378 
379  for (i=0; i<nloop; ++i) {
380  y4.val() = y1.val()+y2.val()+y3.val()+y3.val();
381  for (k=0; k<Num; ++k)
382  y4.dx(k) = y1.dx(k)+y2.dx(k)+y3.dx(k)+y3.dx(k);
383  }
384 
385  mytime.stop();
386  time4 += mytime.elapsedSeconds();
387  //cout << " , Acess Members : " << mytime.elapsedSeconds() << endl;
388 
389 
390  }
391 
392  cout.width(12);
393  cout << (time4 / time3);
394  cout.width(12);
395  cout << (time1 / time3) ;
396  cout.width(12);
397  cout << (time2 / time3) << "\n";
398 
399 }
400 
401 
402 template <int Num> void Bench_4_Op(const TinyFad<Num> & x, const int nloop){
403  int i,j,k;
404  const int ntest = 3;
405 
406  cout.setf(ios::fixed,ios::floatfield);
407  cout.width(4);
408  cout << Num;
409  cout.flush();
410 
411  float time1 = 0., time2 = 0., time3 = 0., time4 = 0.;
412 
413 
414  TFad< Num > x1(2.,0), x2(3.), x3(5.), x4, x5(3.);
415 
416  for (j=0; j<ntest; j++){
417 
418  Timer mytime;
419  mytime.start();
420 
421  for (i=0; i<nloop; ++i)
422  x4 = x1+x2+x3+x3+x5;
423 
424  mytime.stop();
425  time1 += mytime.elapsedSeconds();
426  // //cout << "TFad : " << mytime.elapsedSeconds();// << endl;
427 
428 
429  TinyFad< Num > y1(2.f,0), y2(3.f), y3(5.f), y4, y5(3.f);
430  mytime.start();
431 
432  for (i=0; i<nloop; ++i)
433  y4 = y1+y2+y3+y3+y5;
434 
435  mytime.stop();
436  time2 += mytime.elapsedSeconds();
437  //cout << " , TinyFad : " << mytime.elapsedSeconds();// << endl;
438 
439 
440  float z1=2., z2=3., z3=5., z4, z5=3.;
441  float tz1[Num], tz2[Num], tz3[Num], tz4[Num], tz5[Num];
442  mytime.start();
443 
444  for (i=0; i<nloop; ++i) {
445  z4 = z1+z2+z3+z3+z5;
446  for (k=0; k<Num; ++k)
447  tz4[k] = tz1[k]+tz2[k]+tz3[k]+tz3[k]+tz5[k];
448  }
449 
450  mytime.stop();
451  time3 += mytime.elapsedSeconds();
452  //cout << " , float : " << mytime.elapsedSeconds();// << endl;
453 
454 
455  mytime.start();
456 
457  for (i=0; i<nloop; ++i) {
458  y4.val() = y1.val()+y2.val()+y3.val()+y3.val()+y5.val();
459  for (k=0; k<Num; ++k)
460  y4.dx(k) = y1.dx(k)+y2.dx(k)+y3.dx(k)+y3.dx(k)+y5.dx(k);
461  }
462 
463  mytime.stop();
464  time4 += mytime.elapsedSeconds();
465  //cout << " , Acess Members : " << mytime.elapsedSeconds() << endl;
466 
467 
468  }
469 
470  cout << setw(12) << time1 << setw(12) << time2 << setw(12) << time3 << setw(12) << time4 << endl;
471 
472 }
473 
474 
475 template <int Num> void Bench_10_Op(const TinyFad<Num> & x, const int nloop){
476  int i,j,k;
477  const int ntest = 3;
478 
479  cout.setf(ios::fixed,ios::floatfield);
480  cout.width(4);
481  cout << Num;
482  cout.flush();
483 
484  float time1 = 0., time2 = 0., time3 = 0., time4 = 0.;
485 
486 
487  TFad< Num > x1(2.,0), x2(3.), x3(5.), x4, x5(3.);
488 
489  for (j=0; j<ntest; j++){
490 
491  Timer mytime;
492  mytime.start();
493 
494  for (i=0; i<nloop; ++i)
495  x4 = x1+x2+x3+x3+x5+x1+x2+x3+x3+x5;
496 
497  mytime.stop();
498  time1 += mytime.elapsedSeconds();
499  //cout << "TFad : " << mytime.elapsedSeconds();// << endl;
500 
501 
502  TinyFad< Num > y1(2.,0), y2((float)3.), y3((float)5.), y4, y5((float)3.);
503 
504  mytime.start();
505 
506  for (i=0; i<nloop; ++i)
507  y4 = y1+y2+y3+y3+y5+y1+y2+y3+y3+y5;
508 
509  mytime.stop();
510  time2 += mytime.elapsedSeconds();
511  //cout << " , TinyFad : " << mytime.elapsedSeconds();// << endl;
512 
513 
514  float z1=2., z2=3., z3=5., z4, z5=3.;
515  float tz1[Num], tz2[Num], tz3[Num], tz4[Num], tz5[Num];
516 
517  mytime.start();
518 
519  for (i=0; i<nloop; ++i) {
520  z4 = z1+z2+z3+z3+z5+z1+z2+z3+z3+z5;
521  for (k=0; k<Num; ++k)
522  tz4[k] = tz1[k]+tz2[k]+tz3[k]+tz3[k]+tz5[k]+tz1[k]+tz2[k]+tz3[k]+tz3[k]+tz5[k];
523  }
524 
525  mytime.stop();
526  time3 += mytime.elapsedSeconds();
527  //cout << " , float : " << mytime.elapsedSeconds();// << endl;
528 
529  mytime.start();
530 
531  for (i=0; i<nloop; ++i) {
532  y4.val() = y1.val()+y2.val()+y3.val()+y3.val()+y5.val()+y1.val()+y2.val()+y3.val()+y3.val()+y5.val();
533  for (k=0; k<Num; ++k)
534  y4.dx(k) = y1.dx(k)+y2.dx(k)+y3.dx(k)+y3.dx(k)+y5.dx(k)+y1.dx(k)+y2.dx(k)+y3.dx(k)+y3.dx(k)+y5.dx(k);
535  }
536 
537  mytime.stop();
538  time4 += mytime.elapsedSeconds();
539  //cout << " , Acess Members : " << mytime.elapsedSeconds() << endl;
540 
541 
542  }
543 
544  cout << setw(12) << time1 << setw(12) << time2 << setw(12) << time3 << setw(12) << time4 << endl;
545 
546 }
547 
548 template <int Num> void Bench_20_Op(const TinyFad<Num> & x, const int nloop){
549  int i,j,k;
550  const int ntest = 3;
551 
552  cout.setf(ios::fixed,ios::floatfield);
553  cout.width(4);
554  cout << Num;
555  cout.flush();
556 
557  float time1 = 0., time2 = 0., time3 = 0., time4 = 0.;
558 
559 
560  TFad< Num > x1(2.,0), x2(3.), x3(5.), x4, x5(3.);
561 
562  for (j=0; j<ntest; j++){
563 
564  Timer mytime;
565  mytime.start();
566 
567  for (i=0; i<nloop; ++i)
568  x4 = x1+x2+x3+x3+x5+x1+x2+x3+x3+x5+x1+x2+x3+x3+x5+x1+x2+x3+x3+x5;
569 
570  mytime.stop();
571  time1 += mytime.elapsedSeconds();
572  //cout << "TFad : " << mytime.elapsedSeconds();// << endl;
573 
574 
575  TinyFad< Num > y1(2.,0), y2((float)3.), y3((float)5.), y4, y5((float)3.);
576 
577  mytime.start();
578 
579  for (i=0; i<nloop; ++i)
580  y4 = y1+y2+y3+y3+y5+y1+y2+y3+y3+y5+y1+y2+y3+y3+y5+y1+y2+y3+y3+y5;
581 
582  mytime.stop();
583  time2 += mytime.elapsedSeconds();
584  //cout << " , TinyFad : " << mytime.elapsedSeconds();// << endl;
585 
586 
587  float z1=2., z2=3., z3=5., z4, z5=3.;
588  float tz1[Num], tz2[Num], tz3[Num], tz4[Num], tz5[Num];
589 
590  mytime.start();
591 
592  for (i=0; i<nloop; ++i) {
593  z4 = z1+z2+z3+z3+z5+z1+z2+z3+z3+z5+z1+z2+z3+z3+z5+z1+z2+z3+z3+z5;
594  for (k=0; k<Num; ++k)
595  tz4[k] = tz1[k]+tz2[k]+tz3[k]+tz3[k]+tz5[k]+tz1[k]+tz2[k]+tz3[k]+tz3[k]+tz5[k]+tz1[k]+tz2[k]+tz3[k]+tz3[k]+tz5[k]+tz1[k]+tz2[k]+tz3[k]+tz3[k]+tz5[k];
596  }
597 
598  mytime.stop();
599  time3 += mytime.elapsedSeconds();
600  //cout << " , float : " << mytime.elapsedSeconds();// << endl;
601 
602  mytime.start();
603 
604  for (i=0; i<nloop; ++i) {
605  y4.val() = y1.val()+y2.val()+y3.val()+y3.val()+y5.val()+y1.val()+y2.val()+y3.val()+y3.val()+y5.val()+y1.val()+y2.val()+y3.val()+y3.val()+y5.val()+y1.val()+y2.val()+y3.val()+y3.val()+y5.val();
606  for (k=0; k<Num; ++k)
607  y4.dx(k) = y1.dx(k)+y2.dx(k)+y3.dx(k)+y3.dx(k)+y5.dx(k)+y1.dx(k)+y2.dx(k)+y3.dx(k)+y3.dx(k)+y5.dx(k)+y1.dx(k)+y2.dx(k)+y3.dx(k)+y3.dx(k)+y5.dx(k)+y1.dx(k)+y2.dx(k)+y3.dx(k)+y3.dx(k)+y5.dx(k);
608  }
609 
610  mytime.stop();
611  time4 += mytime.elapsedSeconds();
612  //cout << " , Acess Members : " << mytime.elapsedSeconds() << endl;
613 
614 
615  }
616 
617  cout << setw(12) << time1 << setw(12) << time2 << setw(12) << time3 << setw(12) << time4 << endl;
618 
619 }
620 
Definition: timer.h:10
void stop()
Definition: timer.h:23
void start()
Definition: timer.h:17
double elapsedSeconds()
Definition: timer.h:29
void Bench_10_Op(const TinyFad< Num > &x, const int nloop)
Definition: benchfad.cc:475
int main()
Definition: benchfad.cc:49
void Bench_1_Op(const TinyFad< Num > &x, const int nloop)
Definition: benchfad.cc:165
const T & dx(int i) const
Definition: tinyfad.h:167
f
Definition: test.py:287
Definition: tfad.h:64
void Bench_20_Op(const TinyFad< Num > &x, const int nloop)
Definition: benchfad.cc:548
clarg::argInt nloop("-l", "Number of loop iterations of the Subst_Backward/Subst_Forward", 1)
void Bench_2_Op(const TinyFad< Num > &x, const int nloop)
Definition: benchfad.cc:244
void Bench_3_Op(const TinyFad< Num > &x, const int nloop)
Definition: benchfad.cc:323
void Bench_4_Op(const TinyFad< Num > &x, const int nloop)
Definition: benchfad.cc:402
const T & val() const
Definition: tinyfad.h:72