OpenWAM
TTimeControl.cpp
1 /*--------------------------------------------------------------------------------*\
2 ==========================|
3  \\ /\ /\ // O pen | OpenWAM: The Open Source 1D Gas-Dynamic Code
4  \\ | X | // W ave |
5  \\ \/_\/ // A ction | CMT-Motores Termicos / Universidad Politecnica Valencia
6  \\/ \// M odel |
7  ----------------------------------------------------------------------------------
8  License
9 
10  This file is part of OpenWAM.
11 
12  OpenWAM is free software: you can redistribute it and/or modify
13  it under the terms of the GNU General Public License as published by
14  the Free Software Foundation, either version 3 of the License, or
15  (at your option) any later version.
16 
17  OpenWAM is distributed in the hope that it will be useful,
18  but WITHOUT ANY WARRANTY; without even the implied warranty of
19  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20  GNU General Public License for more details.
21 
22  You should have received a copy of the GNU General Public License
23  along with OpenWAM. If not, see <http://www.gnu.org/licenses/>.
24 
25 
26  \*--------------------------------------------------------------------------------*/
27 
28 //---------------------------------------------------------------------------
29 #pragma hdrstop
30 
31 #include "TTimeControl.h"
32 
33 using namespace std;
34 
35 #ifdef __BORLANDC__
36 int RDTSC(void) {
37  int k = 0;
38  asm rdtsc;
39  asm mov k, eax;
40  return k;
41 }
42 
43 #elif _MSC_VER
44 int RDTSC(void) {
45  return 0;
46 }
47 
48 #else
49 extern "C" {
50  inline unsigned long long RDTSC(void) {
51  unsigned int a = 0, d = 0;
52  asm volatile(
53  "xorl %%eax, %%eax \n cpuid"
54  ::: "%rax", "%rbx", "%rcx", "%rdx");
55  asm volatile("rdtsc" : "=a"(a), "=d"(d));
56  return (unsigned long long) d << 32 | a;
57  }
58 }
59 #endif
60 
61 //---------------------------------------------------------------------------
62 
63 TTimeControl::TTimeControl() {
64  TiempoTotal = 0.;
65  TiempoCiclo0 = 0;
66  TiempoCiclo1 = 0;
67  Procesador = 2.2e9; //Hz
68  Pasos = 0;
69 }
70 
71 //---------------------------------------------------------------------------
72 //---------------------------------------------------------------------------
73 
74 TTimeControl::~TTimeControl() {
75 }
76 
77 //---------------------------------------------------------------------------
78 //---------------------------------------------------------------------------
79 
80 void TTimeControl::Ini() {
81  int k = 0;
82  k = RDTSC();
83 
84  Inicio = k;
85 }
86 
87 //---------------------------------------------------------------------------
88 //---------------------------------------------------------------------------
89 
90 void TTimeControl::Fin() {
91  int k = 0;
92  k = RDTSC();
93 
94  Final = k;
95  TiempoTotal += (double)(Final - Inicio) / Procesador;
96  Pasos++;
97 }
98 
99 //---------------------------------------------------------------------------
100 //---------------------------------------------------------------------------
101 
102 void TTimeControl::PromediaCiclo() {
103  TiempoCiclo0 = TiempoCiclo1;
104  TiempoCiclo1 = TiempoTotal;
105  printf("Tiempo total: %g seg.\n", TiempoTotal);
106  printf("Tiempo ultimo ciclo: %g seg.\n\n", TiempoCiclo1 - TiempoCiclo0);
107  printf("Pasos: %d\n", Pasos);
108  printf("Tiempo por Steps: %g\n", TiempoTotal / (double) Pasos);
109 }
110 #pragma package(smart_init)