Line |
Branch |
Exec |
Source |
1 |
|
|
/*************************************** |
2 |
|
|
Auteur : Pierre Aubert |
3 |
|
|
Mail : pierre.aubert@lapp.in2p3.fr |
4 |
|
|
Licence : CeCILL-C |
5 |
|
|
****************************************/ |
6 |
|
|
|
7 |
|
|
#ifndef __MICRO_BENCHMARK_RDTSC_IMPL_H__ |
8 |
|
|
#define __MICRO_BENCHMARK_RDTSC_IMPL_H__ |
9 |
|
|
|
10 |
|
|
#include "phoenix_timer.h" |
11 |
|
|
#include "micro_benchmark_rdtsc.h" |
12 |
|
|
|
13 |
|
|
///Do the micro benchmarking of a given function and gives performance results in cy |
14 |
|
|
/** @param[out] ellapsedTimeCy : ellapsed time in cy |
15 |
|
|
* @param[out] ellapsedTimeErrorCy : error on the ellapsed time in cy |
16 |
|
|
* @param nbTestPerf : number of performance test |
17 |
|
|
* @param nbCallPerTest : number of calls per performance test |
18 |
|
|
* @param __f : function to be called and benchmarked |
19 |
|
|
* @param __args : parameter of the function to be benchmarked |
20 |
|
|
*/ |
21 |
|
|
template<typename _Callable, typename... _Args> |
22 |
|
✗ |
void micro_benchmarkRdtsc(double & ellapsedTimeCy, double & ellapsedTimeErrorCy, size_t nbTestPerf, size_t nbCallPerTest, |
23 |
|
|
_Callable&& __f, _Args&&... __args) |
24 |
|
|
{ |
25 |
|
✗ |
VecEllapsedTime vecTimeCy; |
26 |
|
✗ |
for(size_t i(0lu); i < nbTestPerf; ++i){ |
27 |
|
|
//Stating the timer |
28 |
|
✗ |
size_t beginTime = phoenix_rdtsc(); |
29 |
|
✗ |
for(size_t j(0lu); j < nbCallPerTest; ++j){ |
30 |
|
✗ |
__f(__args...); |
31 |
|
|
} |
32 |
|
|
//Get the time of the nbCallPerTest calls |
33 |
|
✗ |
size_t elapsedTime(phoenix_rdtsc() - beginTime); |
34 |
|
✗ |
double fullCy(elapsedTime/((double)nbCallPerTest)); |
35 |
|
✗ |
vecTimeCy.push_back(fullCy); |
36 |
|
|
} |
37 |
|
✗ |
MapOrderedTime mapOrderTime; |
38 |
|
✗ |
micro_benchmarkVecToMap(mapOrderTime, vecTimeCy); |
39 |
|
✗ |
size_t nbValueUsed(vecTimeCy.size()*0.7 + 1lu); |
40 |
|
✗ |
if(nbValueUsed > vecTimeCy.size()){ |
41 |
|
✗ |
nbValueUsed = vecTimeCy.size(); |
42 |
|
|
} |
43 |
|
✗ |
micro_benchmarkComputeTime(ellapsedTimeCy, ellapsedTimeErrorCy, mapOrderTime, nbValueUsed); |
44 |
|
|
} |
45 |
|
|
|
46 |
|
|
///Do the micro benchmarking of a given function and gives performance results in cy |
47 |
|
|
/** @param[out] ellapsedTimeCy : ellapsed time in cy |
48 |
|
|
* @param[out] ellapsedTimeErrorCy : error on the ellapsed time in cy |
49 |
|
|
* @param[out] timePerElement : time per element in cy |
50 |
|
|
* @param[out] timeErrorPerElement : error of time per element in cy |
51 |
|
|
* @param nbTestPerf : number of performance test |
52 |
|
|
* @param nbCallPerTest : number of calls per performance test |
53 |
|
|
* @param nbElement : number of element treated by the function __f |
54 |
|
|
* @param __f : function to be called and benchmarked |
55 |
|
|
* @param __args : parameter of the function to be benchmarked |
56 |
|
|
*/ |
57 |
|
|
template<typename _Callable, typename... _Args> |
58 |
|
✗ |
void micro_benchmarkRdtsc(double & ellapsedTimeCy, double & ellapsedTimeErrorCy, |
59 |
|
|
double & timePerElement, double & timeErrorPerElement, size_t nbTestPerf, size_t nbCallPerTest, size_t nbElement, |
60 |
|
|
_Callable&& __f, _Args&&... __args) |
61 |
|
|
{ |
62 |
|
✗ |
micro_benchmarkRdtsc(ellapsedTimeCy, ellapsedTimeErrorCy, nbTestPerf, nbCallPerTest, __f, __args...); |
63 |
|
✗ |
timePerElement = ellapsedTimeCy/((double)nbElement); |
64 |
|
✗ |
timeErrorPerElement = ellapsedTimeErrorCy/((double)nbElement); |
65 |
|
|
} |
66 |
|
|
|
67 |
|
|
///Do the micro benchmarking of a given function and gives performance results in cy and print the result |
68 |
|
|
/** @param testName : name of the performance test |
69 |
|
|
* @param nbTestPerf : number of performance test |
70 |
|
|
* @param nbCallPerTest : number of calls per performance test |
71 |
|
|
* @param nbElement : number of element treated by the function __f |
72 |
|
|
* @param __f : function to be called and benchmarked |
73 |
|
|
* @param __args : parameter of the function to be benchmarked |
74 |
|
|
*/ |
75 |
|
|
template<typename _Callable, typename... _Args> |
76 |
|
✗ |
void micro_benchmarkRdtscPrint(const std::string & testName, size_t nbTestPerf, size_t nbCallPerTest, size_t nbElement, _Callable&& __f, _Args&&... __args){ |
77 |
|
✗ |
double ellapsedTimeCy(0.0), ellapsedTimeErrorCy(0.0), timePerElement(0.0), timeErrorPerElement(0.0); |
78 |
|
✗ |
micro_benchmarkRdtsc(ellapsedTimeCy, ellapsedTimeErrorCy, timePerElement, timeErrorPerElement, nbTestPerf, nbCallPerTest, nbElement, __f, __args...); |
79 |
|
|
|
80 |
|
✗ |
std::cout << testName << " : nbElement = "<<nbElement<<", timePerElement = " << timePerElement << " cy/el ± "<<timeErrorPerElement<<", elapsedTime = " << ellapsedTimeCy << " cy ± "<<ellapsedTimeErrorCy << std::endl; |
81 |
|
✗ |
std::cerr << nbElement << "\t" << timePerElement << "\t" << ellapsedTimeCy << "\t" << timeErrorPerElement << "\t" << ellapsedTimeErrorCy << std::endl; |
82 |
|
|
} |
83 |
|
|
|
84 |
|
|
|
85 |
|
|
#endif |
86 |
|
|
|