1 //=====================================================
2 // File   :  mean.cxx
3 // Author :  L. Plagne <laurent.plagne@edf.fr)>
4 // Copyright (C) EDF R&D,  lun sep 30 14:23:15 CEST 2002
5 //=====================================================
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License
9 // as published by the Free Software Foundation; either version 2
10 // of the License, or (at your option) any later version.
11 //
12 // This program is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19 //
20 #include "utilities.h"
21 #include <vector>
22 #include <string>
23 #include <iostream>
24 #include <fstream>
25 #include "bench_parameter.hh"
26 #include "utils/xy_file.hh"
27 #include <set>
28 
29 using namespace std;
30 
31 double mean_calc(const vector<int> & tab_sizes, const vector<double> & tab_mflops, const int size_min, const int size_max);
32 
33 class Lib_Mean{
34 
35 public:
Lib_Mean(void)36   Lib_Mean( void ):_lib_name(),_mean_in_cache(),_mean_out_of_cache(){
37     MESSAGE("Lib_mean Default Ctor");
38     MESSAGE("!!! should not be used");
39     exit(0);
40   }
Lib_Mean(const string & name,const double & mic,const double & moc)41   Lib_Mean(const string & name, const double & mic, const double & moc):_lib_name(name),_mean_in_cache(mic),_mean_out_of_cache(moc){
42     MESSAGE("Lib_mean Ctor");
43   }
Lib_Mean(const Lib_Mean & lm)44   Lib_Mean(const Lib_Mean & lm):_lib_name(lm._lib_name),_mean_in_cache(lm._mean_in_cache),_mean_out_of_cache(lm._mean_out_of_cache){
45     MESSAGE("Lib_mean Copy Ctor");
46   }
~Lib_Mean(void)47   ~Lib_Mean( void ){
48     MESSAGE("Lib_mean Dtor");
49   }
50 
51   double _mean_in_cache;
52   double _mean_out_of_cache;
53   string _lib_name;
54 
operator <(const Lib_Mean & right) const55   bool operator < ( const Lib_Mean &right) const
56   {
57     //return ( this->_mean_out_of_cache > right._mean_out_of_cache) ;
58     return ( this->_mean_in_cache > right._mean_in_cache) ;
59   }
60 
61 };
62 
63 
main(int argc,char * argv[])64 int main( int argc , char *argv[] )
65 {
66 
67   if (argc<6){
68     INFOS("!!! Error ... usage : main what mic Mic moc Moc filename1 finename2...");
69     exit(0);
70   }
71   INFOS(argc);
72 
73   int min_in_cache=atoi(argv[2]);
74   int max_in_cache=atoi(argv[3]);
75   int min_out_of_cache=atoi(argv[4]);
76   int max_out_of_cache=atoi(argv[5]);
77 
78 
79   multiset<Lib_Mean> s_lib_mean ;
80 
81   for (int i=6;i<argc;i++){
82 
83     string filename=argv[i];
84 
85     INFOS(filename);
86 
87     double mic=0;
88     double moc=0;
89 
90     {
91 
92       vector<int> tab_sizes;
93       vector<double> tab_mflops;
94 
95       read_xy_file(filename,tab_sizes,tab_mflops);
96 
97       mic=mean_calc(tab_sizes,tab_mflops,min_in_cache,max_in_cache);
98       moc=mean_calc(tab_sizes,tab_mflops,min_out_of_cache,max_out_of_cache);
99 
100       Lib_Mean cur_lib_mean(filename,mic,moc);
101 
102       s_lib_mean.insert(cur_lib_mean);
103 
104     }
105 
106   }
107 
108 
109   cout << "<TABLE BORDER CELLPADDING=2>" << endl ;
110   cout << "  <TR>" << endl ;
111   cout << "    <TH ALIGN=CENTER> " << argv[1] << " </TH>" << endl ;
112   cout << "    <TH ALIGN=CENTER> <a href=""#mean_marker""> in cache <BR> mean perf <BR> Mflops </a></TH>" << endl ;
113   cout << "    <TH ALIGN=CENTER> in cache <BR> % best </TH>" << endl ;
114   cout << "    <TH ALIGN=CENTER> <a href=""#mean_marker""> out of cache <BR> mean perf <BR> Mflops </a></TH>" << endl ;
115   cout << "    <TH ALIGN=CENTER> out of cache <BR> % best </TH>" << endl ;
116   cout << "    <TH ALIGN=CENTER> details </TH>" << endl ;
117   cout << "    <TH ALIGN=CENTER> comments </TH>" << endl ;
118   cout << "  </TR>" << endl ;
119 
120   multiset<Lib_Mean>::iterator is = s_lib_mean.begin();
121   Lib_Mean best(*is);
122 
123 
124   for (is=s_lib_mean.begin(); is!=s_lib_mean.end() ; is++){
125 
126     cout << "  <TR>" << endl ;
127     cout << "     <TD> " << is->_lib_name << " </TD>" << endl ;
128     cout << "     <TD> " << is->_mean_in_cache << " </TD>" << endl ;
129     cout << "     <TD> " << 100*(is->_mean_in_cache/best._mean_in_cache) << " </TD>" << endl ;
130     cout << "     <TD> " << is->_mean_out_of_cache << " </TD>" << endl ;
131     cout << "     <TD> " << 100*(is->_mean_out_of_cache/best._mean_out_of_cache) << " </TD>" << endl ;
132     cout << "     <TD> " <<
133       "<a href=\"#"<<is->_lib_name<<"_"<<argv[1]<<"\">snippet</a>/"
134       "<a href=\"#"<<is->_lib_name<<"_flags\">flags</a>  </TD>" << endl ;
135     cout << "     <TD> " <<
136       "<a href=\"#"<<is->_lib_name<<"_comments\">click here</a>  </TD>" << endl ;
137     cout << "  </TR>" << endl ;
138 
139   }
140 
141   cout << "</TABLE>" << endl ;
142 
143   ofstream output_file ("../order_lib",ios::out) ;
144 
145   for (is=s_lib_mean.begin(); is!=s_lib_mean.end() ; is++){
146     output_file << is->_lib_name << endl ;
147   }
148 
149   output_file.close();
150 
151 }
152 
mean_calc(const vector<int> & tab_sizes,const vector<double> & tab_mflops,const int size_min,const int size_max)153 double mean_calc(const vector<int> & tab_sizes, const vector<double> & tab_mflops, const int size_min, const int size_max){
154 
155   int size=tab_sizes.size();
156   int nb_sample=0;
157   double mean=0.0;
158 
159   for (int i=0;i<size;i++){
160 
161 
162     if ((tab_sizes[i]>=size_min)&&(tab_sizes[i]<=size_max)){
163 
164       nb_sample++;
165       mean+=tab_mflops[i];
166 
167     }
168 
169 
170   }
171 
172   if (nb_sample==0){
173     INFOS("no data for mean calculation");
174     return 0.0;
175   }
176 
177   return mean/nb_sample;
178 }
179 
180 
181 
182 
183