Changes between Version 51 and Version 52 of Next-GenOpenMPTransformation


Ignore:
Timestamp:
11/06/19 15:42:53 (7 years ago)
Author:
wuwenhao
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Next-GenOpenMPTransformation

    v51 v52  
    626626
    627627{{{
     628// global
     629$_omp_helper_semaphore critical_ = $_omp_helper_semaphore_create(0);
     630$_omp_helper_semaphore critical_x = $_omp_helper_semaphore_create(0);
    628631...
    629 _Bool critical_ = $false;
    630 _Bool critical_x = $false;
    631 
    632 ...
    633632
    634633// 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);
    638638  translate(BLOCK_A)
    639   critical_ = $false;
     639  $_omp_helper_semaphore_v(critical_, 0);
    640640
    641641// 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);
    645646  translate(BLOCK_X);
    646   critical_x = $false;
     647  $_omp_helper_semaphore_v(critical_x, 0);
    647648}}}
    648649
     
    681682
    682683{{{
    683 int order_counter0 = INIT; //global
     684// global helper lock
     685$_omp_helper_semaphore ordered_0 = $_omp_helper_semaphore_create(INIT);
    684686  ..
    685687{
     
    688690
    689691  $for (int i : loop_dist) {
    690      ...
     692    int i_next = i + I_INCR;
     693    ...
    691694    $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    ...
    697701  }
    698702}
     
    702706
    703707{{{
    704 #pragma omp parallel for collapse(2) ordered
     708#pragma omp parallel for collapse(3) ordered
    705709for (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);
    717724
    718725{ // worksharing-loop construct (begin)
    719726  ..
    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
    721732    $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
    729750      }
    730751    }