Changes between Version 7 and Version 8 of OpenMP-Transformation-Introduction
- Timestamp:
- 07/10/22 03:23:46 (4 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
OpenMP-Transformation-Introduction
v7 v8 49 49 50 50 {{{ 51 void $ check_data_race($mem *rs, $mem *ws, int n, int tid) {51 void $update_memsets($mem *rs, $mem *ws, int tid) { 52 52 rs[tid] = $tracked_reads(); 53 53 ws[tid] = $tracked_writes(); 54 } 55 }}} 56 57 {{{ 58 void $check_data_race($mem *rs, $mem *ws, int tid, int nthreads) { 54 59 $assert( 55 60 $forall (int j: 0 .. nthreads - 1) (j != tid) ==> … … 59 64 } 60 65 }}} 66 67 {{{ 68 void $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 75 void $unlock(lock_t l) { 76 $track{ // Ignore race on lock 77 l->value = 0; // Exit critical block 78 } 79 } 80 }}} 81 61 82 {{{ 62 83 // Init parallel region env. … … 76 97 $track{ 77 98 // Enter parallel region 78 // local memset stacks: rs:={{}}; ws:={{}};79 99 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); 83 102 $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); 90 105 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 98 110 $track_clean(); 99 // local memset stacks: rs:={{}}; ws:={{}};100 111 101 112 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 106 116 } // RS stack: <empty>; WS stack: <empty>; empty sets rs0, ws0; 107 117 } // end $atomic
