diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b7244e811556284ced33f1a27c7131c9d11c8f4c..52b8c75cbe604605253f494a5b744193384f8326 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -18,6 +18,7 @@ debian:10 gcc-7-14--expensive: DUNECI_CXXFLAGS: -mavx DUNECI_TEST_LABELS: "" DUNECI_TOOLCHAIN: gcc-7-14 + DUNE_TEST_EXPECTED_VC_IMPLEMENTATION: AVX # require AVX to properly test Vc tags: [duneci, "iset:avx"] # allowed to fail to e.g. do no hold up a merge when a runner supporting avx diff --git a/dune/common/test/CMakeLists.txt b/dune/common/test/CMakeLists.txt index 91cea6180047b5dbd69bfd1e85dd09b2e039f949..77c63862454b3dd00d58d3a2453a20af0067dfe1 100644 --- a/dune/common/test/CMakeLists.txt +++ b/dune/common/test/CMakeLists.txt @@ -412,6 +412,12 @@ dune_add_test(SOURCES varianttest.cc LINK_LIBRARIES dunecommon LABELS quick) +dune_add_test(SOURCES vcexpectedimpltest.cc + LINK_LIBRARIES dunecommon + LABELS quick + CMAKE_GUARD Vc_FOUND) +add_dune_vc_flags(vcexpectedimpltest) + install( FILES arithmetictestsuite.hh diff --git a/dune/common/test/vcexpectedimpltest.cc b/dune/common/test/vcexpectedimpltest.cc new file mode 100644 index 0000000000000000000000000000000000000000..4da519c6b06c92a33b4a0350900a63566d6d7771 --- /dev/null +++ b/dune/common/test/vcexpectedimpltest.cc @@ -0,0 +1,71 @@ +#include "config.h" + +#if !HAVE_VC +#error Inconsistent buildsystem. This program should not be built in the \ + absence of Vc. +#endif + +#include <cstdlib> +#include <map> +#include <iostream> +#include <string> + +#include <dune/common/exceptions.hh> +#include <dune/common/vc.hh> + +const std::map<Vc::Implementation, std::string> impl_names = { + {Vc::ScalarImpl, "Scalar" }, + {Vc::SSE2Impl, "SSE2" }, + {Vc::SSE3Impl, "SSE3" }, + {Vc::SSSE3Impl, "SSSE3" }, + {Vc::SSE41Impl, "SSE41" }, + {Vc::SSE42Impl, "SSE42" }, + {Vc::AVXImpl, "AVX" }, + {Vc::AVX2Impl, "AVX2" }, + {Vc::MICImpl, "MIC" }, +}; + +const std::string expected_var = "DUNE_TEST_EXPECTED_VC_IMPLEMENTATION"; + +int main() +{ + + auto p = impl_names.find(Vc::CurrentImplementation::current()); + if(p == impl_names.end()) + DUNE_THROW(Dune::NotImplemented, "Unexpected current implementation value " + << Vc::CurrentImplementation::current()); + auto current_impl = p->second; + + std::cout << "The current Vc implementation is " << current_impl + << std::endl; + + std::string expected_impl; + if(auto env_impl = std::getenv(expected_var.c_str())) + expected_impl = env_impl; + + if(expected_impl.empty()) + { + std::cerr << "No expected vc imlementation provided, skipping test\n" + << "Please set " << expected_var + << " environment variable to one of the following values:"; + for(const auto &item : impl_names) + std::cerr << ' ' << item.second; + std::cerr << std::endl; + return 77; + } + + std::cout << "The expected Vc implementation is " << expected_impl + << std::endl; + + if(current_impl == expected_impl) { + std::cout << "OK: Current and expected Vc implementation match" + << std::endl; + return 0; + } + else { + std::cout << "Error: Current Vc implementation does not match expected" + << std::endl; + return 1; + } + +}