Avoid yelling about thread pinning twice
authorBerk Hess <hess@kth.se>
Mon, 11 Dec 2017 21:03:53 +0000 (22:03 +0100)
committerErik Lindahl <erik.lindahl@gmail.com>
Tue, 12 Dec 2017 07:22:38 +0000 (08:22 +0100)
Do not print the second, generic note about not pinning threads
when we printed a first, more detailed warnings.
Updated the threadaffinity tests for this.

Fixes #2342

Change-Id: I1fa8374d70891c3bc1caf2827210875e1c1a020f

src/gromacs/mdrunutility/tests/threadaffinity-mpi.cpp
src/gromacs/mdrunutility/tests/threadaffinity.cpp
src/gromacs/mdrunutility/threadaffinity.cpp

index 35e83d23f203d08b5eab4d1f57ab5af74167edb7..7ed0397a8ccef49677e2823872a094a8d0713423 100644 (file)
@@ -98,7 +98,6 @@ TEST(ThreadAffinityMultiRankTest, HandlesTooManyThreadsWithAuto)
     ThreadAffinityTestHelper helper;
     helper.setLogicalProcessorCount(6);
     helper.expectWarningMatchingRegex("Oversubscribing the CPU");
-    helper.expectGenericFailureMessage();
     helper.setAffinity(2);
 }
 
@@ -109,7 +108,6 @@ TEST(ThreadAffinityMultiRankTest, HandlesTooManyThreadsWithForce)
     helper.setAffinityOption(threadaffON);
     helper.setLogicalProcessorCount(6);
     helper.expectWarningMatchingRegex("Oversubscribing the CPU");
-    helper.expectGenericFailureMessage();
     helper.setAffinity(2);
 }
 
@@ -142,7 +140,6 @@ TEST_F(ThreadAffinityHeterogeneousNodesTest, PinsOnMasterOnly)
     helper.setAffinityOption(threadaffON);
     setupNodes(&helper, {{2, 1}});
     helper.expectWarningMatchingRegexIf("Oversubscribing the CPU", isMaster() || currentNode() == 1);
