Notice: Undefined variable: SERVER_ADDR in /mnt/114/sda/5/e/thomas.leduc/constantes.php on line 20
À propos du produit de matrices et de son optimisation...<br>Cas particulier d'un serveur Origin 2000
[ accueil | doctorat | Java | JavaScript | faqs | cours ]

rdv sur mon nouveau site - visit my new website

À propos du produit de matrices et de son optimisation...
Cas particulier d'un serveur Origin 2000

Notes importantes : Remarque :
TailleTemps en secondes
  Versions séquentielles Versions parallèles
  Sans optimisation -Ofast=ip27 CBLAS OpenMP OpenMP
-Ofast=ip27
CBLAS-MP
  195 MHz250 MHz 195 MHz250 MHz 195 MHz250 MHz pour 8 processeurs (OMP_NUM_THREADS=8)
1000.120.0900000.040.030.01
2000.960.730.040.040.050.030.120.020.03
3003.252.450.150.120.160.120.40.050.04
4009.966.990.370.280.370.291.040.090.08
50016.7312.670.730.570.720.561.950.150.14
60039.0428.681.280.991.260.984.170.20.18
70063.347.882.071.62.051.567.750.330.27
800115.0285.163.12.392.942.2912.610.440.37
900166.54125.924.43.394.233.2619.30.620.52
1000240.27185.886.064.696.214.7229.410.90.71
2000?2061.7363.1348.6349.5437.84313.217.595.08





  1. Produit de matrice - le programme principal
  2. #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    extern void produitMatrice(double *A,double *B,double *C,int n);
    
    void initialisation(double *T,int n)
    {
      double nn = n*n;
      int i;
      for(i=0 ; i<nn ; i++) 
        T[i] = (double) rand() / (double) RAND_MAX;
    }
    
    double trace(double* T,int n)
    {
      int i;
      double sommeTermesDiagonaux = 0;
      for(i=0 ; i<n ; i++)
        sommeTermesDiagonaux += T[i*(n+1)];
      return sommeTermesDiagonaux;
    }
    
    int main(int argc,char *argv[])
    {
      clock_t dateDebut,dateFin;
      int n = atoi(argv[1]);  
      double *A = (double*) calloc(n*n,sizeof(double));
      double *B = (double*) calloc(n*n,sizeof(double));
      double *C = (double*) calloc(n*n,sizeof(double));
    
      initialisation(A,n);
      initialisation(B,n);
      
      dateDebut = clock();
      produitMatrice(A,B,C,n);
      dateFin = clock();
      
      printf("Execution en %5.2f secondes - Trace(C) = %.4f\n",
    	 (double) (dateFin-dateDebut)/(double) CLOCKS_PER_SEC,trace(C,n));
    
      free(A);
      free(B);
      free(C);    
      return EXIT_SUCCESS;
    }
    
  3. Le produit de matrice : version simple avec ou sans optimisation à la compilation
  4. void produitMatrice(double *A,double *B,double *C,int n)
    {
      int i,j,k,in=0,kn;
      register double tmp;
      
      for(i=0 ; i<n ; i++) {
        for(j=0 ; j<n ; j++) {
          tmp = 0;
          for(k=0 , kn = 0 ; k<n ; k++ , kn += n)
            tmp += A[in+k]*B[kn+j];
          C[in+j] = tmp;
        }
        in += n;
      }
    }
    

  5. Le produit de matrice : version OpenMP
  6. #include <omp.h>
    
    void produitMatrice(double *A,double *B,double *C,int n)
    {
      int i,j,k,in=0,kn;
      double tmp;
      /* ATTENTION : ICI ON A MODIFIE LE CALCUL DE LA VALEUR DE LA VARIABLE "in" ! */
    #pragma omp parallel for private(j,k,in,kn,tmp) shared(A,B,C)
      for(i=0 ; i<n ; i++) {
        in = i*n; 
        for(j=0 ; j<n ; j++) {
          tmp = 0;
          for(k=0 , kn = 0 ; k<n ; k++ , kn += n)
            tmp += A[in+k]*B[kn+j];
          C[in+j] = tmp;
        }
      }
    }
    

  7. Le produit de matrice : version CBLAS
  8. #include <cblas.h>
    
    void produitMatrice(double *A,double *B,double *C,int n)
    {
      /* Utilisation des BLAS de niveau 3 - man dgemm pour plus de details */
      double alpha = 1., beta = 0.;
      cblas_dgemm(CblasRowMajor,CblasNoTrans,CblasNoTrans,n,n,n,alpha,A,n,B,n,beta,C,n);
    }
    


Notice: Undefined index: SCRIPT_FILENAME in /mnt/114/sda/5/e/thomas.leduc/lib/formatage.php on line 49

Copyright © Thomas LEDUC, version 0.2, le 1 janvier 1970.
Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'thomas.leduc'@'172.20.245.56' (using password: YES) in /mnt/114/sda/5/e/thomas.leduc/lib/mysql.php on line 20

Notice: sql.free.fr thomas.leduc PASSWD ... est injoignable !; in /mnt/114/sda/5/e/thomas.leduc/lib/divers.php on line 6