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