diff --git a/test/rt/openmp/CMakeLists.txt b/test/rt/openmp/CMakeLists.txt index 2a7a4a4..6bb90e0 100644 --- a/test/rt/openmp/CMakeLists.txt +++ b/test/rt/openmp/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2024 Barcelona Supercomputing Center (BSC) +# Copyright (c) 2022-2025 Barcelona Supercomputing Center (BSC) # SPDX-License-Identifier: GPL-3.0-or-later check_c_compiler_flag("-fopenmp=libompv" OPENMPV_COMPILER_FOUND) @@ -37,6 +37,7 @@ function(openmp_rt_test) ENVIRONMENT "NOSV_CONFIG_OVERRIDE=instrumentation.version=ovni") endfunction() +openmp_rt_test(active.c DRIVER active.driver.sh) openmp_rt_test(barrier-explicit.c) openmp_rt_test(critical.c) openmp_rt_test(if0-nested-task.c) @@ -46,6 +47,7 @@ openmp_rt_test(parallel-for.c) openmp_rt_test(parallel-loop.c) openmp_rt_test(parallel-nested.c) openmp_rt_test(parallel-task.c) +openmp_rt_test(passive.c DRIVER passive.driver.sh) openmp_rt_test(sections.c) openmp_rt_test(simple-task.c) openmp_rt_test(task.c) diff --git a/test/rt/openmp/active.c b/test/rt/openmp/active.c new file mode 100644 index 0000000..0e3ea8a --- /dev/null +++ b/test/rt/openmp/active.c @@ -0,0 +1,19 @@ +#include "compat.h" + +/* This test tries to make threads generate as many nosv_pause() calls to try to + * flood the trace as possible. */ + +int main(void) +{ + #pragma omp parallel + #pragma omp single nowait + { + #pragma omp task + { + sleep_us(10000); + } + sleep_us(10000); + } + + return 0; +} diff --git a/test/rt/openmp/active.driver.sh b/test/rt/openmp/active.driver.sh new file mode 100644 index 0000000..20ea262 --- /dev/null +++ b/test/rt/openmp/active.driver.sh @@ -0,0 +1,24 @@ +target=$OVNI_TEST_BIN + +export NOSV_APPID=1 +export OMP_OVNI=1 +export OMP_WAIT_POLICY=active +export OMP_NUM_THREADS=4 +export NOSV_CONFIG_OVERRIDE="instrumentation.version=ovni,ovni.level=3" + +# Repeat several times, as the test is not stable. We only want to be sure that +# we never generate too many events. +for i in $(seq 10); do + rm -rf ovni + + $target + + ovnisort ovni + # No need to emulate + #ovniemu -l ovni + + # Make sure that we only see a low number of threads being paused + ovnitop ovni > top.txt + cat top.txt + awk -v n=500 '/^OHp/ && $2 > n { printf("too many OHp events: %d > %d", $2, n); exit 1 }' < top.txt +done diff --git a/test/rt/openmp/passive.c b/test/rt/openmp/passive.c new file mode 100644 index 0000000..180a0df --- /dev/null +++ b/test/rt/openmp/passive.c @@ -0,0 +1,20 @@ +#include "compat.h" +#include + +/* This test tries to make threads generate as many nosv_pause() calls to try to + * flood the trace as possible. This problem should be solved by the new passive + * mechanism. */ + +int main(void) +{ + #pragma omp parallel + { + if (omp_get_thread_num() == 1) + #pragma omp task + { + sleep_us(10000); + } + } + + return 0; +} diff --git a/test/rt/openmp/passive.driver.sh b/test/rt/openmp/passive.driver.sh new file mode 100644 index 0000000..fbedf40 --- /dev/null +++ b/test/rt/openmp/passive.driver.sh @@ -0,0 +1,23 @@ +target=$OVNI_TEST_BIN + +export NOSV_APPID=1 +export OMP_OVNI=1 +export OMP_WAIT_POLICY=passive +export OMP_NUM_THREADS=4 +export NOSV_CONFIG_OVERRIDE="instrumentation.version=ovni,ovni.level=2" + +# Repeat several times, as the test is not stable. We only want to be sure that +# we never generate too many events. +for i in $(seq 10); do + rm -rf ovni + + $target + + ovnisort ovni + ovniemu -l ovni + + # Make sure that we only see a low number of threads being paused + ovnitop ovni > top.txt + cat top.txt + awk -v n=500 '/^OHp/ && $2 > n { printf("too many OHp events: %d > %d", $2, n); exit 1 }' < top.txt +done