Changes between Version 51 and Version 52 of Next-GenOpenMPTransformation
- Timestamp:
- 11/06/19 15:42:53 (7 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Next-GenOpenMPTransformation
v51 v52 626 626 627 627 {{{ 628 // global 629 $_omp_helper_semaphore critical_ = $_omp_helper_semaphore_create(0); 630 $_omp_helper_semaphore critical_x = $_omp_helper_semaphore_create(0); 628 631 ... 629 _Bool critical_ = $false;630 _Bool critical_x = $false;631 632 ...633 632 634 633 // critical block with unspecified name 635 $yield(); 636 $when (!critical_) critical_ = $true; 637 $check_data_race(team); 634 $yield(); 635 $check_data_race(team); 636 $_omp_helper_semaphore_p(critical_, 0); 637 $_omp_helper_semaphore_v(critical_, 1); 638 638 translate(BLOCK_A) 639 critical_ = $false;639 $_omp_helper_semaphore_v(critical_, 0); 640 640 641 641 // critical block with specified name 642 $yield(); 643 $when (!critical_x) critical_x = $true; 644 $check_data_race(team); 642 $yield(); 643 $check_data_race(team); 644 $_omp_helper_semaphore_p(critical_x, 0); 645 $_omp_helper_semaphore_v(critical_x, 1); 645 646 translate(BLOCK_X); 646 critical_x = $false;647 $_omp_helper_semaphore_v(critical_x, 0); 647 648 }}} 648 649 … … 681 682 682 683 {{{ 683 int order_counter0 = INIT; //global 684 // global helper lock 685 $_omp_helper_semaphore ordered_0 = $_omp_helper_semaphore_create(INIT); 684 686 .. 685 687 { … … 688 690 689 691 $for (int i : loop_dist) { 690 ... 692 int i_next = i + I_INCR; 693 ... 691 694 $yield(); 692 $when (order_counter0 == i) { 693 translate(BLOCK); 694 order_counter0 += INCR; 695 } 696 ... 695 // wait until hs0->val is i 696 $_omp_helper_semaphore_p(ordered_0, i); 697 translate(BLOCK); 698 // set hs0->val as i_next 699 $_omp_helper_semaphore_v(ordered_0, i_next); 700 ... 697 701 } 698 702 } … … 702 706 703 707 {{{ 704 #pragma omp parallel for collapse( 2) ordered708 #pragma omp parallel for collapse(3) ordered 705 709 for (i=I_INIT; i<I_COND; i+=I_INCR) 706 for (j=J_INIT; j<J_COND; j+=J_INCR) { 707 #pragma omp ordered 708 BLOCK 709 } 710 }}} 711 712 => 713 714 {{{ 715 int order_counter0 = I_INIT; 716 int order_counter1 = J_INIT; 710 for (j=J_INIT; j<J_COND; j+=J_INCR) 711 for (k=K_INIT; k<K_COND; k+=K_INCR) { 712 #pragma omp ordered 713 BLOCK 714 } 715 }}} 716 717 => 718 719 {{{ 720 // global helper semaphore 721 $_omp_helper_semaphore ordered_0 = $_omp_helper_semaphore_create(I_INIT); 722 $_omp_helper_semaphore ordered_1 = $_omp_helper_semaphore_create(J_INIT); 723 $_omp_helper_semaphore ordered_2 = $_omp_helper_semaphore_create(K_INIT); 717 724 718 725 { // worksharing-loop construct (begin) 719 726 .. 720 $for (int i, j : loop_dist) { 727 $for (int i, j, k: loop_dist) { 728 int i_next = i + I_INCR; 729 int j_next = j + J_INCR; 730 int k_next = k + K_INCR; 731 721 732 $yield(); 722 $when((order_counter0 == i) && (order_counter1 == j)) { 723 translate(BLOCK); 724 725 order_counter1 += J_INCR; 726 if (order_counter1 >= J_COND) { 727 order_counter1 = J_INIT; 728 order_counter0 += I_INCR; 733 $_omp_helper_semaphore_p(ordered_0, i); 734 $_omp_helper_semaphore_p(hs1, j); 735 $_omp_helper_semaphore_p(hs2, k); 736 737 translate(BLOCK); 738 739 if (k_next < K_COND) // hit bound 740 $_omp_helper_semaphore_v(ordered_2, k_next); // incr 741 else { 742 $_omp_helper_semaphore_v(ordered_2, K_INIT); // reset 743 744 if (j_next < J_COND) // hit bound 745 $_omp_helper_semaphore_v(ordered_1, j_next); // incr 746 else { 747 $_omp_helper_semaphore_v(ordered_1, J_INIT); // reset 748 749 $_omp_helper_semaphore_v(ordered_0, i_next); // incr 729 750 } 730 751 }
