Change affinity enum to enum class
authorBerk Hess <hess@kth.se>
Mon, 24 Jun 2019 20:03:55 +0000 (22:03 +0200)
committerBerk Hess <hess@kth.se>
Fri, 5 Jul 2019 15:37:05 +0000 (17:37 +0200)
Change-Id: I6accea15d82d2e2e911ce1e6f0735b7859b25021

src/gromacs/hardware/hw_info.h
src/gromacs/mdrun/legacymdrunoptions.cpp
src/gromacs/mdrun/legacymdrunoptions.h
src/gromacs/mdrun/runner.cpp
src/gromacs/mdrunutility/tests/threadaffinity.cpp
src/gromacs/mdrunutility/tests/threadaffinity_mpi.cpp
src/gromacs/mdrunutility/tests/threadaffinitytest.cpp
src/gromacs/mdrunutility/tests/threadaffinitytest.h
src/gromacs/mdrunutility/threadaffinity.cpp

index d834c612c847168d893591e7d66eea56c1de05d1..b00648ddb751410b6fdecee56cf39259041dd534 100644 (file)
@@ -92,8 +92,13 @@ struct gmx_hw_info_t
 
 
 /* The options for the thread affinity setting, default: auto */
-enum {
-    threadaffSEL, threadaffAUTO, threadaffON, threadaffOFF, threadaffNR
+enum class ThreadAffinity
+{
+    Select,
+    Auto,
+    On,
+    Off,
+    Count
 };
 
 /*! \internal \brief Threading and GPU options, can be set automatically or by the user
@@ -108,25 +113,25 @@ enum {
 struct gmx_hw_opt_t
 {
     //! Total number of threads requested (thread-MPI + OpenMP).
-    int           nthreads_tot = 0;
+    int            nthreads_tot = 0;
     //! Number of thread-MPI threads requested.
-    int           nthreads_tmpi = 0;
+    int            nthreads_tmpi = 0;
     //! Number of OpenMP threads requested.
-    int           nthreads_omp = 0;
+    int            nthreads_omp = 0;
     //! Number of OpenMP threads to use on PME_only ranks.
-    int           nthreads_omp_pme = 0;
+    int            nthreads_omp_pme = 0;
     //! Thread affinity switch, see enum above.
-    int           thread_affinity = threadaffSEL;
+    ThreadAffinity threadAffinity = ThreadAffinity::Select;
     //! Logical core pinning stride.
-    int           core_pinning_stride = 0;
+    int            core_pinning_stride = 0;
     //! Logical core pinning offset.
-    int           core_pinning_offset = 0;
+    int            core_pinning_offset = 0;
     //! Empty, or a string provided by the user declaring (unique) GPU IDs available for mdrun to use.
-    std::string   gpuIdsAvailable = "";
+    std::string    gpuIdsAvailable = "";
     //! Empty, or a string provided by the user mapping GPU tasks to devices.
-    std::string   userGpuTaskAssignment = "";
+    std::string    userGpuTaskAssignment = "";
     //! Tells whether mdrun is free to choose the total number of threads (by choosing the number of OpenMP and/or thread-MPI threads).
-    bool          totNumThreadsIsAuto;
+    bool           totNumThreadsIsAuto;
 };
 
 #endif
index d773b35312104f2f006b0258b51256675a24ca86..5d029a4a655c95beac9b9f4cb490b59c906028d0 100644 (file)
@@ -136,7 +136,7 @@ int LegacyMdrunOptions::updateFromCommandLine(int argc, char **argv, ArrayRef<co
         }
     }
 
-    hw_opt.thread_affinity = nenum(thread_aff_opt_choices);
+    hw_opt.threadAffinity = static_cast<ThreadAffinity>(nenum(thread_aff_opt_choices));
 
     // now check for a multi-simulation
     ArrayRef<const std::string> multidir = opt2fnsIfOptionSet("-multidir",
index ce9b8e2e683cdba1e3e5fa9f294be5a604c76dc6..5ff0d7a32afc33b10df3525cf0285ba1e405754e 100644 (file)
@@ -144,7 +144,7 @@ class LegacyMdrunOptions
         { nullptr, "interleave", "pp_pme", "cartesian", nullptr };
         const char       *dddlb_opt_choices[static_cast<int>(DlbOption::Count)+1] =
         { nullptr, "auto", "no", "yes", nullptr };
-        const char       *thread_aff_opt_choices[threadaffNR+1] =
+        const char       *thread_aff_opt_choices[static_cast<int>(ThreadAffinity::Count) + 1] =
         { nullptr, "auto", "on", "off", nullptr };
         const char       *nbpu_opt_choices[5] =
         { nullptr, "auto", "cpu", "gpu", nullptr };
index 2fb115f9698286c34baad0bc08dcdad22b1c7c73..db0376b1c729ea177612dba2ac8b266cad215f9d 100644 (file)
@@ -1184,7 +1184,7 @@ int Mdrunner::mdrunner()
                                   *hwinfo->hardwareTopology,
                                   physicalNodeComm, mdlog);
 
-    if (hw_opt.thread_affinity != threadaffOFF)
+    if (hw_opt.threadAffinity != ThreadAffinity::Off)
     {
         /* Before setting affinity, check whether the affinity has changed
          * - which indicates that probably the OpenMP library has changed it
index 251911b88d28f3b5479466afa17cb74b923c0199..7ee3f3d21ba6bc1c2bce94476df81a720d82a1e7 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2019, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -54,7 +54,7 @@ class ThreadAffinityTest : public ::testing::Test
 
 TEST_F(ThreadAffinityTest, DoesNothingWhenDisabled)
 {
-    helper_.setAffinityOption(threadaffOFF);
+    helper_.setAffinityOption(ThreadAffinity::Off);
     helper_.setAffinity(1);
 }
 
@@ -88,7 +88,7 @@ TEST_F(ThreadAffinityTest, DoesNothingWithAutoAndTooManyAutoSetThreads)
 
 TEST_F(ThreadAffinityTest, DoesNothingWithUnknownHardware)
 {
-    helper_.setAffinityOption(threadaffON);
+    helper_.setAffinityOption(ThreadAffinity::On);
     helper_.setLogicalProcessorCount(0);
     helper_.expectWarningMatchingRegex("No information on available cores");
     helper_.setAffinity(2);
@@ -96,7 +96,7 @@ TEST_F(ThreadAffinityTest, DoesNothingWithUnknownHardware)
 
 TEST_F(ThreadAffinityTest, DoesNothingWithTooManyThreads)
 {
-    helper_.setAffinityOption(threadaffON);
+    helper_.setAffinityOption(ThreadAffinity::On);
     helper_.setLogicalProcessorCount(4);
     helper_.expectWarningMatchingRegex("Oversubscribing the CPU");
     helper_.setAffinity(8);
@@ -104,7 +104,7 @@ TEST_F(ThreadAffinityTest, DoesNothingWithTooManyThreads)
 
 TEST_F(ThreadAffinityTest, DoesNothingWithTooLargeOffset)
 {
-    helper_.setAffinityOption(threadaffON);
+    helper_.setAffinityOption(ThreadAffinity::On);
     helper_.setOffsetAndStride(2, 0);
     helper_.setLogicalProcessorCount(4);
     helper_.expectWarningMatchingRegex("Applying core pinning offset 2");
@@ -114,7 +114,7 @@ TEST_F(ThreadAffinityTest, DoesNothingWithTooLargeOffset)
 
 TEST_F(ThreadAffinityTest, DoesNothingWithTooLargeStride)
 {
-    helper_.setAffinityOption(threadaffON);
+    helper_.setAffinityOption(ThreadAffinity::On);
     helper_.setOffsetAndStride(0, 2);
     helper_.setLogicalProcessorCount(4);
     helper_.expectWarningMatchingRegex("Requested stride too large");
@@ -131,7 +131,7 @@ TEST_F(ThreadAffinityTest, PinsSingleThreadWithAuto)
 
 TEST_F(ThreadAffinityTest, PinsSingleThreadWhenForced)
 {
-    helper_.setAffinityOption(threadaffON);
+    helper_.setAffinityOption(ThreadAffinity::On);
     helper_.setLogicalProcessorCount(2);
     helper_.expectPinningMessage(false, 2);
     helper_.expectAffinitySet(0);
@@ -140,7 +140,7 @@ TEST_F(ThreadAffinityTest, PinsSingleThreadWhenForced)
 
 TEST_F(ThreadAffinityTest, PinsSingleThreadWithOffsetWhenForced)
 {
-    helper_.setAffinityOption(threadaffON);
+    helper_.setAffinityOption(ThreadAffinity::On);
     helper_.setOffsetAndStride(2, 0);
     helper_.setLogicalProcessorCount(4);
     helper_.expectWarningMatchingRegex("Applying core pinning offset 2");
@@ -171,7 +171,7 @@ TEST_F(ThreadAffinityTest, PinsMultipleThreadsWithAuto)
 
 TEST_F(ThreadAffinityTest, PinsMultipleThreadsWithStrideWhenForced)
 {
-    helper_.setAffinityOption(threadaffON);
+    helper_.setAffinityOption(ThreadAffinity::On);
     helper_.setOffsetAndStride(0, 2);
     helper_.setLogicalProcessorCount(4);
     helper_.expectPinningMessage(true, 2);
@@ -190,7 +190,7 @@ TEST_F(ThreadAffinityTest, PinsWithAutoAndFewerAutoSetThreads)
 
 TEST_F(ThreadAffinityTest, HandlesPinningFailureWithOneThreadFailing)
 {
-    helper_.setAffinityOption(threadaffON);
+    helper_.setAffinityOption(ThreadAffinity::On);
     helper_.setLogicalProcessorCount(2);
     helper_.expectPinningMessage(false, 1);
     helper_.expectGenericFailureMessage();
index c0bb431f8fc14197b3fb7a8de68c27bbb0522e28..421a06bfcef46bd53f8ea5d56516bf8c03bfa1f7 100644 (file)
@@ -63,7 +63,7 @@ TEST(ThreadAffinityMultiRankTest, PinsWithOffsetAndStride)
 {
     GMX_MPI_TEST(4);
     ThreadAffinityTestHelper helper;
-    helper.setAffinityOption(threadaffON);
+    helper.setAffinityOption(ThreadAffinity::On);
     helper.setOffsetAndStride(1, 2);
     helper.setLogicalProcessorCount(8);
     helper.expectWarningMatchingRegex("Applying core pinning offset 1");
@@ -87,7 +87,7 @@ TEST(ThreadAffinityMultiRankTest, DoesNothingWhenDisabled)
 {
     GMX_MPI_TEST(4);
     ThreadAffinityTestHelper helper;
-    helper.setAffinityOption(threadaffOFF);
+    helper.setAffinityOption(ThreadAffinity::Off);
     helper.setLogicalProcessorCount(4);
     helper.setAffinity(1);
 }
@@ -105,7 +105,7 @@ TEST(ThreadAffinityMultiRankTest, HandlesTooManyThreadsWithForce)
 {
     GMX_MPI_TEST(4);
     ThreadAffinityTestHelper helper;
-    helper.setAffinityOption(threadaffON);
+    helper.setAffinityOption(ThreadAffinity::On);
     helper.setLogicalProcessorCount(6);
     helper.expectWarningMatchingRegex("Oversubscribing the CPU");
     helper.setAffinity(2);
@@ -137,7 +137,7 @@ TEST_F(ThreadAffinityHeterogeneousNodesTest, PinsOnMasterOnly)
 {
     GMX_MPI_TEST(4);
     ThreadAffinityTestHelper helper;
-    helper.setAffinityOption(threadaffON);
+    helper.setAffinityOption(ThreadAffinity::On);
     setupNodes(&helper, {{2, 1}});
     helper.expectWarningMatchingRegexIf("Oversubscribing the CPU", isMaster() || currentNode() == 1);
     if (currentNode() == 0)
@@ -152,7 +152,7 @@ TEST_F(ThreadAffinityHeterogeneousNodesTest, PinsOnNonMasterOnly)
 {
     GMX_MPI_TEST(4);
     ThreadAffinityTestHelper helper;
-    helper.setAffinityOption(threadaffON);
+    helper.setAffinityOption(ThreadAffinity::On);
     setupNodes(&helper, {{1, 2}});
     helper.expectWarningMatchingRegexIf("Oversubscribing the CPU", currentNode() == 0);
     if (currentNode() == 1)
@@ -167,7 +167,7 @@ TEST_F(ThreadAffinityHeterogeneousNodesTest, HandlesUnknownHardwareOnNonMaster)
 {
     GMX_MPI_TEST(4);
     ThreadAffinityTestHelper helper;
-    helper.setAffinityOption(threadaffON);
+    helper.setAffinityOption(ThreadAffinity::On);
     setupNodes(&helper, {{2, 0}});
     helper.expectWarningMatchingRegexIf("No information on available cores", isMaster() || currentNode() == 1);
     if (currentNode() == 0)
@@ -210,7 +210,7 @@ TEST_F(ThreadAffinityHeterogeneousNodesTest, HandlesInvalidOffsetOnNonMasterOnly
 {
     GMX_MPI_TEST(4);
     ThreadAffinityTestHelper helper;
-    helper.setAffinityOption(threadaffON);
+    helper.setAffinityOption(ThreadAffinity::On);
     helper.setOffsetAndStride(2, 0);
     setupNodes(&helper, {{4, 2}});
     helper.expectWarningMatchingRegex("Applying core pinning offset 2");
@@ -227,7 +227,7 @@ TEST_F(ThreadAffinityHeterogeneousNodesTest, HandlesInvalidStrideOnNonMasterOnly
 {
     GMX_MPI_TEST(4);
     ThreadAffinityTestHelper helper;
-    helper.setAffinityOption(threadaffON);
+    helper.setAffinityOption(ThreadAffinity::On);
     helper.setOffsetAndStride(0, 2);
     setupNodes(&helper, {{4, 2}});
     helper.expectWarningMatchingRegexIf("Requested stride too large", isMaster() || currentNode() == 1);
index 152960491a84c04e4ff164c431544a5995817f21..bb672c096272b507d9c05d4b4f203bb2cd22bd63 100644 (file)
@@ -76,7 +76,7 @@ ThreadAffinityTestHelper::ThreadAffinityTestHelper()
 #if GMX_MPI
     cr_->mpi_comm_mysim = MPI_COMM_WORLD;
 #endif
-    hwOpt_.thread_affinity     = threadaffAUTO;
+    hwOpt_.threadAffinity      = ThreadAffinity::Auto;
     hwOpt_.totNumThreadsIsAuto = false;
     physicalNodeId_            = 0;
 }
index dae1133158a336b8d27da7bf3ad142bf48a5154f..38ca39ccc9bebb9cefecbbe53a2e7aba9794ac11 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -83,9 +83,9 @@ class ThreadAffinityTestHelper
         {
             affinityAccess_.setSupported(supported);
         }
-        void setAffinityOption(int affinityOption)
+        void setAffinityOption(ThreadAffinity affinityOption)
         {
-            hwOpt_.thread_affinity = affinityOption;
+            hwOpt_.threadAffinity = affinityOption;
         }
         void setOffsetAndStride(int offset, int stride)
         {
index 732bbf16ac43a5510ac7ee864e07072f8adfe50f..09434f885f797b59f6ea135b09e97450c8082d9b 100644 (file)
@@ -396,7 +396,7 @@ gmx_set_thread_affinity(const gmx::MDLogger         &mdlog,
 {
     int *localityOrder = nullptr;
 
-    if (hw_opt->thread_affinity == threadaffOFF)
+    if (hw_opt->threadAffinity == ThreadAffinity::Off)
     {
         /* Nothing to do */
         return;
@@ -430,7 +430,7 @@ gmx_set_thread_affinity(const gmx::MDLogger         &mdlog,
     }
 
     bool affinityIsAutoAndNumThreadsIsNotAuto =
-        (hw_opt->thread_affinity == threadaffAUTO &&
+        (hw_opt->threadAffinity == ThreadAffinity::Auto &&
          !hw_opt->totNumThreadsIsAuto);
     bool issuedWarning;
     bool validLayout
@@ -562,26 +562,26 @@ gmx_check_thread_affinity_set(const gmx::MDLogger &mdlog,
          * thread-MPI whether it should do pinning when spawning threads.
          * TODO: the above no longer holds, we should move these checks later
          */
-        if (hw_opt->thread_affinity != threadaffOFF)
+        if (hw_opt->threadAffinity != ThreadAffinity::Off)
         {
             char *message;
             if (!gmx_omp_check_thread_affinity(&message))
             {
                 /* We only pin automatically with totNumThreadsIsAuto=true */
-                if (hw_opt->thread_affinity == threadaffON ||
+                if (hw_opt->threadAffinity == ThreadAffinity::On ||
                     hw_opt->totNumThreadsIsAuto)
                 {
                     GMX_LOG(mdlog.warning).asParagraph().appendText(message);
                 }
                 sfree(message);
-                hw_opt->thread_affinity = threadaffOFF;
+                hw_opt->threadAffinity = ThreadAffinity::Off;
             }
         }
     }
 
     if (!detectDefaultAffinityMask(nthreads_hw_avail))
     {
-        if (hw_opt->thread_affinity == threadaffAUTO)
+        if (hw_opt->threadAffinity == ThreadAffinity::Auto)
         {
             if (!bAfterOpenmpInit)
             {
@@ -594,7 +594,7 @@ gmx_check_thread_affinity_set(const gmx::MDLogger &mdlog,
                         "Non-default thread affinity set probably by the OpenMP library,\n"
                         "disabling internal thread affinity");
             }
-            hw_opt->thread_affinity = threadaffOFF;
+            hw_opt->threadAffinity = ThreadAffinity::Off;
         }
         else
         {