Changes between Version 7 and Version 8 of OpenMP-Transformation-Introduction


Ignore:
Timestamp:
07/10/22 03:23:46 (4 years ago)
Author:
wuwenhao
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • OpenMP-Transformation-Introduction

    v7 v8  
    4949
    5050{{{
    51 void $check_data_race($mem *rs, $mem *ws, int n, int tid) {
     51void $update_memsets($mem *rs, $mem *ws, int tid) {
    5252  rs[tid] = $tracked_reads();
    5353  ws[tid] = $tracked_writes();
     54}
     55}}}
     56
     57{{{
     58void $check_data_race($mem *rs, $mem *ws, int tid, int nthreads) {
    5459  $assert(
    5560    $forall (int j: 0 .. nthreads - 1) (j != tid) ==>
     
    5964}
    6065}}}
     66
     67{{{
     68void $lock(lock_t l) {
     69  $track{ // Ignore race on lock
     70    $when(l->value == 0);
     71    l->value = 1; // Enter critical block
     72  }
     73}
     74
     75void $unlock(lock_t l) {
     76  $track{ // Ignore race on lock
     77    l->value = 0; // Exit critical block
     78  }
     79}
     80}}}
     81
    6182{{{
    6283// Init parallel region env.
     
    7697    $track{
    7798      // Enter parallel region
    78 // local memset stacks: rs:={{}}; ws:={{}};
    7999      A;
    80 // local memset stacks: rs:={{A}}; ws:={{A}};
    81 // update global memsets RS[tid] and WS[tid] in $yield
    82 // global memses: RS[tid]:={A}; WS[tid]:={A};
     100
     101      $update_memsets(&RS, &WS, tid);
    83102      $yield();
    84 // local memset stacks: rs:={{A}, {}}; ws:={{A}, {}};
    85 
    86       $when(critical_c->value == 0);
    87       $track{ // Ignore race on lock
    88          critical_c->value = 1; // Enter critical block
    89       }
     103
     104      $lock(&critical_c);
    90105      B;
    91 // local memset stacks: rs:={{A}, {B}}; ws:={{A}, {B}};
    92       $track{ // Ignore race on lock
    93          critical_c->value = 0; // Exit critical block
    94       }
    95 // update global memsets RS[tid] and WS[tid] in $check_data_race
    96 // global memses: RS[tid]:={A}U{B}; WS[tid]:={A}U{B};
    97       $check_data_race(&RS, &WS, nthreads, tid); // 1st check
     106      $unlock(critical_c);
     107
     108      $update_memsets(&RS, &WS, tid);
     109      $check_data_race(&RS, &WS, tid, nthreads); // 1st check
    98110      $track_clean();
    99 // local memset stacks: rs:={{}}; ws:={{}};
    100111
    101112      C;
    102 // local memset stacks: rs:={{C}}; ws:={{C}};
    103 // update global memsets RS[tid] and WS[tid] in $check_data_race
    104 // global memses: RS[tid]:={C}; WS[tid]:={C};
    105       $check_data_race(&rs, &ws, nthreads, tid); // 2nd check
     113
     114      $update_memsets(&RS, &WS, tid);
     115      $check_data_race(&rs, &ws, tid, nthreads); // 2nd check
    106116    } // RS stack: <empty>; WS stack: <empty>; empty sets rs0, ws0;
    107117  } // end $atomic