- Timestamp:
- Jan 12, 2010, 9:13:16 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
proiecte/Parallel-DT/R8/Src/build.c
r82 r102 30 30 MultiVal; /* true when all atts have many values */ 31 31 32 /* Variables for parallel version */ 33 ItemCount 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 37 float 38 **UnknownRate_discr; /* UnknownRate[tid][a] = current unknown rate for att a */ 39 32 40 /* External variables initialised here */ 33 41 … … 51 59 /* ------------------ */ 52 60 { 53 DiscrValue v ;61 DiscrValue v, i, nrThreads; 54 62 Attribute a; 55 63 … … 100 108 } 101 109 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 } 103 125 } 104 126 … … 158 180 /* Generate the class frequency distribution */ 159 181 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 178 190 179 191 /* Find the most frequent class */ … … 358 370 ClassNo c, BestClass; 359 371 Tree Node, Leaf(); 360 DiscrValue v ;372 DiscrValue v, thread_id; 361 373 Boolean PrevAllKnown; 362 ItemCount** Freq_discr, *ValFreq_discr;363 float* UnknownRate_discr;364 374 365 375 Cases = CountItems(Fp, Lp); 366 376 367 377 /* 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 } 386 385 387 386 /* Find the most frequent class */ 388 /* THIS CAN BE PARALELIZED */389 387 BestClass = 0; 390 388 … … 412 410 /* For each available attribute, find the information and gain */ 413 411 /* 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) 415 413 { 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) 426 415 ForEach(Att, 0, MaxAtt) { 427 416 Gain[Att] = -Epsilon; … … 436 425 EvalSubset(Att, Fp, Lp, Cases); 437 426 } 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]); 440 430 } 441 431 } else { 442 432 /* continuous attribute */ 443 444 433 EvalContinuousAtt(Att, Fp, Lp); 445 434 } 446 435 447 436 /* 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]; 457 444 } 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 492 470 /* Decide whether to branch or not */ 493 471 … … 679 657 //Lwt = Weight + Lp; 680 658 681 //#pragma omp parallel for reduction(+:Sum)682 659 for (i = Fp; i <= Lp; i++) { 683 660 Sum += Weight[i];
Note: See TracChangeset
for help on using the changeset viewer.