From 7414f89a33f3917085132ae012eae086d6a6d41f Mon Sep 17 00:00:00 2001 From: Sean McBride Date: Mon, 27 Jan 2025 11:36:04 -0500 Subject: [PATCH] BUG: fixed bad assumptions about ITK_DEFAULT_MAX_THREADS in tests GetGlobalDefaultNumberOfThreads() and GetNumberOfWorkUnits() in fact can return less that you ask it to, because it's also clamped to the compile-time choice of ITK_DEFAULT_MAX_THREADS. --- .../Common/test/itkDataObjectAndProcessObjectTest.cxx | 4 ++-- .../Core/Common/test/itkMultiThreaderExceptionsTest.cxx | 6 ++++-- .../Common/test/itkMultiThreadingEnvironmentTest.cxx | 8 +++++--- .../test/itkThreadedIteratorRangePartitionerTest3.cxx | 9 +++++---- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/Modules/Core/Common/test/itkDataObjectAndProcessObjectTest.cxx b/Modules/Core/Common/test/itkDataObjectAndProcessObjectTest.cxx index 6279998bb96..4ef9b33a5e0 100644 --- a/Modules/Core/Common/test/itkDataObjectAndProcessObjectTest.cxx +++ b/Modules/Core/Common/test/itkDataObjectAndProcessObjectTest.cxx @@ -228,8 +228,8 @@ itkDataObjectAndProcessObjectTest(int, char *[]) ITK_TEST_SET_GET_VALUE(true, process->GetReleaseDataBeforeUpdateFlag()); ITK_TEST_EXPECT_TRUE(itk::MultiThreaderBase::GetGlobalDefaultNumberOfThreads() <= process->GetNumberOfWorkUnits()); - process->SetNumberOfWorkUnits(11); - ITK_TEST_SET_GET_VALUE(11, process->GetNumberOfWorkUnits()); + process->SetNumberOfWorkUnits(ITK_MAX_THREADS - 1); + ITK_TEST_SET_GET_VALUE(ITK_MAX_THREADS - 1, process->GetNumberOfWorkUnits()); process->SetNumberOfWorkUnits(0); ITK_TEST_SET_GET_VALUE(1, process->GetNumberOfWorkUnits()); process->SetNumberOfWorkUnits(itk::NumericTraits::max()); diff --git a/Modules/Core/Common/test/itkMultiThreaderExceptionsTest.cxx b/Modules/Core/Common/test/itkMultiThreaderExceptionsTest.cxx index ac25ff69f75..96aff8d33fc 100644 --- a/Modules/Core/Common/test/itkMultiThreaderExceptionsTest.cxx +++ b/Modules/Core/Common/test/itkMultiThreaderExceptionsTest.cxx @@ -16,6 +16,8 @@ * *=========================================================================*/ +#include + #include "itkImageSource.h" #include "itkTestingMacros.h" @@ -56,7 +58,7 @@ class ITK_TEMPLATE_EXPORT DummyImageSource : public ImageSource TOutputImage * output = nullptr; output = this->GetOutput(0); typename TOutputImage::RegionType largestPossibleRegion; - largestPossibleRegion.SetSize({ { 4 } }); + largestPossibleRegion.SetSize({ { std::min(4, ITK_DEFAULT_MAX_THREADS) } }); output->SetLargestPossibleRegion(largestPossibleRegion); } @@ -96,7 +98,7 @@ itkMultiThreaderExceptionsTest(int, char *[]) const typename itk::DummyImageSource::Pointer dummySrc = itk::DummyImageSource::New(); dummySrc->SetNumberOfWorkUnits(4); - for (itk::IndexValueType i = 0; i < 4; ++i) + for (itk::IndexValueType i = 0; i < dummySrc->GetNumberOfWorkUnits(); ++i) { dummySrc->SetExceptionIndex(i); ITK_TRY_EXPECT_EXCEPTION(dummySrc->Update()); diff --git a/Modules/Core/Common/test/itkMultiThreadingEnvironmentTest.cxx b/Modules/Core/Common/test/itkMultiThreadingEnvironmentTest.cxx index 85eb8834206..cd1082d8d4c 100644 --- a/Modules/Core/Common/test/itkMultiThreadingEnvironmentTest.cxx +++ b/Modules/Core/Common/test/itkMultiThreadingEnvironmentTest.cxx @@ -34,10 +34,12 @@ itkMultiThreadingEnvironmentTest(int argc, char * argv[]) { return EXIT_FAILURE; } - if (itk::MultiThreaderBase::GetGlobalDefaultNumberOfThreads() != requiredValue) + const auto actualValue = itk::MultiThreaderBase::GetGlobalDefaultNumberOfThreads(); + if ((actualValue != requiredValue) && + (actualValue != ITK_MAX_THREADS)) { - std::cout << "ERROR: Wrong number of maximum number of threads set from environment. " << requiredValue - << " != " << itk::MultiThreaderBase::GetGlobalDefaultNumberOfThreads() << std::endl; + std::cout << "ERROR: Wrong number of maximum number of threads set from environment. " << actualValue + << " != " << requiredValue << " or " << ITK_MAX_THREADS << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; diff --git a/Modules/Core/Common/test/itkThreadedIteratorRangePartitionerTest3.cxx b/Modules/Core/Common/test/itkThreadedIteratorRangePartitionerTest3.cxx index 4a871be2fec..14eee0e6d3b 100644 --- a/Modules/Core/Common/test/itkThreadedIteratorRangePartitionerTest3.cxx +++ b/Modules/Core/Common/test/itkThreadedIteratorRangePartitionerTest3.cxx @@ -269,14 +269,15 @@ itkThreadedIteratorRangePartitionerTest3(int, char *[]) using DomainContainerType = IteratorRangeDomainThreaderAssociate::DomainContainerType; auto container = DomainContainerType::New(); - for (unsigned int i = 0; i < ITK_DEFAULT_MAX_THREADS + 10; ++i) + // ITK_DEFAULT_MAX_THREADS is at least 1, so we have at least 100 elements in container. + for (unsigned int i = 0; i < ITK_DEFAULT_MAX_THREADS + 99; ++i) { container->SetElement(static_cast(i * 2), 2 * i + 1); } DomainType fullDomain(container->Begin(), container->End()); /* Test with single thread */ - setStartEnd(0, 103, container, fullDomain); + setStartEnd(0, 100, container, fullDomain); itk::ThreadIdType numberOfThreads = 1; if (ThreadedIteratorRangePartitionerRunTest(enclosingClass, numberOfThreads, fullDomain) != EXIT_SUCCESS) { @@ -284,7 +285,7 @@ itkThreadedIteratorRangePartitionerTest3(int, char *[]) } /* Test with range that doesn't start at 0 */ - setStartEnd(2, 105, container, fullDomain); + setStartEnd(5, 100, container, fullDomain); numberOfThreads = 1; if (ThreadedIteratorRangePartitionerRunTest(enclosingClass, numberOfThreads, fullDomain) != EXIT_SUCCESS) { @@ -295,7 +296,7 @@ itkThreadedIteratorRangePartitionerTest3(int, char *[]) if (domainThreader->GetMultiThreader()->GetGlobalMaximumNumberOfThreads() > 1) { /* Test with default number of threads. */ - setStartEnd(6, 109, container, fullDomain); + setStartEnd(6, 89, container, fullDomain); numberOfThreads = domainThreader->GetMultiThreader()->GetGlobalDefaultNumberOfThreads(); if (ThreadedIteratorRangePartitionerRunTest(enclosingClass, numberOfThreads, fullDomain) != EXIT_SUCCESS) {