Changes between Version 66 and Version 67 of Next-GenOpenMPTransformation


Ignore:
Timestamp:
03/12/21 18:26:37 (5 years ago)
Author:
wuwenhao
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Next-GenOpenMPTransformation

    v66 v67  
    1111    (Note that it only clean whats in between a pair of right mover and left mover.)
    12123. A barrier is transformed as: barrier() ; check(); clean_all(); barrier();
     134. In a $track{..} scope, both read and write operations of shared variables are tracked for checking data race.
     14    ($tracked_reads() and $tracked_writes() are functions returning a set containing all shared variables read or written.)
    1315
    1416E.g.,
     
    1921  #pragma omp critical(c)
    2022  {
    21   B;
     23    B;
    2224  }
    2325  C;
     
    2830
    2931{{{
    30 $depends_on(/*nothing*/)$atomic{
    31   $track(&rs0, &ws0){  // SetStack: S0
    32   A;
    33   $yield;
    34   $track(&rs1, &ws1){  // SetStack: S0, S1
    35   E;
    36   {
    37     B;
    38   }
    39   X;
    40   $check; // All var. in sets in SetStack
    41   }       // clean S1 -- var. in B
    42   C;
    43   $check;
    44   }
    45 }
    46 }}}
    47 
     32// Init parallel region env.
     33$range _omp_thread_range = 0 .. _omp_nthreads - 1;
     34$domain(1) _omp_dom = ($domain){_omp_thread_range};
     35$omp_gteam _omp_gteam = $omp_gteam_create($here, _omp_nthreads);
     36$for (int _omp_tid: _omp_dom) {
     37  $depends_on(/*nothing*/)$atomic{
     38    $omp_team _omp_team = $omp_team_create($here, _omp_gteam, _omp_tid);
     39    $track{ // RS stack: rs0; WS stack: ws0;
     40      // Enter parallel region
     41      A;
     42      $yield();
     43      $track{ // RS stack: rs0, rs1; WS stack: ws0, ws1;
     44        $when(_omp_critical_c->value == 0);
     45        $track{ // Ignore race on lock
     46           _omp_critical_c->value = 1; // Enter critical block
     47        }
     48        B;
     49        $track{ // Ignore race on lock
     50           _omp_critical_c->value = 1; // Exit critical block
     51        }
     52        $check_data_race(); // 1st check
     53      } // RS stack: rs0; WS stack: ws0; empty sets rs1, ws1;
     54      C;
     55      $check_data_race(); // 2nd check
     56    } // RS stack: <empty>; WS stack: <empty>; empty sets rs0, ws0;
     57  } // end $atomic
     58} // end $for
     59}}}
     60
     61We denotes Ax as thread x executes statement A.
     62Assuming there are two threads t0 and t1,
     63the first $check_data_race()  checks races between:
     64
     65A0,A1; A0,B1;  A1,B0; B0,C1; B1,C0;
     66
     67Then, the second $check_data_race() checks races between:
     68
     69A0,C1; A1,C0; C0,C1;
     70
     71Races between B0 and B1 are disabled, because B is in critical block.
    4872
    4973