You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							182 lines
						
					
					
						
							5.2 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							182 lines
						
					
					
						
							5.2 KiB
						
					
					
				| //===================================================== | |
| // File   :  mean.cxx | |
| // Author :  L. Plagne <laurent.plagne@edf.fr)>         | |
| // Copyright (C) EDF R&D,  lun sep 30 14:23:15 CEST 2002 | |
| //===================================================== | |
| //  | |
| // This program is free software; you can redistribute it and/or | |
| // modify it under the terms of the GNU General Public License | |
| // as published by the Free Software Foundation; either version 2 | |
| // of the License, or (at your option) any later version. | |
| //  | |
| // This program is distributed in the hope that it will be useful, | |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | |
| // GNU General Public License for more details. | |
| // You should have received a copy of the GNU General Public License | |
| // along with this program; if not, write to the Free Software | |
| // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. | |
| //  | |
| #include "utilities.h" | |
| #include <vector> | |
| #include <string> | |
| #include <iostream> | |
| #include <fstream> | |
| #include "bench_parameter.hh" | |
| #include "utils/xy_file.hh" | |
| #include <set> | |
|  | |
| using namespace std; | |
| 
 | |
| double mean_calc(const vector<int> & tab_sizes, const vector<double> & tab_mflops, const int size_min, const int size_max); | |
| 
 | |
| class Lib_Mean{ | |
| 
 | |
| public: | |
|   Lib_Mean( void ):_lib_name(),_mean_in_cache(),_mean_out_of_cache(){ | |
|     MESSAGE("Lib_mean Default Ctor"); | |
|     MESSAGE("!!! should not be used"); | |
|     exit(0); | |
|   } | |
|   Lib_Mean(const string & name, const double & mic, const double & moc):_lib_name(name),_mean_in_cache(mic),_mean_out_of_cache(moc){ | |
|     MESSAGE("Lib_mean Ctor"); | |
|   } | |
|   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){ | |
|     MESSAGE("Lib_mean Copy Ctor"); | |
|   } | |
|   ~Lib_Mean( void ){ | |
|     MESSAGE("Lib_mean Dtor"); | |
|   } | |
|      | |
|   double _mean_in_cache; | |
|   double _mean_out_of_cache; | |
|   string _lib_name; | |
| 
 | |
|   bool operator < ( const Lib_Mean &right) const  | |
|   { | |
|     //return ( this->_mean_out_of_cache > right._mean_out_of_cache) ; | |
|     return ( this->_mean_in_cache > right._mean_in_cache) ; | |
|   } | |
| 
 | |
| };  | |
| 
 | |
| 
 | |
