Changeset 82 for proiecte


Ignore:
Timestamp:
Jan 9, 2010, 6:44:42 PM (14 years ago)
Author:
(none)
Message:
 
File:
1 edited

Legend:

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

    r65 r82  
    1313#include <omp.h>
    1414
     15#define MAX_DISCR_VAL           50
     16#define MAX_CLASS                       50
     17#define MAX_ATT                         50
    1518
    1619ItemCount *Weight, /* Weight[i]  = current fraction of item i */
     
    156159
    157160        // ########### begin parallel region ############## //
    158         #pragma omp parallel default(shared)
    159         {
     161        //#pragma omp parallel default(shared)
     162        //{
    160163
    161164                //printf("The parallel region is executed by thread %d\n", omp_get_thread_num());
    162165                /* THIS CAN BE PARALELIZED */
    163                 #pragma omp for private(c)
     166                //#pragma omp for private(c)
    164167                        ForEach(c, 0, MaxClass) {
    165168                                ClassFreq[c] = 0;
     
    167170
    168171                /* THIS CAN BE PARALELIZED */
    169                 #pragma omp for private(i)
     172                //#pragma omp for private(i)
    170173                        ForEach(i, Fp, Lp) {
    171                                 #pragma omp atomic
     174                                //#pragma omp atomic
    172175                                ClassFreq[Class(Item[i])] += Weight[i];
    173176                        }
    174         }
     177        //}
    175178
    176179        /*  Find the most frequent class  */
     
    357360        DiscrValue v;
    358361        Boolean PrevAllKnown;
    359         ItemCount Freq_discr[MAX_DISCR_VAL + 1][MAX_CLASS + 1], ValFreq_discr[MAX_DISCR_VAL + 1];
    360         float UnknownRate_discr[MAX_ATT + 1];
     362        ItemCount** Freq_discr, *ValFreq_discr;
     363        float* UnknownRate_discr;
    361364
    362365        Cases = CountItems(Fp, Lp);
     
    365368
    366369        // ########### begin parallel region ############## //
    367         #pragma omp parallel default(shared)
    368         {
    369 
     370        //#pragma omp parallel
     371        //{
    370372                //printf("The parallel region is executed by thread %d\n", omp_get_thread_num());
    371373                /* THIS CAN BE PARALELIZED */
    372                 #pragma omp for private(c)
     374                //#pragma omp for private(c)
    373375                        ForEach(c, 0, MaxClass) {
    374376                                ClassFreq[c] = 0;
     
    376378
    377379                /* THIS CAN BE PARALELIZED */
    378                 #pragma omp for private(i)
     380                //#pragma omp for private(i)
    379381                        ForEach(i, Fp, Lp) {
    380                                 #pragma omp atomic
     382                                //#pragma omp atomic
    381383                                ClassFreq[Class(Item[i])] += Weight[i];
    382384                        }
    383         }
     385        //}
    384386
    385387        /*  Find the most frequent class  */
     
    410412        /*  For each available attribute, find the information and gain  */
    411413        /* THIS MUST BE PARALELIZED */
    412         #pragma omp parallel default(shared) private(Freq_discr, ValFreq_discr, UnknownRate_discr)
     414        #pragma omp parallel default(shared) shared(Possible, AvGain) private(v, Freq_discr, ValFreq_discr, UnknownRate_discr)
    413415        {
    414 
    415                         #pragma omp for
     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)
    416426                        ForEach(Att, 0, MaxAtt) {
    417427                                Gain[Att] = -Epsilon;
     
    426436                                                        EvalSubset(Att, Fp, Lp, Cases);
    427437                                                } else if (!Tested[Att]) {
    428                                                         EvalDiscreteAtt_Discr(Att, Fp, Lp, Cases, (ItemCount**)Freq_discr, (ItemCount*)ValFreq_discr, (float*)UnknownRate_discr);
     438
     439                                                        EvalDiscreteAtt_Discr(Att, Fp, Lp, Cases, Freq_discr, ValFreq_discr, UnknownRate_discr);
    429440                                                }
    430441                                        } else {
     
    437448                                        #pragma omp critical
    438449                                        {
    439                                                 if (Gain[Att] > -Epsilon && (MultiVal || MaxAttVal[Att] < 0.3
    440                                                                 * (MaxItem + 1))) {
     450                                                if (Gain[Att] > -Epsilon && (MultiVal || MaxAttVal[Att] < 0.3 * (MaxItem + 1))){
     451                                                        //#pragma omp atomic
    441452                                                        Possible++;
     453
     454                                                        //#pragma omp atomic
    442455                                                        AvGain += Gain[Att];
    443456                                                }
    444457                                        }
    445458                        }
     459
     460                        free(UnknownRate_discr);
     461                        free(ValFreq_discr);
     462                        ForEach(v, 0, MaxDiscrVal) {
     463                                free(Freq_discr[v]);
     464                        }
     465                        free(Freq_discr);
    446466
    447467        }
     
    659679        //Lwt = Weight + Lp;
    660680
    661         #pragma omp parallel for reduction(+:Sum)
     681        //#pragma omp parallel for reduction(+:Sum)
    662682        for (i = Fp; i <= Lp; i++) {
    663683                Sum += Weight[i];
Note: See TracChangeset for help on using the changeset viewer.