Performances classes tableaux en C++ et expression templates ------------------------------------------------------------ <<<< Comparaison/resultats du 23/04/2003 >>>> A/ Performances globales / en particulier acces aux elements B/ Apport des ET (Expression Templates) (JET) C/ Comparaison avec le code fortran (f77) et le BLAS D/ Les matrices SimpleMatrix (fichiers smtx.h .cc) sont codes en utilisant les NDataBlock de SOPHYA et les operations passent directement par les operations definies sur les NDataBlock E/ Comparaison avec tableaux de SOPHYA (TMatrix) F/ Liste d'operations 1- (note ElAcc) Remplissage de tableau avec acces aux elements de type Matrix mx(nrow, ncol) mx(i,j) = expression (i, j, ...) ElAcc C++, surcharge d'operateur (i,j) ElAcc fortran: tableaux natif fortran 2- Operation de type (note CMAdd), c1,c2,c3 trois constantes mx = mx1*c1 + mx2*c2 + mx3*c3 *** Boucle 50 fois sur Tableaux 1000x500 *** Linux: ====== Programme fortran , compile avec g77 -O3 Programme C++, compile avec -O3, SOPHYA avec flags habituels (-g -O ?) >> eros3> uname -a >> Linux eros3 2.4.18 #10 SMP Mon Dec 16 12:45:16 CET 2002 i686 unknown >> Intel(R) Xeon(TM) CPU 2.40GHz Programmes: lx_fmtx , lx_tjet / Commandes: csh> time lx_fmtx csh> time lx_tjet 50 1000 500 Tru64/OSF: ========== BLAS optimise de Compaq(/DEC -> HP) -lcxml Programmes compile avec -O3 -> osfO3_fmtx osfO3_tjet -arch host -fat -> ascfast_fmtx ascfast_tjet fortran avec -O5 -> osfO5_fmtx >> asc.lal.in2p3.fr> uname -a >> OSF1 asc.lal.in2p3.fr V5.1 2650 alpha >> ES47 Chip Alpha EV7 @ 1 GHz ==================================================== Temps CPU en secondes ==================================================== : ElAcc_1 : fortran, acces natif tableaux 2-D C/C++, pointeur double * p = new double[size]; acces p[i] ElAcc_2 : Classe SimpleMatrix / surcharge d'operateur ElAcc_3 : Classe SOPHYA::TMatrix / surcharge d'operateur ------------------------------------------------------------ ElAcc_1 ElAcc_2 ElAcc_3 ------------------------------------------------------------ lx_fmtx: 1.59 lx_tjet: 0.92 0.84 0.9 ............................................................ osfO3_fmtx: 3.31 osfO5_fmtx: 0.46 ascfast_fmtx: 3.21 ............................................................ osfO3_tjet: 1.0 1.06 1.03 ascfast_tjet: 0.66 0.73 0.70 ------------------------------------------------------------ Decembre 2003 - SOPHYA compile avec les options d'optimisation et debug = "-fast -g3" , ainsi que le programme tjet sur asc ............................................................ ascfast_tjet: 0.55 0.63 0.60 ------------------------------------------------------------ CMAdd_1 : fortran, boucle + acces natif tableaux 2-D C/C++, pointeur double * p = new double[size]; boucle p[i] = q[i] .... CMAdd_2 : fortran / appel BLAS (copy/ CstMult/ VecAdd) CMAdd_3 : C++/SimpleMatrix::MultCst() / AddElt() CMAdd_4 : C++/JET : SimpleMatrix:: operator overload with Exp. Templates CMAdd_5 : SOPHYA::TMatrix::MultCst() / AddElt() CMAdd_6 : SOPHYA::TMatrix::operator overlaod CMAdd_5, CMAdd_6 : mx = mx1*c1 + mx2*c2 + mx3*c3 Note Nov 2003 : J'ai echange ci-dessous _4 et _5 - Je pense qu'il y avait une ereur et _5 _6 correspondent aux resultats avec les SOPHYA::TMatrix dans les tableaux ci-dessous. -------------------------------------------------------------------------- CMAdd_1 CMAdd_2 CMAdd_3 CMAdd_4 CMAdd_5 CMAdd_6 -------------------------------------------------------------------------- lx_fmtx: 2.58 1.11 lx_tjet: 0.62 2.26 0.52 2.22 4.04 .......................................................................... osfO3_fmtx: 4.31 0.63 osfO5_fmtx: 0.26 0.71 ascfast_fmtx: 4.13 0.63 .......................................................................... osfO3_tjet: 0.65 1.48 1.36 3.08 3.53 ascfast_tjet: 1.06 1.91 1.84 3.81 3.83 -------------------------------------------------------------------------- Decembre 2003 - SOPHYA compile avec les options d'optimisation et debug = "-fast -g3" , ainsi que le programme tjet sur asc ascfast_tjet: 0.72 1.05 1.42 2.55 2.52 -------------------------------------------------------------------------- Notes: 1/ performances f77 -O5 doivent etre reverifie: l'optimiseur fortran (/f90) fait des optimisations sauvages dans certains cas, en virant les boucles que l'on veut tester. En effet, suivant le niveau d'optimisation, le fortran de DEC/Compaq (/HP) arrive a faire tendre le temps de calcul vers zero dans certains cas, independant de la taille des tableaux ! 2/ l'optimisation -arch host -fast (code d'execution rapide adapte a l'architecture du processeur de la machine hote) n'arrive pas a ameliorer les performances - Cela est peut-etre imputable a la librairie SOPHYA, compile avec -g -O , pour proc alpha generique. 3) Decembre 2003 - Resultats sur asc (OSF1-cxx , flag -fast) Je pense que la difference de performances tableaux SOPHYA et SimpleMatrix peuvent s'expliquer par le codage de la boucle d'operations ds NDataBlock utilisee ds SimpleMatrix : while (p (fichier tarray.cc) - Hypothese a verifier