IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[MT] Benchmark de produits matriciels sur processeurs multi-cores


Sujet :

C++

  1. #81
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    GCC ne donnait pas de warnings avec l'option '-Winline' branchée?

    hum, pas terrible non plus avec ICC.
    T'as forcé les inlines aussi?
    Et en plus y'a une grosse chute de performance vers les tailles de 400x400 que GCC n'a pas. C'est incompréhensible, d'autant que l'algorithme applique depuis longtemps son régime de croisière.
    Tu utilises bien le paramétrage suivant dans 'genial_config.h"?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        #define BLAS_M   48
        #define BLAS_N   48
        #define BLAS_K   15
        #define BLAS_K2  15
    Tu peux peut-être essayer avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        #define BLAS_M  132
        #define BLAS_N  132
        #define BLAS_K  100
        #define BLAS_K2  25
    Mais je te préviens le temps de compilation est plus grand. Mieux vaut donc ne faire que le bench sur les floats en commentant la ligne correspondant aux doubles dans le 'main'.

  2. #82
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    C'est un ordi portable?
    Je me rappelle des benchs FFT fait par HanLee sur un Core Duo portable qui étaient également décevants, alors que c'était le même exécutable pour tous...

  3. #83
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    Citation Envoyé par Charlemagne
    C'est un ordi portable?
    Je me rappelle des benchs FFT fait par HanLee sur un Core Duo portable qui étaient également décevants, alors que c'était le même exécutable pour tous...
    oui c'est un macbook pro (l'un des premier avec intel)...
    dans quelque temps, j'aurais un macbook pro avec intel core 2 duo et dual boot sur windows... donc on pourra comparer icc / gcc sur windows / mac sur la meme machine ...

  4. #84
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    Citation Envoyé par Charlemagne
    GCC ne donnait pas de warnings avec l'option '-Winline' branchée?
    panne de batterie et j'étais passé avec icc ensuite
    je viens juste de le relancer ...

  5. #85
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Citation Envoyé par epsilon68
    oui c'est un macbook pro (l'un des premier avec intel)...
    dans quelque temps, j'aurais un macbook pro avec intel core 2 duo et dual boot sur windows... donc on pourra comparer icc / gcc sur windows / mac sur la meme machine ...
    Ca sera cool. merci.
    Je veux pas te forcer mais compiler ATLAS sur ton Mac permettrait d'avoir une bonne référence de comparaison. (je conseille de télécharger la toute dernière version, qui intègre de nouveaux processeurs comme le tien contrairement à la version 3.6.0)

    Et puis, suite à plusieurs demandes, je vais lentement programmer une décomposition LU de matrices (et les algos dérivés tel sue la résolution de systèmes linéaires). C'est un algo important pour l'algèbre linéaire et ça promet d'autres benchmarks dans quelques semaines...

  6. #86
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    avec gcc:
    /usr/local/bin/g++ main.cpp -o gcc-genial -O2 -I../genial -msse3 -Winline
    (pas de warning)

  7. #87
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    comment je fais le bench avec openmp ?

  8. #88
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    je suis en train de compiler ATLAS

    et comment je fais pour l'utiliser dans le bench ?
    je link avec une lib ?

  9. #89
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Citation Envoyé par epsilon68
    comment je fais le bench avec openmp ?
    Ca sert encore à rien vu que les sources que t'as pour l'instant ne font pas de multi-threading pour le produit matriciel. (par contre la FFT oui)

    Citation Envoyé par epsilon68
    et comment je fais pour l'utiliser dans le bench ?
    je link avec une lib ?
    -il faut donner les bons chemins d'accès aux en-têtes d'ATLAS(option -Ipath). Pour moi les répertoires sont "atlas/include" et "atlas/include/WinNT_P4SSE2"
    -il faut donner les chemins d'accès aux librairies ATLAS (option -Lpath )
    -il faut lier les 2 librairies suivantes: libatlas.a libcblas.a (option -latlas -lcblas). Les autres ne sont pas utilisées (lapack.a)
    Je crois que c'est tout

    Ton dernier bench est conforme aux précédents de GCC. Comme visiblement il force bien toutes les consignes 'inline', alors soit GCC/ICC ne sait pas bien optimiser par rapport à ICL, soit ton ordi portable est plus lent qu'un orinateur de bureau.
    ATLAS permettra de se faire une idée. Il sera spécifiquement compilé pour ta machine, et il n'a pas de problèmes d'optimisation vu que les fonctions cruciales sont programmées en assembleur. (c'est d'ailleurs à cause de ça qu'il ne se laisse compiler que par GCC)

  10. #90
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    j'ai modifié la config en mettant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        #define BLAS_M  132
        #define BLAS_N  132
        #define BLAS_K  100
        #define BLAS_K2  25
    /usr/local/bin/g++ main.cpp -o gcc-genial -O2 -I../genial -msse3 -Winline

    et voila

  11. #91
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Ca n'apporte rien, tu peux revenir à 48,48,15,15. Que ICC ait une telle baisse de perfs vers 400x400 reste un mystère.

    J'oubliais, il faut aussi décommenter les parties relatives à ATLAS dans le programme principal.

  12. #92
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    La compilation du bench avec ATLAS ne passe pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /usr/local/bin/g++ main.cpp -o gcc-genial -O2 -I../genial -msse3 -Winline -I/xxx/ATLAS/include/ -L/xxx/ATLAS/my_build_dir/lib/ -latlas -lcblas -I/xxx/ATLAS/my_build_dir/include/
    main.cpp: In function 'Matrix<dense_matrix_generator<float, alignment_allocator<float, 16> > > gemm_benchmark(const Vector<G>&, float, double)':
    main.cpp:154: error: redeclaration of 'typename DenseMatrix<V, alignment_allocator<V, 16> >::self A'
    main.cpp:152: error: 'typename DenseMatrix<V, alignment_allocator<V, 16> >::self A' previously declared here
    main.cpp:155: error: redeclaration of 'typename DenseMatrix<V, alignment_allocator<V, 16> >::self B'
    main.cpp:153: error: 'typename DenseMatrix<V, alignment_allocator<V, 16> >::self B' previously declared here
    une idée ?

  13. #93
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    J'ai l'impression que tu n'as pas décommenté ce qu'il fallait.
    Essaye plutôt ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    #include <fstream>
     
    //#define BLAS_M  48
    //#define BLAS_N  48
    //#define BLAS_K  12
    //#define BLAS_K2  12
    #include "blas/gemm.h"
     
     
    const double default_measure_time=1;
    const double default_max_error=0;
     
    //static DenseVector<MatrixSize<int> >::self sizes(25, "(4x4) (8x8) (16x16) (32x32) (64x64) (100x100) (128x128) (144x144) (160x160) (176x176) (192x192) (200x200) (256x256) (400x400) (500x500) (512x512) (600x600) (700x700) (800x800) (900x900) (1000x1000) (1024x1024) (1500x1500) (2000x2000) (2048x2048)" );
    //static DenseVector<MatrixSize<int> >::self sizes(114, "(1x1) (2x2) (3x3) (4x4) (5x5) (6x6) (7x7) (8x8) (9x9) (10x10) (11x11) (12x12) (13x13) (14x14) (15x15) (16x16) (17x17) (18x18) (19x19) (20x20) (21x21) (22x22) (23x23) (24x24) (25x25) (26x26) (27x27) (28x28) (29x29) (30x30) (31x31) (32x32) (33x33) (34x34) (35x35) (36x36) (37x37) (38x38) (39x39) (40x40) (41x41) (42x42) (43x43) (44x44) (45x45) (46x46) (47x47) (48x48) (49x49) (50x50) (51x51) (52x52) (53x53) (54x54) (55x55) (56x56) (57x57) (58x58) (59x59) (60x60) (61x61) (62x62) (63x63) (64x64) (65x65) (66x66) (67x67) (68x68) (69x69) (70x70) (71x71) (72x72) (73x73) (74x74) (75x75) (76x76) (77x77) (78x78) (79x79) (80x80) (81x81) (82x82) (83x83) (84x84) (85x85) (86x86) (87x87) (88x88) (89x89) (90x90) (91x91) (92x92) (93x93) (94x94) (95x95) (96x96) (97x97) (98x98) (99x99) (100x100) (200x200) (300x300) (400x400) (500x500) (600x600) (700x700) (800x800) (900x900) (1000x1000) (1200x1200) (1400x1400) (1600x1600) (1800x1800) (2000x2000)");
     
    static DenseVector<MatrixSize<int> >::self sizes(2, "(4x4) (8x8) (16x16) (32x32) (64x64) (100x100) (128x128) (144x144) (160x160) (176x176) (192x192) (200x200) (256x256) (400x400) (500x500) (512x512) (600x600) (700x700) (800x800) (900x900) (1000x1000) (1024x1024) (1500x1500) (2000x2000) (2048x2048)" );
     
    extern "C" 
    {
    #include "atlas_misc.h"
    #include "atlas_level1.h"
    #include "atlas_level3.h"
    #include "cblas.h"
    #include "clapack.h"
    }
     
    template<class T>
    struct atlas_gemm_function
    {
    };
     
    template<>
    struct atlas_gemm_function<float>
    {
      template<class G1,class G2,class G3> inline void operator()(CBLAS_TRANSPOSE TransA,CBLAS_TRANSPOSE TransB, const Matrix<G1> &A, const Matrix<G2> &B, Matrix<G3> &C)
      { 
        int m=C.nrows(), n=C.ncols(), k=A.ncols();
        cblas_sgemm(AtlasRowMajor,TransA,TransB,m,n,k,1,&A(0,0),k,&B(0,0),n,0,&C(0,0),n);
      }
    };
     
    template<>
    struct atlas_gemm_function<double>
    {
      template<class G1,class G2,class G3> inline void operator()(CBLAS_TRANSPOSE TransA,CBLAS_TRANSPOSE TransB, const Matrix<G1> &A, const Matrix<G2> &B, Matrix<G3> &C)
      { 
        int m=C.nrows(), n=C.ncols(), k=A.ncols();
        cblas_dgemm(AtlasRowMajor,TransA,TransB,m,n,k,1,&A(0,0),k,&B(0,0),n,0,&C(0,0),n);
      }
    };
     
    template<>
    struct atlas_gemm_function<complex<float> >
    {
      typedef float real_type;
      typedef complex<real_type> value_type;
      template<class G1,class G2,class G3> inline void operator()(CBLAS_TRANSPOSE TransA,CBLAS_TRANSPOSE TransB, const Matrix<G1> &A, const Matrix<G2> &B, Matrix<G3> &C)
      { 
        int m=C.nrows(), n=C.ncols(), k=A.ncols();
        value_type alpha(1,0), beta(0,0);
        cblas_cgemm(AtlasRowMajor,TransA,TransB,m,n,k,(real_type*)&alpha,(real_type*)&A(0,0),k,(real_type*)&B(0,0),n,(real_type*)&beta,(real_type*)&C(0,0),n);
      }
    };
     
    template<>
    struct atlas_gemm_function<complex<double> >
    {
      typedef double real_type;
      typedef complex<real_type> value_type;
      template<class G1,class G2,class G3> inline void operator()(CBLAS_TRANSPOSE TransA,CBLAS_TRANSPOSE TransB, const Matrix<G1> &A, const Matrix<G2> &B, Matrix<G3> &C)
      { 
        int m=C.nrows(), n=C.ncols(), k=A.ncols();
        value_type alpha(1,0), beta(0,0);
        cblas_zgemm(AtlasRowMajor,TransA,TransB,m,n,k,(real_type*)&alpha,(real_type*)&A(0,0),k,(real_type*)&B(0,0),n,(real_type*)&beta,(real_type*)&C(0,0),n);
      }
    };
     
    template<class G1,class G2,class G3>
    void atlas_gemm(const Matrix<G1> &A, const Matrix<G2> &B, Matrix<G3> &C)
    {
      atlas_gemm_function<typename Matrix<G3>::value_type>()(AtlasNoTrans,AtlasNoTrans,A,B,C);
    }
     
    template<class G1,class G2,class G3>
    void atlas_tgemm(const Matrix<G1> &A, const Matrix<G2> &B, Matrix<G3> &C)
    {
      atlas_gemm_function<typename Matrix<G3>::value_type>()(AtlasNoTrans,AtlasTrans,A,B,C);
    }
     
     
     
    template<class T> 
    struct random_function : public binary_function<int,int,T>
    {
      typedef binary_function<int,int,T> base;
      typedef typename base::result_type result_type;
      typedef typename base::first_argument_type first_argument_type;
      typedef typename base::second_argument_type second_argument_type;
     
      result_type operator()(const first_argument_type &,const second_argument_type &) const
      {
        return result_type(rand(10));
      }
    };
     
    template<class T> 
    struct random_function<complex<T> > : public binary_function<int,int,complex<T> >
    {
      typedef binary_function<int,int,complex<T> > base;
      typedef typename base::result_type result_type;
      typedef typename base::first_argument_type first_argument_type;
      typedef typename base::second_argument_type second_argument_type;
     
      result_type operator()(const first_argument_type &,const second_argument_type &) const
      {
        return result_type(rand(10),rand(10));
      }
    };
     
    template<class E,class Tr,class G1,class G2>
    void excel_output(basic_ostream<E,Tr> &os, const Vector<G1> &X, const Matrix<G2> &M)
    {
    	for (int i=0; i<X.size(); ++i)
    	{
    		os<< X[i].nrows() << "\t";
    		for(int n=0;n<M.ncols();++n)
    			os<< round(M(i,n)) << "\t";
    		os<< endl;
    	}
    	cout << endl << endl;
    }
     
     
    template<class V,class G>
    DenseMatrix<float>::self gemm_benchmark(const Vector<G> &S, float nops, double dt=default_measure_time)
    {
      int n = S.size();
    	DenseMatrix<float>::self M(n,2,-1);
    	srand(static_cast<unsigned>(time(0)));
     
    	for (int i=0;i<n;i++)
    	{
        typedef V value_type;
        typedef typename DenseMatrix<value_type>::self array_type;
     
    	  int m=S[i].nrows(), n=m, k=S[i].ncols();
    		double t0=0, sum=1;
     
    		array_type C1(m,n, value_type(0)), C2(m,n, value_type(0));
    		srand(2);
        array_type A=dense_matrix_generate(m,k, random_function<value_type>());
    		array_type B=dense_matrix_generate(k,n, random_function<value_type>());
        //array_type A(m,k, 1);
    		//array_type B(k,n, 1);
     
    		for (sum=0,t0=get_time(); (get_time()-t0)<dt; ++sum) 
    		  atlas_gemm(A,B,C2);
    		M(i,1)=(nops*m*n*k)/(1000000*(get_time()-t0)/sum);
     
    		for (sum=0,t0=get_time(); (get_time()-t0)<dt; ++sum) 
    		  mul(A,B,C1);
    	  M(i,0)=(nops*m*n*k)/(1000000*(get_time()-t0)/sum);
     
        double d = dist(C1,C2);
    		if (d/(m*n)>=default_max_error) cout << S[i] << "\t" << d << "\t" << M(i,0) << "\t" << M(i,1) << endl;
    	}	
     
    	return M;
    }
     
     
     
    int main()
    {
      string s="Benchmark GEMM ";
      s+=to_string(BLAS_M)+" "+to_string(BLAS_K);
    #if defined(SSE3)
    	s+=" SSE3";
    #elif defined(SSE2)
    	s+=" SSE2";
    #endif
    #ifdef BLAS_THREADING
    #if defined(OPENMP)
      s+= " OpenMP" + to_string(max_threads());
    #else
      s+= " MT" + to_string(max_threads());
    #endif
    #endif
      s+=".txt";
     
      cout << s << endl;
     
    	ofstream fout(s.c_str());
      fout << "BLAS_M  = " << BLAS_M  << endl;
      fout << "BLAS_N  = " << BLAS_N  << endl;
      fout << "BLAS_K  = " << BLAS_K  << endl;
      fout << "BLAS_K2 = " << BLAS_K2 << endl;
      fout << endl;
     
      DenseMatrix<float>::self M(sizes.size(),4, -1);
     
      cout << "float"           << endl; sub(M,0,0,M.nrows(),2)=gemm_benchmark<float           >(sizes,2);
      //cout << "double"          << endl; sub(M,0,2,M.nrows(),2)=gemm_benchmark<double          >(sizes,2);
      //fout << '\t' << "GENIAL sgemm" << '\t' << "ATLAS sgemm" << '\t' << "GENIAL dgemm" << '\t' << "ATLAS dgemm" << endl;
      //excel_output(fout,sizes,M);
     
      //cout << "complex<float>"  << endl; sub(M,0,0,M.nrows(),2)=gemm_benchmark<complex<float>  >(sizes,8);
      //cout << "complex<double>" << endl; sub(M,0,2,M.nrows(),2)=gemm_benchmark<complex<double> >(sizes,8);
      //fout << '\t' << "GENIAL cgemm" << '\t' << "ATLAS cgemm" << '\t' << "GENIAL zgemm" << '\t' << "ATLAS zgemm" << endl;
      //excel_output(fout,sizes,M);
     
    }

  14. #94
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    ok
    j'ai un peu augmenté les tests
    (static DenseVector<MatrixSize<int> >::self sizes(25, ......)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Benchmark GEMM 48 15 SSE2.txt
    float
    (4x4)   0       42.1615 43.0394
    (8x8)   0       256.351 250.786
    (16x16) 0       825.778 724.369
    (32x32) 0       1828.26 1142.95
    (64x64) 0       1455.95 2718.43
    (100x100)       0       1892    2424
    (128x128)       0       2084.57 2281.7
    (144x144)       0       2245.46 2323.1
    (160x160)       0       2187.26 2965.5
    (176x176)       0       2322.46 2769.5
    Segmentation fault
    il y a eu un segmentation fault

  15. #95
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Citation Envoyé par epsilon68
    ok
    j'ai un peu augmenté les tests
    (static DenseVector<MatrixSize<int> >::self sizes(25, ......)
    Ah oui, désolé, j'ai oublié de rectifier ce détail.

    Citation Envoyé par epsilon68
    il y a eu un segmentation fault
    Je n'en ai pas, et puisque tu n'en as pas eu auparavant, je pense que ça provienne d'ATLAS. C'est très décevant de la part d'ATLAS, ce n'est pas justifiable.
    Peut-être essayer la version "stable" 3.6.0, mais je crois pas que les architectures récentes soient prévues, il te faudra prendre la plus proche (Pentium 4E ?) ou "processeur inconnu" et voir ce que ça donne...

    A part ça, les perfs d'ATLAS sont meilleures que les miennes, mais c'est pas fameux non plus pour ATLAS qui ne dépasse pas les 3000MFlops. Je doute qu'ATLAS se soit lui même si mal paramétré que ça (Automatically Tuned...), j'ai la nette impression que c'est l'effet "portable" qui joue.

    Je veux pas du tout te forcer. Si tu veux tenter d'améliorer les perfs de ma librairie il faut tâtonner en modifiant successivement le paramétrage qui optimise le cache en mesurant les perfs: Les 4 valeurs BLAS_M, BLAS_N, BLAS_K,BLAS_K2.
    Ces valeurs définissent la taille de matrices blocs.
    Quelques conseils:
    1)garde BLAS_M et BLAS_N égaux par soucis de symétrie
    2)Fais varier légèrement la meilleure configuration actuelle pour les Pentium4 3.4GHz (BLAS_M=BLAS_N=48,BLAS_K=15). ATTENTION car BLAS_M et BLAS_N doivent être des multiples de 12.
    3)fais des benchs sur un petit nombre de grandes matrices (modifie la variable statique 'sizes') mais pas trop grande car c'est pas la peine que les benchs s'éternisent. Des matrices de taille 500x500 à 1000x1000 par exemple.
    4)BLAS_K2 n'est pas vraiment important pour les perfs sur les grandes matrices, ne le change donc pas. Il est donc possible d'améliorer considérablement la vitesse de compilation à condition d'utiliser pour les benchs des matrices dont les dimensions sont multiples de BLAS_M=BLAS_N et de commenter les lignes suivantes dans le fichier 'gemm.h'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
        case  1: if ( 1<=K) return matmul_function<M,N, 1,R,L,T,F,Func>()(A,B,C,adapt); 
        case  2: if ( 2<=K) return matmul_function<M,N, 2,R,L,T,F,Func>()(A,B,C,adapt); 
        case  3: if ( 3<=K) return matmul_function<M,N, 3,R,L,T,F,Func>()(A,B,C,adapt); 
        case  4: if ( 4<=K) return matmul_function<M,N, 4,R,L,T,F,Func>()(A,B,C,adapt); 
        case  5: if ( 5<=K) return matmul_function<M,N, 5,R,L,T,F,Func>()(A,B,C,adapt); 
        case  6: if ( 6<=K) return matmul_function<M,N, 6,R,L,T,F,Func>()(A,B,C,adapt); 
        case  7: if ( 7<=K) return matmul_function<M,N, 7,R,L,T,F,Func>()(A,B,C,adapt); 
        case  8: if ( 8<=K) return matmul_function<M,N, 8,R,L,T,F,Func>()(A,B,C,adapt); 
        case  9: if ( 9<=K) return matmul_function<M,N, 9,R,L,T,F,Func>()(A,B,C,adapt); 
        case 10: if (10<=K) return matmul_function<M,N,10,R,L,T,F,Func>()(A,B,C,adapt); 
        case 11: if (11<=K) return matmul_function<M,N,11,R,L,T,F,Func>()(A,B,C,adapt); 
        case 12: if (12<=K) return matmul_function<M,N,12,R,L,T,F,Func>()(A,B,C,adapt); 
        case 13: if (13<=K) return matmul_function<M,N,13,R,L,T,F,Func>()(A,B,C,adapt); 
        case 14: if (14<=K) return matmul_function<M,N,14,R,L,T,F,Func>()(A,B,C,adapt); 
        case 15: if (15<=K) return matmul_function<M,N,15,R,L,T,F,Func>()(A,B,C,adapt); 
        case 16: if (16<=K) return matmul_function<M,N,16,R,L,T,F,Func>()(A,B,C,adapt); 
        case 17: if (17<=K) return matmul_function<M,N,17,R,L,T,F,Func>()(A,B,C,adapt); 
        case 18: if (18<=K) return matmul_function<M,N,18,R,L,T,F,Func>()(A,B,C,adapt); 
        case 19: if (19<=K) return matmul_function<M,N,19,R,L,T,F,Func>()(A,B,C,adapt); 
        case 20: if (20<=K) return matmul_function<M,N,20,R,L,T,F,Func>()(A,B,C,adapt); 
        case 21: if (21<=K) return matmul_function<M,N,21,R,L,T,F,Func>()(A,B,C,adapt); 
        case 22: if (22<=K) return matmul_function<M,N,22,R,L,T,F,Func>()(A,B,C,adapt); 
        case 23: if (23<=K) return matmul_function<M,N,23,R,L,T,F,Func>()(A,B,C,adapt); 
        case 24: if (24<=K) return matmul_function<M,N,24,R,L,T,F,Func>()(A,B,C,adapt); 
        case 25: if (25<=K) return matmul_function<M,N,25,R,L,T,F,Func>()(A,B,C,adapt);
    et (si tu utilises des matrices de nombres complexes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        case  2: if ( 2<=K) return matmul_function<M,N, 2,R,L,T,F,Func>()(A,B,C,adapt); 
        case  4: if ( 4<=K) return matmul_function<M,N, 4,R,L,T,F,Func>()(A,B,C,adapt); 
        case  6: if ( 6<=K) return matmul_function<M,N, 6,R,L,T,F,Func>()(A,B,C,adapt); 
        case  8: if ( 8<=K) return matmul_function<M,N, 8,R,L,T,F,Func>()(A,B,C,adapt); 
        case 10: if (10<=K) return matmul_function<M,N,10,R,L,T,F,Func>()(A,B,C,adapt);
        case 12: if (12<=K) return matmul_function<M,N,12,R,L,T,F,Func>()(A,B,C,adapt); 
        case 14: if (14<=K) return matmul_function<M,N,14,R,L,T,F,Func>()(A,B,C,adapt); 
        case 16: if (16<=K) return matmul_function<M,N,16,R,L,T,F,Func>()(A,B,C,adapt); 
        case 18: if (18<=K) return matmul_function<M,N,18,R,L,T,F,Func>()(A,B,C,adapt); 
        case 20: if (20<=K) return matmul_function<M,N,20,R,L,T,F,Func>()(A,B,C,adapt);
        case 22: if (22<=K) return matmul_function<M,N,22,R,L,T,F,Func>()(A,B,C,adapt); 
        case 24: if (24<=K) return matmul_function<M,N,24,R,L,T,F,Func>()(A,B,C,adapt); 
        case 26: if (26<=K) return matmul_function<M,N,26,R,L,T,F,Func>()(A,B,C,adapt);

  16. #96
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    je me suis demandé si ce n'est pas parce que j'utilisais gcc 4.2 alors je recompile maintenant avec gcc4.01:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    g++ main.cpp -o gcc-genial -O2 -I../genial -msse2 -Winline -I/xxx/ATLAS/include/ -L/xxx/ATLAS/my_build_dir/lib/ -latlas -lcblas -I/xxx/ATLAS/my_build_dir/include/
    ../genial/array/vector.h: In member function 'void tiny_vector_generator<4, float>::resize(const int&)':
    ../genial/array/vector.h:737: warning: inlining failed in call to 'int tiny_vector_generator<4, float>::size() const': --param inline-unit-growth limit reached
    ../genial/array/vector.h:746: warning: called from here
    ../genial/array/vector.h: In member function 'void tiny_vector_generator<4, float>::set_lower_bound(const int&)':
    ../genial/array/vector.h:738: warning: inlining failed in call to 'int tiny_vector_generator<4, float>::lower_bound() const': --param inline-unit-growth limit reached
    ../genial/array/vector.h:747: warning: called from here
    /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h: In constructor 'std::raw_storage_iterator<_ForwardIterator, _Tp>::raw_storage_iterator(_ForwardIterator) [with _ForwardIterator = float*, _Tp = float]':
    /usr/include/c++/4.0.0/bits/stl_iterator_base_types.h:107: warning: inlining failed in call to 'std::iterator<std::output_iterator_tag, void, void, void, void>::iterator() throw ()': --param inline-unit-growth limit reached
    /usr/include/c++/4.0.0/bits/stl_raw_storage_iter.h:80: warning: called from here
    ../genial/functional.h: In constructor 'id_function<Arg, Res>::id_function() [with Arg = Vector<tiny_vector_generator<4, float> >, Res = Vector<tiny_vector_generator<4, float> >]':
    ../genial/functional.h:130: warning: inlining failed in call to 'unary_reference_function<Vector<tiny_vector_generator<4, float> >, Vector<tiny_vector_generator<4, float> >, Vector<tiny_vector_generator<4, float> >&, const Vector<tiny_vector_generator<4, float> >&>::unary_reference_function() throw ()': --param inline-unit-growth limit reached
    ../genial/functional.h:225: warning: called from here
    ../genial/functional.h: In constructor 'id_function<Arg, Res>::id_function() [with Arg = float, Res = float]':
    ../genial/functional.h:130: warning: inlining failed in call to 'unary_reference_function<float, float, float&, const float&>::unary_reference_function() throw ()': --param inline-unit-growth limit reached
    ../genial/functional.h:225: warning: called from here
    ../genial/array/arraygenerator.h: In function 'Vector<tiny_vector_generator<4, short unsigned int> > flip(const Vector<tiny_vector_generator<4, short unsigned int> >&)':
    ../genial/array/arraygenerator.h:113: warning: inlining failed in call to 'generator_traits<tiny_vector_generator<4, short unsigned int> >::generator_traits() throw ()': --param inline-unit-growth limit reached
    ../genial/array/vector.h:124: warning: called from here
    ../genial/array/vectorgenerator.h:61: warning: inlining failed in call to 'reference_vector_generator_traits<short unsigned int, short unsigned int&, const short unsigned int&>::reference_vector_generator_traits() throw ()': --param inline-unit-growth limit reached
    ../genial/array/vector.h:512: warning: called from here
    resultats:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Benchmark GEMM 48 15 SSE2.txt
    float
    (4x4)   0       25.5971 43.0216
    (8x8)   0       90.4335 250.001
    (16x16) 0       173.621 723.444
    (32x32) 0       279.249 1126.43
    (64x64) 0       271.581 2728.39
    (100x100)       0       320     2406
    (128x128)       0       322.961 2269.12
    (144x144)       0       340.402 2311.15
    (160x160)       0       337.318 2646.02
    (176x176)       0       345.459 2758.6

  17. #97
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    ca a été plus loin cette fois avec size=20

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Benchmark GEMM 48 15 SSE2.txt
    float
    (4x4)   0       25.3467 42.9779
    (8x8)   0       90.3025 248.656
    (16x16) 0       171.549 726.065
    (32x32) 0       274.334 1137.64
    (64x64) 0       271.581 2728.92
    (100x100)       0       320     2440
    (128x128)       0       322.961 2890.33
    (144x144)       0       340.402 3069.59
    (160x160)       0       340.657 2949.12
    (176x176)       0       348.914 2758.6
    (192x192)       0       343.587 3751.28
    (200x200)       0       341.748 3744
    (256x256)       0       344.952 4026.53
    (400x400)       0       355.556 4224
    (500x500)       0       357.143 4326.92
    (512x512)       0       357.914 4346.1
    (600x600)       0       363.025 4400
    (700x700)       0       359.162 4446.3
    l'inline n'a pas l'air de marcher avec gcc 4.01

  18. #98
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Pour s'assurer que la 'segmentation fault' vient bien d'ATLAS tu peux le désactiver en commentant les 3 lignes suivantes dans le programme principal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (sum=0,t0=get_time(); (get_time()-t0)<dt; ++sum) 
    atlas_gemm(A,B,C2);
    M(i,1)=(nops*m*n*k)/(1000000*(get_time()-t0)/sum);
    Je doute que ce soit un bug dans GCC 4.2 (pour vérifier il aurait fallu recompiler entièrement ATLAS)
    De toute évidence GCC 4.2 a un avantage majeur (vis à vis de GCC 4.01 et GCC 3.4) pour ma librairie: il obéit aux 'inlines' forcés.
    Les warnings montrent que GCC 4.01 ignore plusieurs 'inlines', ça lui coute un facteur d'environ 7 (excusez le peu!) dans les perfs. Et d'après ce que je vois il choisit plutôt mal les fonctions non inlinées (alors ceux qui disent dans d'autres topics que les compilos savent inliner correctement... qu'il faut les laisser choisir quelles fonctions inliner...).
    C'était la raison principale de mon manque d'intérêt depuis plusieurs années en GCC, mais j'ai maintenant hâte d'avoir une version Windows.


    Au fait la 2ème colonne de la console représente la différence de résultats entre ma bibliothèque et ATLAS. Elle doit donc être nulle (ou très faible) quand ATLAS est branché, sinon c'est qu'il y a un bug dans le calcul du produit matriciel.
    Les 3ème et 4ème colonnes sont les perfs en Mflops de ma bibliothèque et d'ATLAS.

  19. #99
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    pour info je viens de re-essayer icc avec quelques nouvelles options

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    icpc main.cpp -o icc-genial -O2 -inline-forceinline -no-inline-max-size -msse3 -Winline -xP -I../genial -I/sylisa/ATLAS/include/ -L/sylisa/ATLAS/my_build_dir/lib/ -I/sylisa/ATLAS/my_build_dir/include/ -latlas -lcblas
    mcpcom(310) malloc: *** vm_allocate(size=2101248) failed (error code=3)
    mcpcom(310) malloc: *** error: can't allocate region
    mcpcom(310) malloc: *** set a breakpoint in szone_error to debug
    Fatal compilation error: Out of memory asking for 2097160.
    compilation aborted for main.cpp (code 1)
    j'ai enlevé le -no-inline-max-size, ca recompile on verra bien...
    EDIT bah non ca plante pareil :-/

  20. #100
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Pas un bon point pour ICC...
    Je connaîs pas ces options, même si j'ai une idée de leur sens.
    'inline-forceinline' a priori ne sert à rien si "__forceinline" est bien déclaré dans 'genial_config.h'
    Peut-être que ça lui fait consommer beaucoup trop de mémoire. Ceci dit c'est vrai que mon programme nécessite pas mal de mémoire à cause de l'instanciation d'un certains nombre de grosses fonctions avec des paramètres templates. Tu peux éventuellement vérifier l'occupation mémoire avec le "gestionnaire de tâche" (y'a bien un équivalent sous Mac,non?)

    Sinon, la 'segmentation fault', est-elle bien due à ATLAS?

Discussions similaires

  1. Optimiser l'utilisation d'un processeur multi-core
    Par photorelief dans le forum Modules
    Réponses: 11
    Dernier message: 11/04/2010, 21h28
  2. affichage de produit matricielle sur excel
    Par opensource dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/02/2010, 11h42
  3. petite question sur le multi core
    Par vmfa-2 sven dans le forum Composants
    Réponses: 4
    Dernier message: 23/05/2008, 14h51
  4. Benchmark sur processeur multi-core
    Par Charlemagne dans le forum C++
    Réponses: 123
    Dernier message: 16/07/2007, 10h51
  5. Réponses: 5
    Dernier message: 14/04/2007, 14h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo