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;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								  
							 | 
						|
								
							 | 
						|
								
							 |