ThreadAffinityTestHelper helper;
helper.setLogicalProcessorCount(6);
helper.expectWarningMatchingRegex("Oversubscribing the CPU");
- helper.expectGenericFailureMessage();
helper.setAffinity(2);
}
helper.setAffinityOption(threadaffON);
helper.setLogicalProcessorCount(6);
helper.expectWarningMatchingRegex("Oversubscribing the CPU");
- helper.expectGenericFailureMessage();
helper.setAffinity(2);
}
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);
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);
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);
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);
ThreadAffinityTestHelper helper;
setupNodes(&helper, {{1, 2}});
helper.expectWarningMatchingRegexIf("Oversubscribing the CPU", currentNode() == 0);
- helper.expectGenericFailureMessageIf(currentNode() == 0);
if (currentNode() == 1)
{
helper.expectPinningMessage(false, 1);
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);
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);
{
helper_.setLogicalProcessorCount(4);
helper_.expectWarningMatchingRegex("The number of threads is not equal to the number of");
- helper_.expectGenericFailureMessage();
helper_.setAffinity(2);
}
{
helper_.setLogicalProcessorCount(4);
helper_.expectWarningMatchingRegex("Oversubscribing the CPU");
- helper_.expectGenericFailureMessage();
helper_.setAffinity(8);
}
helper_.setLogicalProcessorCount(4);
helper_.setTotNumThreadsIsAuto(true);
helper_.expectWarningMatchingRegex("Oversubscribing the CPU");
- helper_.expectGenericFailureMessage();
helper_.setAffinity(8);
}
helper_.setAffinityOption(threadaffON);
helper_.setLogicalProcessorCount(0);
helper_.expectWarningMatchingRegex("No information on available cores");
- helper_.expectGenericFailureMessage();
helper_.setAffinity(2);
}
helper_.setAffinityOption(threadaffON);
helper_.setLogicalProcessorCount(4);
helper_.expectWarningMatchingRegex("Oversubscribing the CPU");
- helper_.expectGenericFailureMessage();
helper_.setAffinity(8);
}
helper_.setLogicalProcessorCount(4);
helper_.expectWarningMatchingRegex("Applying core pinning offset 2");
helper_.expectWarningMatchingRegex("Requested offset too large");
- helper_.expectGenericFailureMessage();
helper_.setAffinity(3);
}
helper_.setOffsetAndStride(0, 2);
helper_.setLogicalProcessorCount(4);
helper_.expectWarningMatchingRegex("Requested stride too large");
- helper_.expectGenericFailureMessage();
helper_.setAffinity(3);
}
int threads,
bool affinityIsAutoAndNumThreadsIsNotAuto,
int pin_offset, int * pin_stride,
- int **localityOrder)
+ int **localityOrder,
+ bool *issuedWarning)
{
int hwThreads;
int hwThreadsPerCore = 0;
/* 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;
*pin_stride);
}
+ *issuedWarning = alreadyWarned;
+
return validLayout;
}
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;
// 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.");
}