From 379dadfdbfddd85d874ea00b740e60c9f05e02d3 Mon Sep 17 00:00:00 2001 From: Timo Heister Date: Mon, 31 Aug 2015 09:10:12 -0400 Subject: [PATCH] Revert "Remove the test affinity.cc." This reverts commit 384d5c60b376a25c4e7b65b1e4c5364767dd449d. --- tests/quick_tests/CMakeLists.txt | 5 ++ tests/quick_tests/affinity.cc | 81 ++++++++++++++++++++++++++++++++ tests/quick_tests/run.cmake | 11 ++++- 3 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 tests/quick_tests/affinity.cc diff --git a/tests/quick_tests/CMakeLists.txt b/tests/quick_tests/CMakeLists.txt index aa5c7425c1..1647fc7835 100644 --- a/tests/quick_tests/CMakeLists.txt +++ b/tests/quick_tests/CMakeLists.txt @@ -80,6 +80,11 @@ FOREACH(_build ${DEAL_II_BUILD_TYPES}) make_quicktest("step" ${_build} "") ENDFOREACH() +# Test whether thread affinity is well behaved +IF (DEAL_II_WITH_THREADS) +make_quicktest("affinity" ${_mybuild} "") +ENDIF() + # Test if MPI is configured correctly IF (DEAL_II_WITH_MPI) make_quicktest("mpi" ${_mybuild} 2) diff --git a/tests/quick_tests/affinity.cc b/tests/quick_tests/affinity.cc new file mode 100644 index 0000000000..24bb167541 --- /dev/null +++ b/tests/quick_tests/affinity.cc @@ -0,0 +1,81 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2013 - 2015 by the deal.II authors +// +// This file is part of the deal.II library. +// +// The deal.II library is free software; you can use it, redistribute +// it, and/or modify it under the terms of the GNU Lesser General +// Public License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// The full text of the license can be found in the file LICENSE at +// the top level of the deal.II distribution. +// +// --------------------------------------------------------------------- + +#include +#include +#include + +#if defined(__linux__) +#include +#include +#endif + +bool getaffinity(unsigned int &bits_set,unsigned int &mask) +{ + bits_set = 0; + mask = 0x00; + +#if defined(__linux__) + cpu_set_t my_set; + CPU_ZERO(&my_set); + + unsigned int len = sizeof(my_set); + int ret = sched_getaffinity(0, len, &my_set); + + if (ret!=0) + { + printf("sched_getaffinity() failed, return value: %d\n", ret); + return false; + } + for (int i=0;i test; + + unsigned int bits_set, mask; + if (!getaffinity(bits_set, mask)) + return 1; + + unsigned int nprocs = dealii::MultithreadInfo::n_cores(); + unsigned int tbbprocs = dealii::MultithreadInfo::n_threads(); + printf("aff_ncpus=%d, mask=%08X, nprocs=%d, tbb_threads=%d\n", + bits_set, mask, nprocs, tbbprocs ); + + if (bits_set !=0 && bits_set!=nprocs) + { + printf("Warning: sched_getaffinity() returns that we can only use %d out of %d CPUs.\n",bits_set, nprocs); + return 2; + } + if (nprocs != tbbprocs) + { + printf("Warning: for some reason TBB only wants to use %d out of %d CPUs.\n", + tbbprocs, nprocs); + return 3; + } + + return 0; +} diff --git a/tests/quick_tests/run.cmake b/tests/quick_tests/run.cmake index 77527d1104..e941ff0b65 100644 --- a/tests/quick_tests/run.cmake +++ b/tests/quick_tests/run.cmake @@ -1,6 +1,6 @@ ## --------------------------------------------------------------------- ## -## Copyright (C) 2015 by the deal.II authors +## Copyright (C) 2013 by the deal.II authors ## ## This file is part of the deal.II library. ## @@ -34,6 +34,15 @@ to the mailing list linked at http://www.dealii.org\n" ) FOREACH(test ${ALL_TESTS}) + IF (${test} MATCHES "^affinity" AND NOT EXISTS ${test}-OK) + MESSAGE(" +The affinity test can fail when you are linking in a library like BLAS +which uses OpenMP. Even without calling any BLAS functions, OpenMP messes +with the thread affinity which causes TBB to run single-threaded only. You +can fix this by exporting OMP_NUM_THREADS=1.\n" + ) + ENDIF() + IF (${test} MATCHES "^step-petsc" AND NOT EXISTS ${test}-OK) MESSAGE(" Additional information about PETSc issues is available -- 2.39.5