| Version 15 (modified by , 7 years ago) ( diff ) |
|---|
OpenMP Constructs
parallelprivate(list)firstprivate(list)copyin(list)shared(list)default(none|shared)num_threads(n)reduction(op:list)
sectionsprivate(list)firstprivate(list)lastprivate(list)reduction(op:list)nowait
section
singleprivate(list)firstprivate(list)copyprivate(list)nowait
forprivate(list)firstprivate(list)lastprivate(list)reductionschedulecollapsenowait
simdsafelen(n)linear(n)aligned(n)privatelastprivatereductioncollaplse
for simdsafelen(n)linear(n)aligned(n)privatelastprivatereductioncollapsefirstprivatenowaitschedule
declare simdsimdlen(n)linearaligned(n)uniforminbranchnotinbranch
barrier
critical[name]
atomicread | write | update | captureseq_cst
master
OpenMP Types
omp_lock_t
OpenMP Functions
omp_get_num_threads()omp_get_thread_num()omp_get_wtime()
OpenMP Functions
omp_init_lockomp_destroy_lockomp_set_lockomp_unset_lockomp_test_lock
Plan
- We are going to get rid of the current OMP2CIVL transformer and come up a new transformer that assumes given OpenMP programs are sequentially consistent
- We are gong to improve the current OmpSimplifier using pointer alias analysis
- Note that an atomic construct without
seq_cstis outside of the sequentially consistent subset of the language, we need a way to deal with that.
Notes
- Currently, the simplifier is not aware of the cases that out-of-bound access on multiple dimensional arrays can raise data race. For example,
int a[10][5]; #pragma omp parallel for for (int i = 0; i < 5; i++) for (int j = 1; j < 10; j++) a[i][j] = a[i][j-1] // a[0][4] and a[1][-1] refer to the same element
The current simplifier will incorrectly sequentialize the example above without realizing the fact that this example is sequentializable if and only if no "logical" out-of-bound happens during the execution. A fix for the simplifier could be sequentializing the example with inserted assertion for making sure that there is no "logical" out-of-bound error.
Related
OpenMP Simplifier
- We improve the existing OpenMP simplifier with the informations provided by the Static Analysis.
- Example 1: (
DRB067-restrictpointer1-orig-no.cfrom DataRaceBench v1.2.0)#include <stdlib.h> typedef double real8; void foo(real8 * restrict newSxx, real8 * restrict newSyy, int length) { int i; #pragma omp parallel for private (i) firstprivate (length) for (i = 0; i <= length - 1; i += 1) { newSxx[i] = 0.0; newSyy[i] = 0.0; } } int main() { int length=10; real8* newSxx = malloc (length* sizeof (real8)); real8* newSyy = malloc (length* sizeof (real8)); foo(newSxx, newSyy, length); free (newSxx); free (newSyy); return 0; }- The OpenMP simplifier analyzes the parallel region with points-to informations about the two pointer argument
newSxxandnewSyyfrom static analysis. - The OpenMP simplifier can determine that no data race will happen in the parallel region as long as no array out-of-bound error happens in it.
- The OpenMP simplifier sequentializes the program which will be checked by CIVL. Any possible array out-of-bound error will be caught by CIVL.
- The OpenMP simplifier analyzes the parallel region with points-to informations about the two pointer argument
Note:
See TracWiki
for help on using the wiki.
