Performances classes tableaux en C++ et expression templates ------------------------------------------------------------ <<<< Mise a jour mesures avec SOPHYA V=1.960 - 10 Juin 2006 Compile sur asc> soit avec -O -g soit -fast (ascfast) <<<< 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] tjet(31) ElAcc_2 : Classe SimpleMatrix / surcharge d'operateur tjet(1) ElAcc_3 : Classe SOPHYA::TMatrix / surcharge d'operateur tjet(21) ------------------------------------------------------------ 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 ------------------------------------------------------------ Juin 2006 - SOPHYA compile avec les options standard -O -g1 asc_tjet et avec -fast ascfast_tjet asc_tjet: 0.98 1.2 1.28 ascfast_tjet: 0.57 0.63 0.60 ............................................................ Juin 2006 : pour le f77 et f90 (fmtx.f f90mtx.f90) - il n'y pas de difference entre le temps avec -O et -fast asc_fmtx: 3.5 asc_f90mtx: 0.7 ............................................................ Juin 2006 : sur ccali avec icc et ifort Compile avec option par defaut -O ali_tjet: 0.81 0.88 0.96 ali_fmtx: 1.27 ali_f90mtx: 1.29 ------------------------------------------------------------ CMAdd_1 : fortran, boucle + acces natif tableaux 2-D C/C++, pointeur double * p = new double[size]; boucle p[i] = q[i] .... tjet(32) CMAdd_2 : fortran / appel BLAS (copy/ CstMult/ VecAdd) CMAdd_3 : C++/SimpleMatrix::MultCst() / AddElt() tjet(2) CMAdd_4 : C++/JET : SimpleMatrix:: operator overload with Exp. Templates tjet(3) CMAdd_5 : SOPHYA::TMatrix::MultCst() / AddElt() tjet(22) CMAdd_6 : SOPHYA::TMatrix::operator overlaod tjet(23) 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 -------------------------------------------------------------------------- -------------------------------------------------------------------------- Juin 2006 - SOPHYA compile avec les options standard -O -g1 asc_tjet et avec -fast ascfast_tjet asc_tjet: 0.7 1.52 1.83 2.13 2.47 ascfast_tjet: 0.75 1.04 1.4 1.31 1.51 ......................................................................... Juin 2006 : pour le f77 et f90 (fmtx.f f90mtx.f90) - il n'y pas de difference entre le temps avec -O et -fast asc_fmtx: 4.4 0.68 asc_f90mtx: 0.26 ......................................................................... Juin 2006 : sur ccali avec icc et ifort Compile avec option par defaut -O ali_tjet: 0.66 2.8 0.65 1.91 2.9 ali_fmtx: 1.37 0.79 ali_f90mtx: 0.36 -------------------------------------------------------------------------- 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 ! Note de Juin 2006: f90 est effectivement tres efficace pour effectuer les operations sur tableaux natifs - verification sur OSF / f90 et Linux/ifort (compilo Intel) 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. Note de Juin2006: En compilant SOPHYA aussi avec -fast, on gagne, voir ci-dessus. 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 Juin 2006 : les optimisations des operations sur tableaux (Juil04 et Avr06) ont apparemment remedie a ce probleme.