Changeset 102 for proiecte


Ignore:
Timestamp:
Jan 12, 2010, 9:13:16 PM (14 years ago)
Author:
(none)
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • proiecte/Parallel-DT/R8/Src/build.c

    r82 r102  
    3030MultiVal; /* true when all atts have many values */
    3131
     32/* Variables for parallel version */
     33ItemCount
     34***Freq_discr, /* Freq_discr[tid][x][c] = no. items of class c with outcome x */
     35**ValFreq_discr; /* ValFreq_discr[tid][x]   = no. items with outcome x */
     36
     37float
     38**UnknownRate_discr; /* UnknownRate[tid][a] = current unknown rate for att a */
     39
    3240/*  External variables initialised here  */
    3341
     
    5159/*  ------------------  */
    5260{
    53         DiscrValue v;
     61        DiscrValue v, i, nrThreads;
    5462        Attribute a;
    5563
     
    100108        }
    101109
    102 
     110        /* Initializing parallel variables */
     111        nrThreads = omp_get_max_threads();
     112        Freq_discr = (ItemCount***) calloc (nrThreads, sizeof(ItemCount**));
     113        ValFreq_discr = (ItemCount**) calloc (nrThreads, sizeof(ItemCount*));
     114        UnknownRate_discr = (float**) calloc (nrThreads, sizeof(float*));
     115
     116        for(i = 0; i < nrThreads; i++){
     117                Freq_discr[i] = (ItemCount **) calloc(MaxDiscrVal + 1, sizeof(ItemCount *));
     118                ForEach(v, 0, MaxDiscrVal) {
     119                        Freq_discr[i][v] = (ItemCount *) calloc(MaxClass + 1, sizeof(ItemCount));
     120                }
     121
     122                ValFreq_discr[i] = (ItemCount *) calloc(MaxDiscrVal + 1, sizeof(ItemCount));
     123                UnknownRate_discr[i] = (float *) calloc(MaxAtt + 1, sizeof(float));
     124        }
    103125}
    104126
     
    158180        /*  Generate the class frequency distribution  */
    159181
    160         // ########### begin parallel region ############## //
    161         //#pragma omp parallel default(shared)
    162         //{
    163 
    164                 //printf("The parallel region is executed by thread %d\n", omp_get_thread_num());
    165                 /* THIS CAN BE PARALELIZED */
    166                 //#pragma omp for private(c)
    167                         ForEach(c, 0, MaxClass) {
    168                                 ClassFreq[c] = 0;
    169                         }
    170 
    171                 /* THIS CAN BE PARALELIZED */
    172                 //#pragma omp for private(i)
    173                         ForEach(i, Fp, Lp) {
    174                                 //#pragma omp atomic
    175                                 ClassFreq[Class(Item[i])] += Weight[i];
    176                         }
    177         //}
     182        ForEach(c, 0, MaxClass) {
     183                ClassFreq[c] = 0;
     184        }
     185
     186        ForEach(i, Fp, Lp) {
     187                ClassFreq[Class(Item[i])] += Weight[i];
     188        }
     189
    178190
    179191        /*  Find the most frequent class  */
     
    358370        ClassNo c, BestClass;
    359371        Tree Node, Leaf();
    360         DiscrValue v;
     372        DiscrValue v, thread_id;
    361373        Boolean PrevAllKnown;
    362         ItemCount** Freq_discr, *ValFreq_discr;
    363         float* UnknownRate_discr;
    364374
    365375        Cases = CountItems(Fp, Lp);
    366376
    367377        /*  Generate the class frequency distribution  */
    368 
    369         // ########### begin parallel region ############## //
    370         //#pragma omp parallel
    371         //{
    372                 //printf("The parallel region is executed by thread %d\n", omp_get_thread_num());
    373                 /* THIS CAN BE PARALELIZED */
    374                 //#pragma omp for private(c)
    375                         ForEach(c, 0, MaxClass) {
    376                                 ClassFreq[c] = 0;
    377                         }
    378 
    379                 /* THIS CAN BE PARALELIZED */
    380                 //#pragma omp for private(i)
    381                         ForEach(i, Fp, Lp) {
    382                                 //#pragma omp atomic
    383                                 ClassFreq[Class(Item[i])] += Weight[i];
    384                         }
    385         //}
     378        ForEach(c, 0, MaxClass) {
     379                ClassFreq[c] = 0;
     380        }
     381
     382        ForEach(i, Fp, Lp) {
     383                ClassFreq[Class(Item[i])] += Weight[i];
     384        }
    386385
    387386        /*  Find the most frequent class  */
    388         /* THIS CAN BE PARALELIZED */
    389387        BestClass = 0;
    390388
     
    412410        /*  For each available attribute, find the information and gain  */
    413411        /* THIS MUST BE PARALELIZED */
    414         #pragma omp parallel default(shared) shared(Possible, AvGain) private(v, Freq_discr, ValFreq_discr, UnknownRate_discr)
     412        #pragma omp parallel if (Lp - Fp > 500) shared(Possible, AvGain) private(thread_id, Att)
    415413        {
    416                 Freq_discr = (ItemCount **) calloc(MaxDiscrVal + 1, sizeof(ItemCount *));
    417                 ForEach(v, 0, MaxDiscrVal) {
    418                         Freq_discr[v] = (ItemCount *) calloc(MaxClass + 1, sizeof(ItemCount));
    419                 }
    420 
    421                 ValFreq_discr = (ItemCount *) calloc(MaxDiscrVal + 1, sizeof(ItemCount));
    422                 UnknownRate_discr = (float *) calloc(MaxAtt + 1, sizeof(float));
    423 
    424 
    425                         #pragma omp for private(Att) schedule(static)
     414                        #pragma omp for private(Att) reduction(+:Possible, AvGain)
    426415                        ForEach(Att, 0, MaxAtt) {
    427416                                Gain[Att] = -Epsilon;
     
    436425                                                        EvalSubset(Att, Fp, Lp, Cases);
    437426                                                } else if (!Tested[Att]) {
    438 
    439                                                         EvalDiscreteAtt_Discr(Att, Fp, Lp, Cases, Freq_discr, ValFreq_discr, UnknownRate_discr);
     427                                                        thread_id = omp_get_thread_num();
     428                                                        EvalDiscreteAtt_Discr(Att, Fp, Lp, Cases, Freq_discr[thread_id],
     429                                                                        ValFreq_discr[thread_id], UnknownRate_discr[thread_id], &Gain[Att], &Info[Att]);
    440430                                                }
    441431                                        } else {
    442432                                                /*  continuous attribute  */
    443 
    444433                                                EvalContinuousAtt(Att, Fp, Lp);
    445434                                        }
    446435
    447436                                        /*  Update average gain, excluding attributes with very many values  */
    448                                         #pragma omp critical
    449                                         {
    450                                                 if (Gain[Att] > -Epsilon && (MultiVal || MaxAttVal[Att] < 0.3 * (MaxItem + 1))){
    451                                                         //#pragma omp atomic
    452                                                         Possible++;
    453 
    454                                                         //#pragma omp atomic
    455                                                         AvGain += Gain[Att];
    456                                                 }
     437
     438                                        if (Gain[Att] > -Epsilon && (MultiVal || MaxAttVal[Att] < 0.3 * (MaxItem + 1))){
     439                                                //#pragma omp atomic
     440                                                Possible++;
     441
     442                                                //#pragma omp atomic
     443                                                AvGain += Gain[Att];
    457444                                        }
    458                         }
    459 
    460                         free(UnknownRate_discr);
    461                         free(ValFreq_discr);
    462                         ForEach(v, 0, MaxDiscrVal) {
    463                                 free(Freq_discr[v]);
    464                         }
    465                         free(Freq_discr);
    466 
    467         }
    468 
    469                 /*  Find the best attribute according to the given criterion  */
    470                 //#pragma omp single
    471                 //{
    472                         BestVal = -Epsilon;
    473                         BestAtt = None;
    474                         AvGain = (Possible ? AvGain / Possible : 1E6);
    475 
    476                         Verbosity(2) {
    477                                 if (AvGain < 1E6)
    478                                         printf("\taverage gain %.3f\n", AvGain);
    479                         }
    480 
    481                         ForEach(Att, 0, MaxAtt) {
    482                                 if (Gain[Att] > -Epsilon) {
    483                                         Val = Worth(Info[Att], Gain[Att], AvGain);
    484                                         if (Val > BestVal) {
    485                                                 BestAtt = Att;
    486                                                 BestVal = Val;
    487                                         }
    488                                 }
    489                         }
    490                 //}
    491         //}
     445
     446                        }
     447        }
     448
     449        /*  Find the best attribute according to the given criterion  */
     450
     451        BestVal = -Epsilon;
     452        BestAtt = None;
     453        AvGain = (Possible ? AvGain / Possible : 1E6);
     454
     455        Verbosity(2) {
     456                if (AvGain < 1E6)
     457                        printf("\taverage gain %.3f\n", AvGain);
     458        }
     459
     460        ForEach(Att, 0, MaxAtt) {
     461                if (Gain[Att] > -Epsilon) {
     462                        Val = Worth(Info[Att], Gain[Att], AvGain);
     463                        if (Val > BestVal) {
     464                                BestAtt = Att;
     465                                BestVal = Val;
     466                        }
     467                }
     468        }
     469
    492470        /*  Decide whether to branch or not  */
    493471
     
    679657        //Lwt = Weight + Lp;
    680658
    681         //#pragma omp parallel for reduction(+:Sum)
    682659        for (i = Fp; i <= Lp; i++) {
    683660                Sum += Weight[i];
Note: See TracChangeset for help on using the changeset viewer.