Notice: Undefined variable: SERVER_ADDR in /mnt/114/sda/5/e/thomas.leduc/constantes.php on line 20
<a name='TDM'>Bref tutoriel concernant la mise en oeuvre d'OpenMP en C sur un SGI-Origin 2000...</a>
[ accueil | doctorat | Java | JavaScript | faqs | cours ]

rdv sur mon nouveau site - visit my new website

Bref tutoriel concernant la mise en oeuvre d'OpenMP en C sur un SGI-Origin 2000...

Notes importantes :
Index :
  1. Premier exemple
  2. Deuxième exemple - opération de réduction
  3. Troisième exemple - boucle for
  4. Quatrième exemple - boucle for et opération de réduction
  5. Cinquième exemple - application au calcul d'une valeur approchée de PI
  6. Sixième exemple - couplage OpenMP et MPI





  1. Premier exemple
  2. #include <stdio.h>
    #include <stdlib.h>
    #include <omp.h>
    
    int main(int argc,char *argv[])
    {
      /********************* debut region parallele *********************/
    #pragma omp parallel 
      {
        printf("[%s:%d] : thread %d/%d, nbproc = %d\n",__FILE__,__LINE__,
    	   omp_get_thread_num()+1,omp_get_num_threads(),omp_get_num_procs());
      }
      /********************* fin region parallele *********************/
      return EXIT_SUCCESS;
    }
    
  3. Deuxième exemple - opération de réduction
  4. #include <stdio.h>
    #include <stdlib.h>
    #include <omp.h>
    
    int main(int argc,char *argv[])
    {
      int quiSuisJe,somme=0,nbproc;
      /********************* debut region parallele *********************/
    #pragma omp parallel shared(nbproc) private(quiSuisJe) reduction(+:somme)
      {
        nbproc = omp_get_num_threads();
        quiSuisJe = omp_get_thread_num()+1;
        somme += quiSuisJe;
        printf("[thread %d/%d] : somme intermediaire = %d\n",
    	   quiSuisJe,nbproc,somme);
      }
      /********************* fin region parallele *********************/
      printf("somme totale apres reduction = %d (theorique = %d)\n",
    	 somme,(nbproc*(nbproc+1))/2);
      return EXIT_SUCCESS;
    }
    
  5. Troisième exemple - boucle for
  6. #include <stdio.h>
    #include <stdlib.h>
    #include <omp.h>
    
    int main(int argc,char *argv[])
    {
      int i,N=10,tableau[N];
      for (i=0 ; i<N ; i++) 
        tableau[i]=1;
      /********************* debut region parallele *********************/
    #pragma omp parallel for shared(tableau) private(i,N)
      for (i=0 ; i<N ; i++) 
        tableau[i] += omp_get_thread_num();
      /********************* fin region parallele *********************/
      for (i=0 ; i<N ; i++) 
        printf("[%d]=%d ",i,tableau[i]);
      printf("\n");
      return EXIT_SUCCESS;
    }
    
  7. Quatrième exemple - boucle for et opération de réduction
  8. #include <stdio.h>
    #include <stdlib.h>
    #include <omp.h>
    
    int main(int argc,char *argv[])
    {
      int i , somme = 0 , N = atoi(argv[1]);
      /********************* debut region parallele *********************/
    #pragma omp parallel for firstprivate(N) private(i) reduction(+:somme)
      for(i=1 ; i<=N ; i++)
        {
          somme += i;
          printf("[thread %d/%d] : somme intermediaire = %d\n",
    	     omp_get_thread_num()+1,omp_get_num_threads(),somme);
        }
      /********************* fin region parallele *********************/
      printf("somme des entiers de 1 a %d apres reduction = %d (theorique = %d)\n",
    	 N,somme,(N*(N+1))/2);
      return EXIT_SUCCESS;
    }
    
  9. Cinquième exemple - application au calcul d'une valeur approchée de PI
  10. #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <omp.h>
    
    #define f(a) (4.0 / (1.0 + (a)*(a)))
    
    #ifdef _OPENMP
    /* 
     * si l'on compile avec l'option -mp, cette region est activee car le "drapeau
     * _OPENMP" est positionne. Si l'option -mp n'est pas specifiee a la
     * compilation, on "fait" du sequentiel pur ! 
     */
    #define TYPECOMPILATION "parallele"
    #else
    #define TYPECOMPILATION "sequentiel"
    #endif
    
    int question()
    {
      int n=0;
      printf("Entrez le nombre d'intervalles (et 0 pour terminer) : ");
      scanf("%d",&n);
      return n;
    }
    
    int main(int argc,char *argv[])
    {
      typedef enum{false=0,true=1} boolean;
      double somme,pas,pi,piRef = 3.141592653589793;
      int n,i;
      boolean continuer = true;
    
      while (continuer) {
        if ((n = question()) == 0) 
          continuer = false;
        else {      
          pas = 1.0/(double)n;
          somme = 0.0;
          /********************* debut region potentiellement parallele *********************/
    #ifdef _OPENMP
    /* 
     * si l'on compile avec l'option -mp, cette region est activee car le "drapeau
     * _OPENMP" est positionne. Si l'option -mp n'est pas specifiee a la
     * compilation, on "fait" du sequentiel pur !
     */
    #pragma omp parallel for firstprivate(n) private(i) reduction(+:somme)
    #endif
          for (i=1; i<=n; i++)
    	somme += f(pas * ((double)i - 0.5));
          /********************* fin region potentiellement parallele *********************/
          pi = pas * somme;
          printf("Valeur approchee de PI : %.15f, Erreur : %.15f\n",
    	     pi, fabs(pi - piRef));
          printf("Calcul %s sur %d intervalles.\n",TYPECOMPILATION,n);
        }
      }
      return EXIT_SUCCESS;
    }
    
  11. Sixième exemple - couplage OpenMP et MPI
  12. #include <stdio.h>
    #include <stdlib.h>
    #include <mpi.h>
    #include <omp.h>
    
    int main(int argc,char *argv[])
    {
      int rang,nbpcs;
      double debut,fin; /* chronometrage */
      char nomProcesseur[MPI_MAX_PROCESSOR_NAME];
      int longNomProcesseur;
    
      debut = MPI_Wtime();
      if (MPI_Init(&argc,&argv) != MPI_SUCCESS)
            exit(EXIT_FAILURE);
    
      MPI_Get_processor_name(nomProcesseur,&longNomProcesseur);
      MPI_Comm_rank(MPI_COMM_WORLD,&rang);
      MPI_Comm_size(MPI_COMM_WORLD,&nbpcs);
    
      /********************* debut region OpenMP *********************/
    #pragma parallel numthreads(3)
      {
        printf("processus MPI %d/%d sur %s -- tache OpenMP %d/%d\n",
    	   rang,nbpcs,nomProcesseur,
               omp_get_thread_num(),omp_get_num_threads());
      }
      /********************* fin region OpenMP *********************/
      MPI_Finalize();
    
      fin = MPI_Wtime();
      printf("processus MPI %d/%d meurt apres %g secondes\n",
    	 rang,nbpcs,fin-debut);
    
      return EXIT_SUCCESS;
    }
    

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