Changeset 1127 in Sophya for trunk/Eval/Speed/tompC.c


Ignore:
Timestamp:
Aug 7, 2000, 10:58:19 AM (25 years ago)
Author:
ansari
Message:

Ameliorations tests OpenMP - Reza 7/8/2000

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Eval/Speed/tompC.c

    r991 r1127  
     1/* ------ programme de test des capacites OpenMP ------ */
     2/*      Calcul parallele sur plusieurs processeurs      */
     3/* (C) R. Ansari     LAL/IN2P3-CNRS           2000      */
     4
    15#include <stdlib.h>
    26#include <stdio.h>
    3 
     7#include <math.h>
     8
     9#ifdef _OPENMP
     10#include <omp.h>
     11#endif
     12
     13/* Declaration de fonctions de calcul de temps CPU - timg.h .c  */
    414void InitTim();
    515void PrtTim(char *);
    616
    7 void Mult(int n, double *v1, double *v2, double *v3);
    8 void MultOMP(int n, double *v1, double *v2, double *v3);
    9 
    10 int main (int narg, char *arg[])
    11 {
    12 int i,j, N, M;
    13 
    14 double *v1, *v2, *v3;
     17/* Declaration des fonctions de ce fichier */
     18void Mult(long n, double *v1, double *v2, double *v3);
     19void MultB(long b, double *v1, double *v2, double *v3);
     20void Check(long n, double *v3, double *v3ck);
     21void Mult_OMP(long n, double *v1, double *v2, double *v3);
     22void MultB_OMP(long b, double *v1, double *v2, double *v3);
     23void MultB_OMP2(long b, double *v1, double *v2, double *v3);
     24void MultB_OMP3(long b, double *v1, double *v2, double *v3);
     25void getBlock(long b, long* off1, long* off2, long* off3, long* sz);
     26/* void getBlock(long b, long& off1, long& off2, long& off3, long& sz); C++ */
     27void fillRandom(long n, double *v1, double *v2);
     28
     29
     30/* Variables statiques globales */
     31static long M,N,B,BSz;
     32static int omp_nthr = 4;
     33
     34/* --- main() --- */
     35int main (long narg, char *arg[])
     36{
     37long i;
     38
     39double *v1, *v2, *v3, *v3ck;
    1540
    1641if (narg < 2) {
    17   printf("\n Usage tompC P/x [N M] \n \n");
    18   printf(" P --> Calling MultOMP, x ---> Calling Mult \n");
    19   printf(" N (=100): External loop number   M : Array Size (500000) \n");
    20   exit(0);
    21 }
    22 N = 100;
    23 M = 500000;
    24 if (narg > 2) N = atoi(arg[2]);
    25 if (narg > 3) M = atoi(arg[3]);
    26 
     42  printf("\n Usage tompC P/p/S/s [N BSz B OMP_NThr]  (Test OpenMP) \n \n");
     43  printf(" P /P2 /P3 -> Calling MultB_OMP /2/3  p -> Calling Mult_OMP \n");
     44  printf(" S -> Calling MultB , s -> Calling Mult \n");
     45  printf(" N (=10): External loop number  BSz : BlockSize Size (50000) \n");
     46  printf(" B : Nb of Blocks 100 \n");
     47  printf(" OMP_NThr : Number of OpenMP threads (def = 4) \n \n");
     48  return(0);
     49}
     50
     51N = 10;
     52BSz = 50000;
     53B = 100;
     54if (narg > 2) N = atol(arg[2]);
     55if (narg > 3) BSz = atol(arg[3]);
     56if (narg > 4) B = atol(arg[4]);
     57
     58M = B*BSz;
     59
     60omp_nthr = 4;
     61if (narg > 5) omp_nthr = atol(arg[5]);
     62
     63printf("\n tompC :  M (ArrSize)= %ld   NLoop= %ld  NBlock= %ld  BlockSize=%ld \n",
     64       M,N,B,BSz);
     65 
    2766InitTim();
    2867
    29 v1 = (double *)malloc(M*sizeof(double));
    30 v2 = (double *)malloc(M*sizeof(double));
    31 v3 = (double *)malloc(M*sizeof(double));
    32  for(i=0; i<M; i++) { v1[i] = random()%1000;  v2[i] = random()%5000; }
     68v1 = malloc (M*sizeof(double));
     69v2 = malloc (M*sizeof(double));
     70v3 = malloc (M*sizeof(double));
     71v3ck = malloc (M*sizeof(double));
     72
     73/*  Remplissage initiale   */
     74fillRandom(M, v1, v2);
     75Mult(M, v1, v2, v3ck);
     76
    3377PrtTim("End of Init ");
    3478
     79#ifdef _OPENMP
     80if ((*arg[1] == 'P') || (*arg[1] == 'p'))
     81  {
     82    omp_set_num_threads(omp_nthr);
     83    printf(" tompC NumThreads= %d (Max=%d)  NumProcs= %d \n", omp_get_num_threads(),
     84           omp_get_max_threads(), omp_get_num_procs());
     85  }
     86#endif
     87
     88/*  Fonctions avec OpenMP  */
    3589if (*arg[1] == 'P') {
    36   printf("Calling N=%d times MultOMP(Size= %d) \n", N, M);
    37   for(i=0; i<N; i++) MultOMP(M, v1, v2, v3);
    38 }
    39 else {
     90  if (*(arg[2]+1) == '2') {   /* Double boucle - OpenMP parallel boucle externe */
     91    printf("Calling N=%d times MultB_OMP2(Size= %d) \n", N, M);
     92    for(i=0; i<N; i++) {
     93      MultB_OMP2(B, v1, v2, v3);
     94      printf("%d ", i);  fflush(stdout);
     95    }
     96    printf("  ... Done \n"); 
     97  }
     98  else if (*(arg[2]+1) == '3') { /* Double boucle - Nested parallel */
     99    printf("Calling N=%d times MultB_OMP3(Size= %d) \n", N, M);
     100    for(i=0; i<N; i++) {
     101      MultB_OMP3(B, v1, v2, v3); 
     102      printf("%d ", i);  fflush(stdout);
     103    }
     104    printf("  ... Done \n"); 
     105  }
     106  else {  /* boucle double - OpenMP parallel boucle externe  */
     107    printf("Calling N=%d times MultB_OMP(Size= %d) \n", N, M);
     108    for(i=0; i<N; i++) {
     109      MultB_OMP(B, v1, v2, v3);
     110      printf("%d ", i);  fflush(stdout);
     111    }
     112    printf("  ... Done \n"); 
     113  }
     114}
     115 else if (*arg[1] == 'p') { /* boucle simple - OpenMP */
     116  printf("Calling N=%d times Mult_OMP(Size= %d) \n", N, M);
     117  for(i=0; i<N; i++) {
     118    Mult_OMP(M, v1, v2, v3);
     119    printf("%d ", i);  fflush(stdout);
     120    }
     121  printf("  ... Done \n"); 
     122}
     123
     124/* Fonctions SANS OpenMP (scalaire)  */
     125else if (*arg[1] == 'S') { /* Double boucle  */
     126  printf("Calling N=%d times MultB(Size= %d) \n", N, M);
     127  for(i=0; i<N; i++) {
     128    MultB(B, v1, v2, v3);
     129    printf("%d ", i);  fflush(stdout);
     130    }
     131  printf("  ... Done \n"); 
     132}
     133 else if (*arg[1] == 's') { /* Boucle simple */
    40134  printf("Calling N=%d times Mult(Size= %d) \n", N, M);
    41   for(i=0; i<N; i++) Mult(M, v1, v2, v3);
    42 }
    43 
    44 PrtTim("End of Multiplication ");
     135  for(i=0; i<N; i++) {
     136    Mult(M, v1, v2, v3);
     137    printf("%d ", i);  fflush(stdout);
     138  }
     139  printf("  ... Done \n"); 
     140}
     141
     142
     143PrtTim("End of Mult-Operation ");
     144
     145Check(M, v3, v3ck);
     146
     147PrtTim("End of programme ");
     148
    45149
    46150free(v1);
    47151free(v2);
    48152free(v3);
    49 
    50 exit(0);
    51 }
    52 
    53 
    54 void Mult(int n, double *v1, double *v2, double *v3)
    55 {
    56 int k;
     153free(v3ck);
     154
     155return(0);
     156}
     157
     158/* --Fonction-- */
     159void fillRandom(long n, double *v1, double *v2)
     160/* Remplissage aleatoire de tableaux v1 v2 */
     161{
     162  long off,nn,k,i;
     163  double x1;
     164  long nbk = (B < 20) ? 20 : B;
     165  nn = n/nbk;
     166  for(k=0; k<nn; k++) {
     167    v1[k] = random()%10000;
     168    v2[k] = random()%14000;
     169  }
     170  for(i=1; i<nbk; i++) {
     171    off = i*nn;
     172    v1[k+off] = v1[k];
     173    v2[k+off] = v2[k];
     174  }
     175  x1 = random()%18000;
     176  if (nn*nbk < n)
     177    for(k=nn*nbk; k<n; k++) v1[k] = v2[k] = x1;
     178
     179  return;
     180}
     181
     182/* --Fonction-- */
     183/* void  getBlock(long b, long& off1, long& off2, long& off3, long& sz)  C++ */
     184void  getBlock(long b, long* off1, long* off2, long* off3, long* sz)
     185/* Numero , offset de blocks */
     186{
     187  if ( (b < 0) || (b >= B) ) {
     188    /*    cerr << " ERROR getBlock( b= " << b << " ??? " << endl;
     189          throw 999;
     190    C++ */ 
     191    printf(" ERROR getBlock( b= %ld ???? \n", b);
     192    exit(99); 
     193  }
     194  /*  sz = BSz;
     195  off1 = off2 = off3 = b*BSz;
     196  C++ */
     197  *sz = BSz;
     198  *off1 = *off2 = *off3 = b*BSz;
     199 
     200  return ;
     201}
     202
     203/* --Fonction-- */
     204void Check(long n, double *v3, double *v3ck)
     205/*  Verification egalite v3 v3ck */
     206{
     207long npb;
     208long k;
     209 npb = 0;
     210for(k=0; k<n; k++)
     211  if (fabs(v3[k]-v3ck[k]) > 1.e-39)  npb++;
     212
     213 if (npb == 0)
     214   printf("  Check() - OK   NPB=0 / N= %ld\n", n);
     215 /*   cout << "  Check() - OK   NPB=0 / N= " << n << endl;  C++ */
     216 else
     217   printf("  PB Check() !!! - OK   NPB= %ld / N= %ld", npb,n);
     218/*   cout << "  PB Check() !!! - OK   NPB= " << npb << " / N= " << n << endl; C++ */
     219
     220}
     221
     222
     223/* --Fonction-- */
     224void Mult(long n, double *v1, double *v2, double *v3)
     225/* Multiplication - boucle simple v3 = v1*v2  */
     226{
     227long k;
    57228for(k=0; k<n; k++)
    58229  v3[k] = v1[k] * v2[k];
    59230}
    60231
    61 void MultOMP(int n, double *v1, double *v2, double *v3)
    62 {
    63 int k;
    64 #pragma omp parallel for
     232
     233/* --Fonction-- */
     234void Mult_OMP(long n, double *v1, double *v2, double *v3)
     235/* Multiplication - boucle simple - OpenMP v3 = v1*v2  */
     236{
     237long k;
     238#ifdef _OPENMP
     239omp_set_num_threads(omp_nthr);   
     240#pragma omp parallel for schedule(static)
     241#endif
    65242for(k=0; k<n; k++)
    66243  v3[k] = v1[k] * v2[k];
    67244}
     245
     246
     247/* --Fonction-- */
     248void MultB(long b, double *vv1, double *vv2, double *vv3)
     249/* Multiplication - boucle double (par block) v3 = v1*v2  */
     250{
     251  long k,i;
     252  long sz, off1,off2,off3;
     253  double *v1, *v2, *v3;
     254  for(k=0; k<b; k++) {
     255    getBlock(k, &off1, &off2, &off3, &sz);
     256    v1 = vv1+off1;
     257    v2 = vv2+off2;
     258    v3 = vv3+off3;
     259    for(i=0; i<sz; i++)
     260      v3[i] = v1[i] * v2[i];
     261  }
     262}
     263
     264/* --Fonction-- */
     265void MultB_OMP(long b, double *vv1, double *vv2, double *vv3)
     266/* Multiplication - boucle double (par block) - OpenMP v3 = v1*v2  */
     267{
     268  long k,i,ub;
     269  long sz, off1,off2,off3;
     270  double *v1, *v2, *v3;
     271
     272  ub = b;
     273#ifdef _OPENMP
     274  if (b>1)
     275    omp_set_num_threads((b<omp_nthr)?b:omp_nthr);   
     276#pragma omp parallel for if(b>1) private(v1,v2,v3,k,i,off1,off2,off3,sz) schedule(static)
     277#endif
     278  for(k=0; k<ub; k++) {
     279    getBlock(k, &off1, &off2, &off3, &sz);
     280    v1 = vv1+off1;
     281    v2 = vv2+off2;
     282    v3 = vv3+off3;
     283    for(i=0; i<sz; i++)
     284      v3[i] = v1[i] * v2[i];
     285  }
     286}
     287
     288/* --Fonction-- */
     289void MultB_OMP2(long b, double *vv1, double *vv2, double *vv3)
     290/* Multiplication - boucle double (par block) - OpenMP v3 = v1*v2  */
     291{
     292  long k,i;
     293  long sz, off1,off2,off3;
     294  double *v1, *v2, *v3;
     295#ifdef _OPENMP
     296  if (b>1)
     297    omp_set_num_threads((b<omp_nthr)?b:omp_nthr);   
     298#pragma omp  parallel  if(b>1)
     299{
     300#pragma omp  single
     301  printf("MultB_OMP2()  NumThr= %d \n", omp_get_num_threads());
     302#pragma omp for private(v1,v2,v3,k,i,off1,off2,off3,sz) schedule(static)
     303#endif
     304  for(k=0; k<b; k++) {
     305    getBlock(k, &off1, &off2, &off3, &sz);
     306    v1 = vv1+off1;
     307    v2 = vv2+off2;
     308    v3 = vv3+off3;
     309    for(i=0; i<sz; i++)
     310      v3[i] = v1[i] * v2[i];
     311  }
     312#ifdef _OPENMP
     313}
     314#endif
     315
     316}
     317
     318/* --Fonction-- */
     319void MultB_OMP3(long b, double *vv1, double *vv2, double *vv3)
     320/* Multiplication - boucle double (par block) - OpenMP v3 = v1*v2  */
     321{
     322  long k,i;
     323  long sz, off1,off2,off3;
     324  double *v1, *v2, *v3;
     325#ifdef _OPENMP
     326  if (b>1)
     327    omp_set_num_threads((b<omp_nthr)?b:omp_nthr);   
     328#pragma omp  parallel  if(b>1)
     329{
     330#pragma omp  single
     331  printf("MultB_OMP3()  NumThr= %d \n", omp_get_num_threads());
     332#pragma omp for private(v1,v2,v3,k,i,off1,off2,off3,sz) schedule(static)
     333#endif
     334  for(k=0; k<b; k++) {
     335    getBlock(k, &off1, &off2, &off3, &sz);
     336    v1 = vv1+off1;
     337    v2 = vv2+off2;
     338    v3 = vv3+off3;
     339#ifdef _OPENMP
     340#pragma omp  parallel 
     341{
     342#pragma omp  single
     343  if (k==0) printf("MultB_OMP3() -pragma2- NumThr= %d \n", omp_get_num_threads());
     344#pragma omp for private(i) schedule(static)
     345#endif
     346    for(i=0; i<sz; i++)
     347      v3[i] = v1[i] * v2[i];
     348#ifdef _OPENMP
     349}
     350#endif
     351  }
     352#ifdef _OPENMP
     353}
     354#endif
     355
     356}
     357
Note: See TracChangeset for help on using the changeset viewer.