diff options
author | Hans Wennborg <hans@hanshq.net> | 2018-08-03 10:18:17 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2018-08-03 10:18:17 +0000 |
commit | 366ce74b85790ed41f94fba7f17a0911bde83500 (patch) | |
tree | b996a7c7cea1063732c7ca2f6497d4a24cfa8143 | |
parent | e7966c0b8702d4b9f93641a8f4f0ee55136c264f (diff) |
Merging r338757:release_70
------------------------------------------------------------------------
r338757 | jlpeyton | 2018-08-02 21:13:07 +0200 (Thu, 02 Aug 2018) | 8 lines
[OpenMP] Fix doacross testing for gcc
This patch adds a test using the doacross clauses in OpenMP and removes gcc from
testing kmp_doacross_check.c which is only testing the kmp rather than the
gomp interface.
Differential Revision: https://reviews.llvm.org/D50014
------------------------------------------------------------------------
git-svn-id: https://llvm.org/svn/llvm-project/openmp/branches/release_70@338844 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | cmake/OpenMPTesting.cmake | 5 | ||||
-rw-r--r-- | runtime/test/worksharing/for/kmp_doacross_check.c | 6 | ||||
-rw-r--r-- | runtime/test/worksharing/for/omp_doacross.c | 60 |
3 files changed, 70 insertions, 1 deletions
diff --git a/cmake/OpenMPTesting.cmake b/cmake/OpenMPTesting.cmake index 165435f..1514d99 100644 --- a/cmake/OpenMPTesting.cmake +++ b/cmake/OpenMPTesting.cmake @@ -87,7 +87,9 @@ function(set_test_compiler_information dir) # Determine major version. string(REGEX MATCH "[0-9]+" major "${OPENMP_TEST_C_COMPILER_VERSION}") + string(REGEX MATCH "[0-9]+\\.[0-9]+" majorminor "${OPENMP_TEST_C_COMPILER_VERSION}") set(OPENMP_TEST_COMPILER_VERSION_MAJOR "${major}" PARENT_SCOPE) + set(OPENMP_TEST_COMPILER_VERSION_MAJOR_MINOR "${majorminor}" PARENT_SCOPE) endif() endfunction() @@ -117,6 +119,7 @@ else() # Cannot use CLANG_VERSION because we are not guaranteed that this is already set. set(OPENMP_TEST_COMPILER_VERSION "${LLVM_VERSION}") set(OPENMP_TEST_COMPILER_VERSION_MAJOR "${LLVM_MAJOR_VERSION}") + set(OPENMP_TEST_COMPILER_VERSION_MAJOR_MINOR "${LLVM_MAJOR_VERSION}.${LLVM_MINOR_VERSION}") # TODO: Implement blockaddress in GlobalISel and remove this flag! set(OPENMP_TEST_COMPILER_OPENMP_FLAGS "-fopenmp -fno-experimental-isel") endif() @@ -131,7 +134,7 @@ function(set_test_compiler_features) # Just use the lowercase of the compiler ID as fallback. string(TOLOWER "${OPENMP_TEST_COMPILER_ID}" comp) endif() - set(OPENMP_TEST_COMPILER_FEATURES "['${comp}', '${comp}-${OPENMP_TEST_COMPILER_VERSION_MAJOR}', '${comp}-${OPENMP_TEST_COMPILER_VERSION}']" PARENT_SCOPE) + set(OPENMP_TEST_COMPILER_FEATURES "['${comp}', '${comp}-${OPENMP_TEST_COMPILER_VERSION_MAJOR}', '${comp}-${OPENMP_TEST_COMPILER_VERSION_MAJOR_MINOR}', '${comp}-${OPENMP_TEST_COMPILER_VERSION}']" PARENT_SCOPE) endfunction() set_test_compiler_features() diff --git a/runtime/test/worksharing/for/kmp_doacross_check.c b/runtime/test/worksharing/for/kmp_doacross_check.c index a088965..59b61e3 100644 --- a/runtime/test/worksharing/for/kmp_doacross_check.c +++ b/runtime/test/worksharing/for/kmp_doacross_check.c @@ -1,4 +1,10 @@ // RUN: %libomp-compile-and-run +// UNSUPPORTED: gcc +// This test is incompatible with gcc because of the explicit call to +// __kmpc_doacross_fini(). gcc relies on an implicit call to this function +// when the last iteration is executed inside the GOMP_loop_*_next() functions. +// Hence, in gcc, having the explicit call leads to __kmpc_doacross_fini() +// being called twice. #include <stdio.h> #define N 1000 diff --git a/runtime/test/worksharing/for/omp_doacross.c b/runtime/test/worksharing/for/omp_doacross.c new file mode 100644 index 0000000..4187112 --- /dev/null +++ b/runtime/test/worksharing/for/omp_doacross.c @@ -0,0 +1,60 @@ +// RUN: %libomp-compile-and-run +// XFAIL: gcc-4, gcc-5, clang-3.7, clang-3.8, icc-15, icc-16 +#include <stdio.h> +#include <stdlib.h> +#include "omp_testsuite.h" + +#ifndef N +#define N 750 +#endif + +int test_doacross() { + int i, j; + // Allocate and zero out the matrix + int *m = (int *)malloc(sizeof(int) * N * N); + for (i = 0; i < N; ++i) { + for (j = 0; j < N; ++j) { + m[i * N + j] = 0; + } + } + // Have first row and column be 0, 1, 2, 3, etc. + for (i = 0; i < N; ++i) + m[i * N] = i; + for (j = 0; j < N; ++j) + m[j] = j; + // Perform wavefront which results in matrix: + // 0 1 2 3 4 + // 1 2 3 4 5 + // 2 3 4 5 6 + // 3 4 5 6 7 + // 4 5 6 7 8 + #pragma omp parallel shared(m) + { + int row, col; + #pragma omp for ordered(2) + for (row = 1; row < N; ++row) { + for (col = 1; col < N; ++col) { + #pragma omp ordered depend(sink : row - 1, col) depend(sink : row, col - 1) + m[row * N + col] = m[(row - 1) * N + col] + m[row * N + (col - 1)] - + m[(row - 1) * N + (col - 1)]; + #pragma omp ordered depend(source) + } + } + } + + // Check the bottom right element to see if iteration dependencies were held + int retval = (m[(N - 1) * N + N - 1] == 2 * (N - 1)); + free(m); + return retval; +} + +int main(int argc, char **argv) { + int i; + int num_failed = 0; + for (i = 0; i < REPETITIONS; i++) { + if (!test_doacross()) { + num_failed++; + } + } + return num_failed; +} |