
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<T> (fichiers smtx.h .cc) 
     sont codes en utilisant les NDataBlock<T> de SOPHYA
     et les operations passent directement par les 
     operations definies sur les NDataBlock
  E/ Comparaison avec tableaux de SOPHYA (TMatrix<r_8>)
  
  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>: 
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<T> / surcharge d'operateur tjet(1)
ElAcc_3 : Classe SOPHYA::TMatrix<T> / 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> 
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<T>::MultCst() / AddElt() tjet(2)
CMAdd_4 : C++/JET : SimpleMatrix<T>:: operator overload with Exp. Templates tjet(3)
CMAdd_5 : SOPHYA::TMatrix<T>::MultCst() / AddElt()   tjet(22)
CMAdd_6 : SOPHYA::TMatrix<T>::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<T> 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<T> peuvent s'expliquer par le codage de 
la boucle d'operations ds NDataBlock<T>  utilisee ds 
SimpleMatrix<T> :
  while (p<pe) *p++ -= *pa++; (ndatablock.cc) 
compare a une boucle for(i=;i<;i+=) utilisee dans
TArray<T> (fichier tarray.cc) - 
Hypothese a verifier 
  Juin 2006 : les optimisations des operations sur tableaux (Juil04
  et Avr06) ont apparemment remedie a ce probleme.

