From d9ae85ce4b3c20d94673e5860477362b12f69581 Mon Sep 17 00:00:00 2001 From: Rodrigo Arias Mallo Date: Thu, 23 Nov 2023 15:23:15 +0100 Subject: [PATCH] Add a more strict test for OpenMP+nOS-V In this test we ensure that the worksharing region is running inside a nOS-V task, so we know that we are not using the vanilla OpenMP by accident. We also keep the previous test test/compilers/clang-openmp.nix as-is, so we can check that the compiler injects the nosv library dependency in the final binary on its own. Reviewed-by: Aleix Roca Nonell --- overlay.nix | 3 ++ test/compilers/clang-openmp-nosv.nix | 60 ++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 test/compilers/clang-openmp-nosv.nix diff --git a/overlay.nix b/overlay.nix index 0389975..c82c2ac 100644 --- a/overlay.nix +++ b/overlay.nix @@ -78,6 +78,9 @@ in bscPkgs // { clangNosvOpenmp-task = callPackage ./test/compilers/clang-openmp.nix { stdenv = final.stdenvClangOmpss2OpenmpNodes; }; + clangNosvOpenmp-nosv = callPackage ./test/compilers/clang-openmp-nosv.nix { + stdenv = final.stdenvClangOmpss2OpenmpNodes; + }; }; pkgs = final.runCommand "ci-pkgs" { } diff --git a/test/compilers/clang-openmp-nosv.nix b/test/compilers/clang-openmp-nosv.nix new file mode 100644 index 0000000..f257537 --- /dev/null +++ b/test/compilers/clang-openmp-nosv.nix @@ -0,0 +1,60 @@ +{ + stdenv +, nosv +, writeText +}: + +let + hello_c = writeText "hello.c" '' + #include + #include + #include + int main(int argc, char *argv[]) + { + int test = 1; + #pragma omp parallel + #pragma omp single + #pragma omp task + { + if (nosv_self() == NULL) { + printf("nosv_self() returned NULL\n"); + exit(1); + } else { + printf("nosv_self() INSIDE TASK OK\n"); + } + test = 0; + } + + return test; + } + ''; + +in stdenv.mkDerivation { + pname = "openmp-test-nosv"; + version = "1.0.0"; + + dontUnpack = true; + dontConfigure = true; + + # nOS-V requires access to /sys/devices to request NUMA information. It will + # fail to run otherwise, so we disable the sandbox for this test. + __noChroot = true; + + buildInputs = [ nosv ]; + + buildPhase = '' + set -x + + cp ${hello_c} hello.c + clang -fopenmp ./hello.c -lnosv -o hello + ./hello | grep "INSIDE TASK OK" + + set +x + ''; + + installPhase = '' + touch $out + ''; + +} +