-    helper.expectGenericFailureMessageIf(isMaster() || currentNode() == 1);
     if (currentNode() == 0)
     {
         helper.expectPinningMessage(false, 1);
@@ -158,7 +155,6 @@ TEST_F(ThreadAffinityHeterogeneousNodesTest, PinsOnNonMasterOnly)
     helper.setAffinityOption(threadaffON);
     setupNodes(&helper, {{1, 2}});
     helper.expectWarningMatchingRegexIf("Oversubscribing the CPU", currentNode() == 0);
-    helper.expectGenericFailureMessageIf(currentNode() == 0);
     if (currentNode() == 1)
     {
         helper.expectPinningMessage(false, 1);
@@ -174,7 +170,6 @@ TEST_F(ThreadAffinityHeterogeneousNodesTest, HandlesUnknownHardwareOnNonMaster)
     helper.setAffinityOption(threadaffON);
     setupNodes(&helper, {{2, 0}});
     helper.expectWarningMatchingRegexIf("No information on available cores", isMaster() || currentNode() == 1);
-    helper.expectGenericFailureMessageIf(isMaster() || currentNode() == 1);
     if (currentNode() == 0)
     {
         helper.expectPinningMessage(false, 1);
@@ -189,7 +184,6 @@ TEST_F(ThreadAffinityHeterogeneousNodesTest, PinsAutomaticallyOnMasterOnly)
     ThreadAffinityTestHelper helper;
     setupNodes(&helper, {{2, 1}});
     helper.expectWarningMatchingRegexIf("Oversubscribing the CPU", isMaster() || currentNode() == 1);
-    helper.expectGenericFailureMessageIf(isMaster() || currentNode() == 1);
     if (currentNode() == 0)
     {
         helper.expectPinningMessage(false, 1);
@@ -204,7 +198,6 @@ TEST_F(ThreadAffinityHeterogeneousNodesTest, PinsAutomaticallyOnNonMasterOnly)
     ThreadAffinityTestHelper helper;
     setupNodes(&helper, {{1, 2}});
     helper.expectWarningMatchingRegexIf("Oversubscribing the CPU", currentNode() == 0);
-    helper.expectGenericFailureMessageIf(currentNode() == 0);
     if (currentNode() == 1)
     {
         helper.expectPinningMessage(false, 1);
@@ -222,7 +215,6 @@ TEST_F(ThreadAffinityHeterogeneousNodesTest, HandlesInvalidOffsetOnNonMasterOnly
     setupNodes(&helper, {{4, 2}});
     helper.expectWarningMatchingRegex("Applying core pinning offset 2");
     helper.expectWarningMatchingRegexIf("Requested offset too large", isMaster() || currentNode() == 1);
-    helper.expectGenericFailureMessageIf(isMaster() || currentNode() == 1);
     if (currentNode() == 0)
     {
         helper.expectPinningMessage(false, 1);
@@ -239,7 +231,6 @@ TEST_F(ThreadAffinityHeterogeneousNodesTest, HandlesInvalidStrideOnNonMasterOnly
     helper.setOffsetAndStride(0, 2);
     setupNodes(&helper, {{4, 2}});
     helper.expectWarningMatchingRegexIf("Requested stride too large", isMaster() || currentNode() == 1);
-    helper.expectGenericFailureMessageIf(isMaster() || currentNode() == 1);
     if (currentNode() == 0)
     {
         helper.expectPinningMessage(true, 2);
index 832027f1c2e7f91dd53f1f9312ca8dfab13fb060..251911b88d28f3b5479466afa17cb74b923c0199 100644 (file)
@@ -68,7 +68,6 @@ TEST_F(ThreadAffinityTest, DoesNothingWithAutoAndTooFewUserSetThreads)
 {
     helper_.setLogicalProcessorCount(4);
     helper_.expectWarningMatchingRegex("The number of threads is not equal to the number of");
-    helper_.expectGenericFailureMessage();
     helper_.setAffinity(2);
 }
 
@@ -76,7 +75,6 @@ TEST_F(ThreadAffinityTest, DoesNothingWithAutoAndTooManyUserSetThreads)
 {
     helper_.setLogicalProcessorCount(4);
     helper_.expectWarningMatchingRegex("Oversubscribing the CPU");
-    helper_.expectGenericFailureMessage();
     helper_.setAffinity(8);
 }
 
@@ -85,7 +83,6 @@ TEST_F(ThreadAffinityTest, DoesNothingWithAutoAndTooManyAutoSetThreads)
     helper_.setLogicalProcessorCount(4);
     helper_.setTotNumThreadsIsAuto(true);
     helper_.expectWarningMatchingRegex("Oversubscribing the CPU");
-    helper_.expectGenericFailureMessage();
     helper_.setAffinity(8);
 }
 
@@ -94,7 +91,6 @@ TEST_F(ThreadAffinityTest, DoesNothingWithUnknownHardware)
     helper_.setAffinityOption(threadaffON);
     helper_.setLogicalProcessorCount(0);
     helper_.expectWarningMatchingRegex("No information on available cores");
-    helper_.expectGenericFailureMessage();
     helper_.setAffinity(2);
 }
 
@@ -103,7 +99,6 @@ TEST_F(ThreadAffinityTest, DoesNothingWithTooManyThreads)
     helper_.setAffinityOption(threadaffON);
     helper_.setLogicalProcessorCount(4);
     helper_.expectWarningMatchingRegex("Oversubscribing the CPU");
-    helper_.expectGenericFailureMessage();
     helper_.setAffinity(8);
 }
 
@@ -114,7 +109,6 @@ TEST_F(ThreadAffinityTest, DoesNothingWithTooLargeOffset)
     helper_.setLogicalProcessorCount(4);
     helper_.expectWarningMatchingRegex("Applying core pinning offset 2");
     helper_.expectWarningMatchingRegex("Requested offset too large");
-    helper_.expectGenericFailureMessage();
     helper_.setAffinity(3);
 }
 
@@ -124,7 +118,6 @@ TEST_F(ThreadAffinityTest, DoesNothingWithTooLargeStride)
     helper_.setOffsetAndStride(0, 2);
     helper_.setLogicalProcessorCount(4);
     helper_.expectWarningMatchingRegex("Requested stride too large");
-    helper_.expectGenericFailureMessage();
     helper_.setAffinity(3);
 }
 
index e0d59ad7e013540ac55f839e038916fc7a4ff8b1..bf2d352efc8b7429ad76ea01226b68a94ee5472c 100644 (file)
@@ -117,7 +117,8 @@ get_thread_affinity_layout(const gmx::MDLogger &mdlog,
                            int   threads,
                            bool  affinityIsAutoAndNumThreadsIsNotAuto,
                            int pin_offset, int * pin_stride,
-                           int **localityOrder)
+                           int **localityOrder,
+                           bool *issuedWarning)
 {
     int                          hwThreads;
     int                          hwThreadsPerCore = 0;
@@ -247,6 +248,7 @@ get_thread_affinity_layout(const gmx::MDLogger &mdlog,
         /* We are oversubscribing, don't pin */
         GMX_LOG(mdlog.warning).asParagraph().appendText(
                 "WARNING: Requested stride too large for available cores, thread pinning disabled.");
+        alreadyWarned = true;
     }
     validLayout = validLayout && !invalidValue;
 
@@ -258,6 +260,8 @@ get_thread_affinity_layout(const gmx::MDLogger &mdlog,
                 *pin_stride);
     }
 
+    *issuedWarning = alreadyWarned;
+
     return validLayout;
 }
 
@@ -429,10 +433,12 @@ gmx_set_thread_affinity(const gmx::MDLogger         &mdlog,
     bool affinityIsAutoAndNumThreadsIsNotAuto =
         (hw_opt->thread_affinity == threadaffAUTO &&
          !hw_opt->totNumThreadsIsAuto);
+    bool issuedWarning;
     bool validLayout
         = get_thread_affinity_layout(mdlog, cr, hwTop, nthread_node,
                                      affinityIsAutoAndNumThreadsIsNotAuto,
-                                     offset, &core_pinning_stride, &localityOrder);
+                                     offset, &core_pinning_stride, &localityOrder,
+                                     &issuedWarning);
     const gmx::sfree_guard  localityOrderGuard(localityOrder);
 
     bool                    allAffinitiesSet;
@@ -447,7 +453,7 @@ gmx_set_thread_affinity(const gmx::MDLogger         &mdlog,
         // Produce the warning if any rank fails.
         allAffinitiesSet = false;
     }
-    if (invalidWithinSimulation(cr, !allAffinitiesSet))
+    if (invalidWithinSimulation(cr, !allAffinitiesSet) && !issuedWarning)
     {
         GMX_LOG(mdlog.warning).asParagraph().appendText("NOTE: Thread affinity was not set.");
     }