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