Skip to content

Commit

Permalink
Develop (#7)
Browse files Browse the repository at this point in the history
* added new microbenchmarks covering three set of rules of data-sharing attributes
* added two more benchmarks for static data members: in or not inside a construct
* added two new benchmarks for dynamic storage duration
* added benchmarks for locally declared static, threadprivate for variable within a construct
* added two more benchmarks to cover rules controlling the number of associated loops
* added benchmarks using collapse() and ordered()
* added two benchmarks to cover taskloop construct
* improved target tests: add teams+distribute
* added a counter example into static-local-orig-yes.c
* added a benchmark for multiple loops associated with SIMD
* added a benchmark for target + map for array sections derived from pointers
* added two benchmarks to cover implicitly determined rules for task generating constructs
* added benchmarks with orphaned task using pass-by-reference
* added copyprivate, copyin benchmarks
* added benchmarks using nowait, taskwait.
* added benchmarks using atomic, taskgroup, ordered.
* changed version number and GCC note
* added warning for compilers not supporting OpenMP 4.5
* reduced recursion level to avoid seg fault
* Mention contributions from Rice University
* sanity check: support c++ code compilations using both gcc and Intel compilers
* categorize single and master examples as N1, extended to include single thread execution
* parallel+if()
* target teams with data races
* ordered(2) example refined
* omp for+linear requires OpenMP 4.5
* refined taskwait examples, list OpenMP 4.5 benchmarks
* added assertion for one task-depend test
* avoid printf() in parallel tasks
* Renamed all 116 micro-benchmarks to DRBxxx-name where xxx is the 3-digit benchmark number.
* Moved all polybench header files into directory polybench. Adapted polyhedral benchmarks to refer to those headerfiles.
* Suggest GCC 7.x for robust OpenMP 4.5 support
* replaced new with nnew so c++ compilers can be used
* Updated README.md with adapted micro-benchmark file names that have the with prefix 'DRD<ID>-' in the filename now.
* Updated test-harness.sh for new features:
(1) cpp support
(2) timeout with -s option
(3) store id, compile-return-code and runtime-return-code in csv file

* fixed hidden data race in dead code (utilities/polybench.c)
* revised the taskwait missing program to avoid seg fault
* changed int to long int to work with large integer like 2e9 (DRB065)
* Fixed description for two wrong dependence relations (thanks to Franke Ye from GaTech for spotting them).
  • Loading branch information
chunhualiao authored and mschordan committed Jun 5, 2018
1 parent 2493459 commit 44be1a2
Show file tree
Hide file tree
Showing 124 changed files with 3,119 additions and 140 deletions.
203 changes: 129 additions & 74 deletions README.md

Large diffs are not rendered by default.

36 changes: 36 additions & 0 deletions check-data-races.sh
Expand Up @@ -46,6 +46,7 @@

OPTION=$1
TESTS=$(grep -l main micro-benchmarks/*.c)
CPPTESTS=$(grep -l main micro-benchmarks/*.cpp)
POLYFLAG="micro-benchmarks/utilities/polybench.c -I micro-benchmarks -I micro-benchmarks/utilities -DPOLYBENCH_NO_FLUSH_CACHE -DPOLYBENCH_TIME -D_POSIX_C_SOURCE=200112L"

if [[ -z "$OPTION" || "$OPTION" == "--help" ]]; then
Expand All @@ -55,6 +56,7 @@ if [[ -z "$OPTION" || "$OPTION" == "--help" ]]; then
echo "--help : this option"
echo "--small : compile and test all benchmarks using small parameters with Helgrind, ThreadSanitizer, Archer, Intel inspector."
echo "--run : compile and run all benchmarks with gcc (no evaluation)"
echo "--run-intel: compile and run all benchmarks with Intel compilers (no evaluation)"
echo "--helgrind : compile and test all benchmarks with Helgrind"
echo "--tsan : compile and test all benchmarks with clang ThreadSanitizer"
echo "--archer : compile and test all benchmarks with Archer"
Expand All @@ -80,9 +82,43 @@ if [[ "$OPTION" == "--run" ]]; then
./a.out > /dev/null
done
rm -f ./a.out
# test for cpp files
for test in $CPPTESTS; do
echo "------------------------------------------"
echo "RUNNING: $test"
CFLAGS="-g -Wall -fopenmp"
if grep -q 'PolyBench' "$test"; then CFLAGS+=" $POLYFLAG"; fi
g++ $CFLAGS "$test" -lm
./a.out > /dev/null
done
rm -f ./a.out
exit
fi

if [[ "$OPTION" == "--run-intel" ]]; then
for test in $TESTS; do
echo "------------------------------------------"
echo "RUNNING: $test"
CFLAGS="-g -Wall -std=c99 -fopenmp"
if grep -q 'PolyBench' "$test"; then CFLAGS+=" $POLYFLAG"; fi
icc $CFLAGS "$test" -lm
./a.out > /dev/null
done
rm -f ./a.out
# test for cpp files
for test in $CPPTESTS; do
echo "------------------------------------------"
echo "RUNNING: $test"
CFLAGS="-g -Wall -fopenmp"
if grep -q 'PolyBench' "$test"; then CFLAGS+=" $POLYFLAG"; fi
icpc $CFLAGS "$test" -lm
./a.out > /dev/null
done
rm -f ./a.out
exit
fi


if [[ "$OPTION" == "--helgrind" ]]; then
scripts/test-harness.sh -x helgrind
fi
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Expand Up @@ -60,7 +60,7 @@ int main()
{
int i,error;
int len = 1000;
int a[1000], b=5;
int a[len], b=5;

for (i=0; i<len; i++)
a[i]= i;
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Expand Up @@ -58,7 +58,7 @@ int main(int argc, char* argv[])
for (i=0; i<len; i++)
a[i]= i;

#pragma omp target
#pragma omp target map(a[0:len])
#pragma omp parallel for
for (i=0;i< len -1 ;i++)
a[i]=a[i+1]+1;
Expand Down
Expand Up @@ -57,9 +57,9 @@ int main()
#pragma omp parallel
#pragma omp single
{
#pragma omp task shared(i)
#pragma omp task
i = 1;
#pragma omp task shared(i)
#pragma omp task
i = 2;
}

Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Expand Up @@ -11,10 +11,10 @@
#include <string.h>
#include <math.h>
/* Include polybench common header. */
#include <polybench.h>
#include "polybench/polybench.h"
/* Include benchmark-specific header. */
/* Default data type is double, default size is 4000. */
#include "3mm.h"
#include "polybench/3mm.h"
/* Array initialization. */

static void init_array(int ni,int nj,int nk,int nl,int nm,double A[128 + 0][128 + 0],double B[128 + 0][128 + 0],double C[128 + 0][128 + 0],double D[128 + 0][128 + 0])
Expand Down
Expand Up @@ -11,10 +11,10 @@
#include <string.h>
#include <math.h>
/* Include polybench common header. */
#include <polybench.h>
#include "polybench/polybench.h"
/* Include benchmark-specific header. */
/* Default data type is double, default size is 4000. */
#include "3mm.h"
#include "polybench/3mm.h"
/* Array initialization. */

static void init_array(int ni,int nj,int nk,int nl,int nm,double A[128 + 0][128 + 0],double B[128 + 0][128 + 0],double C[128 + 0][128 + 0],double D[128 + 0][128 + 0])
Expand Down
Expand Up @@ -12,10 +12,10 @@
#include <string.h>
#include <math.h>
/* Include polybench common header. */
#include <polybench.h>
#include "polybench/polybench.h"
/* Include benchmark-specific header. */
/* Default data type is double, default size is 10x1024x1024. */
#include "adi.h"
#include "polybench/adi.h"
/* Array initialization. */

static void init_array(int n,double X[500 + 0][500 + 0],double A[500 + 0][500 + 0],double B[500 + 0][500 + 0])
Expand Down
Expand Up @@ -11,10 +11,10 @@
#include <string.h>
#include <math.h>
/* Include polybench common header. */
#include <polybench.h>
#include "polybench/polybench.h"
/* Include benchmark-specific header. */
/* Default data type is double, default size is 10x1024x1024. */
#include "adi.h"
#include "polybench/adi.h"
/* Array initialization. */

static void init_array(int n,double X[500 + 0][500 + 0],double A[500 + 0][500 + 0],double B[500 + 0][500 + 0])
Expand Down
File renamed without changes.
64 changes: 64 additions & 0 deletions micro-benchmarks/DRB046-doall2-orig-no.c
@@ -0,0 +1,64 @@
/*
Copyright (c) 2017, Lawrence Livermore National Security, LLC.
Produced at the Lawrence Livermore National Laboratory
Written by Chunhua Liao, Pei-Hung Lin, Joshua Asplund,
Markus Schordan, and Ian Karlin
(email: liao6@llnl.gov, lin32@llnl.gov, asplund1@llnl.gov,
schordan1@llnl.gov, karlin1@llnl.gov)
LLNL-CODE-732144
All rights reserved.
This file is part of DataRaceBench. For details, see
https://github.com/LLNL/dataracebench. Please also see the LICENSE file
for our additional BSD notice.
Redistribution and use in source and binary forms, with
or without modification, are permitted provided that the following
conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the disclaimer below.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the disclaimer (as noted below)
in the documentation and/or other materials provided with the
distribution.
* Neither the name of the LLNS/LLNL nor the names of its contributors
may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL LAWRENCE LIVERMORE NATIONAL
SECURITY, LLC, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE.
*/

/*
Two-dimensional array computation:
Only one loop is associated with the omp for construct.
The inner loop's loop iteration variable needs an explicit private() clause,
otherwise it will be shared by default.
*/

int a[100][100];
int main()
{
int i,j;
#pragma omp parallel for private(j)
for (i=0;i<100;i++)
for (j=0;j<100;j++)
a[i][j]=a[i][j]+1;
return 0;
}

File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Expand Up @@ -11,10 +11,10 @@
#include <string.h>
#include <math.h>
/* Include polybench common header. */
#include <polybench.h>
#include "polybench/polybench.h"
/* Include benchmark-specific header. */
/* Default data type is double, default size is 20x1000. */
#include "jacobi-2d-imper.h"
#include "polybench/jacobi-2d-imper.h"
/* Array initialization. */

static void init_array(int n,double A[500 + 0][500 + 0],double B[500 + 0][500 + 0])
Expand Down
Expand Up @@ -11,10 +11,10 @@
#include <string.h>
#include <math.h>
/* Include polybench common header. */
#include <polybench.h>
#include "polybench/polybench.h"
/* Include benchmark-specific header. */
/* Default data type is double, default size is 20x1000. */
#include "jacobi-2d-imper.h"
#include "polybench/jacobi-2d-imper.h"
/* Array initialization. */

static void init_array(int n,double A[500 + 0][500 + 0],double B[500 + 0][500 + 0])
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Expand Up @@ -47,7 +47,7 @@ THE POSSIBILITY OF SUCH DAMAGE.
/*
Only the outmost loop can be parallelized.
The inner loop has loop carried anti data dependence.
The inner loop has loop carried true data dependence.
However, the loop is not parallelized so no race condition.
*/
int n=100, m=100;
Expand Down
Expand Up @@ -54,7 +54,7 @@ Classic PI calculation using reduction
int main(int argc, char** argv)
{
double pi = 0.0;
int i;
long int i;
double x, interval_width;
interval_width = 1.0/(double)num_steps;

Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Expand Up @@ -45,21 +45,20 @@ THE POSSIBILITY OF SUCH DAMAGE.
*/

/*
use of omp target
use of omp target: len is not mapped. It should be firstprivate within target.
*/
int main(int argc, char* argv[])
{
int i;
int len = 1000;

int a[1000];
int a[len];

for (i=0; i<len; i++)
a[i]= i;

#pragma omp target
#pragma omp target map(a[0:len])
#pragma omp parallel for
for (i=0;i< len -1 ;i++)
for (i=0;i< len;i++)
a[i]=a[i]+1;

return 0;
Expand Down
File renamed without changes.
Expand Up @@ -43,13 +43,13 @@ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE.
*/

#include <stdio.h>
/*
Two-dimensional array computation using loops: missing private(j).
References to j in the loop cause data races.
Data race pairs (we allow multiple ones to preserve the pattern):
Write_set = {j@61:10, j@61:20}
Read_set = {j@62:20, j@62:12, j62@:14, j61@:20}
Read_set = {j@62:20, j@62:12, j61@:14, j61@:20}
Any pair from Write_set vs. Write_set and Write_set vs. Read_set is a data race pair.
*/
int a[100][100];
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Expand Up @@ -49,14 +49,18 @@ Two tasks with depend clause to ensure execution order, no data races.
i is shared for two tasks based on implicit data-sharing attribute rules.
*/
#include <assert.h>
#include <unistd.h>
int main()
{
int i=0;
#pragma omp parallel
#pragma omp single
{
#pragma omp task depend (out:i)
i = 1;
{
sleep(3);
i = 1;
}
#pragma omp task depend (out:i)
i = 2;
}
Expand Down
Expand Up @@ -48,19 +48,25 @@ THE POSSIBILITY OF SUCH DAMAGE.
tasks with depend clauses to ensure execution order, no data races.
*/
#include <stdio.h>
#include <assert.h>
#include <unistd.h>
int main()
{
int i=0;
int i=0, j, k;
#pragma omp parallel
#pragma omp single
{
#pragma omp task depend (out:i)
i = 1;
{
sleep(3);
i = 1;
}
#pragma omp task depend (in:i)
printf ("x=%d\n", i);
j =i;
#pragma omp task depend (in:i)
printf ("x=%d\n", i);
k =i;
}

printf ("j=%d k=%d\n", j, k);
assert (j==1 && k==1);
return 0;
}

0 comments on commit 44be1a2

Please sign in to comment.