| int main( int argc , char *argv[] ) | |
| { | |
| 
 | |
|   if (argc<6){ | |
|     INFOS("!!! Error ... usage : main what mic Mic moc Moc filename1 finename2..."); | |
|     exit(0); | |
|   } | |
|   INFOS(argc); | |
| 
 | |
|   int min_in_cache=atoi(argv[2]); | |
|   int max_in_cache=atoi(argv[3]); | |
|   int min_out_of_cache=atoi(argv[4]); | |
|   int max_out_of_cache=atoi(argv[5]); | |
| 
 | |
| 
 | |
|   multiset<Lib_Mean> s_lib_mean ; | |
| 
 | |
|   for (int i=6;i<argc;i++){ | |
|      | |
|     string filename=argv[i]; | |
|      | |
|     INFOS(filename); | |
| 
 | |
|     double mic=0; | |
|     double moc=0; | |
| 
 | |
|     { | |
|        | |
|       vector<int> tab_sizes; | |
|       vector<double> tab_mflops; | |
| 
 | |
|       read_xy_file(filename,tab_sizes,tab_mflops); | |
| 
 | |
|       mic=mean_calc(tab_sizes,tab_mflops,min_in_cache,max_in_cache); | |
|       moc=mean_calc(tab_sizes,tab_mflops,min_out_of_cache,max_out_of_cache); | |
| 
 | |
|       Lib_Mean cur_lib_mean(filename,mic,moc); | |
|        | |
|       s_lib_mean.insert(cur_lib_mean);	 | |
| 
 | |
|     }    | |
|             | |
|   } | |
| 
 | |
| 
 | |
|   cout << "<TABLE BORDER CELLPADDING=2>" << endl ; | |
|   cout << "  <TR>" << endl ; | |
|   cout << "    <TH ALIGN=CENTER> " << argv[1] << " </TH>" << endl ; | |
|   cout << "    <TH ALIGN=CENTER> <a href=""#mean_marker""> in cache <BR> mean perf <BR> Mflops </a></TH>" << endl ; | |
|   cout << "    <TH ALIGN=CENTER> in cache <BR> % best </TH>" << endl ; | |
|   cout << "    <TH ALIGN=CENTER> <a href=""#mean_marker""> out of cache <BR> mean perf <BR> Mflops </a></TH>" << endl ; | |
|   cout << "    <TH ALIGN=CENTER> out of cache <BR> % best </TH>" << endl ; | |
|   cout << "    <TH ALIGN=CENTER> details </TH>" << endl ; | |
|   cout << "    <TH ALIGN=CENTER> comments </TH>" << endl ; | |
|   cout << "  </TR>" << endl ; | |
| 
 | |
|   multiset<Lib_Mean>::iterator is = s_lib_mean.begin(); | |
|   Lib_Mean best(*is);   | |
|    | |
| 
 | |
|   for (is=s_lib_mean.begin(); is!=s_lib_mean.end() ; is++){ | |
| 
 | |
|     cout << "  <TR>" << endl ; | |
|     cout << "     <TD> " << is->_lib_name << " </TD>" << endl ; | |
|     cout << "     <TD> " << is->_mean_in_cache << " </TD>" << endl ; | |
|     cout << "     <TD> " << 100*(is->_mean_in_cache/best._mean_in_cache) << " </TD>" << endl ; | |
|     cout << "     <TD> " << is->_mean_out_of_cache << " </TD>" << endl ; | |
|     cout << "     <TD> " << 100*(is->_mean_out_of_cache/best._mean_out_of_cache) << " </TD>" << endl ; | |
|     cout << "     <TD> " <<  | |
|       "<a href=\"#"<<is->_lib_name<<"_"<<argv[1]<<"\">snippet</a>/"  | |
|       "<a href=\"#"<<is->_lib_name<<"_flags\">flags</a>  </TD>" << endl ; | |
|     cout << "     <TD> " <<  | |
|       "<a href=\"#"<<is->_lib_name<<"_comments\">click here</a>  </TD>" << endl ; | |
|     cout << "  </TR>" << endl ; | |
|    | |
|   } | |
| 
 | |
|   cout << "</TABLE>" << endl ; | |
| 
 | |
|   ofstream output_file ("../order_lib",ios::out) ; | |
|    | |
|   for (is=s_lib_mean.begin(); is!=s_lib_mean.end() ; is++){ | |
|     output_file << is->_lib_name << endl ; | |
|   } | |
| 
 | |
|   output_file.close(); | |
| 
 | |
| } | |
| 
 | |
| double mean_calc(const vector<int> & tab_sizes, const vector<double> & tab_mflops, const int size_min, const int size_max){ | |
|    | |
|   int size=tab_sizes.size(); | |
|   int nb_sample=0; | |
|   double mean=0.0; | |
| 
 | |
|   for (int i=0;i<size;i++){ | |
|      | |
|      | |
|     if ((tab_sizes[i]>=size_min)&&(tab_sizes[i]<=size_max)){ | |
|        | |
|       nb_sample++; | |
|       mean+=tab_mflops[i]; | |
| 
 | |
|     } | |
| 
 | |
|      | |
|   } | |
| 
 | |
|   if (nb_sample==0){ | |
|     INFOS("no data for mean calculation"); | |
|     return 0.0; | |
|   } | |
| 
 | |
|   return mean/nb_sample; | |
| } | |
| 
 | |
|    | |
| 
 | |
| 
 |