Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions Modules/Core/Common/include/itkDomainThreader.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,11 +104,8 @@ class ITK_TEMPLATE_EXPORT DomainThreader: public Object
* \warning When setting the desired number of work units, it might be clamped by
* itk::MultiThreaderBase::GetGlobalMaximumNumberOfThreads().
* */
ThreadIdType GetNumberOfWorkUnits() const
{
return this->m_MultiThreader->GetNumberOfWorkUnits();
}
void SetNumberOfWorkUnits( const ThreadIdType workUnits );
itkSetClampMacro(NumberOfWorkUnits, ThreadIdType, 1, ITK_MAX_THREADS);
itkGetConstMacro(NumberOfWorkUnits, ThreadIdType);

/** Convenience methods to set/get the maximum number of threads to use.
* \warning When setting the maximum number of threads, it will be clamped by
Expand Down Expand Up @@ -172,6 +169,7 @@ class ITK_TEMPLATE_EXPORT DomainThreader: public Object
* well into that number.
* This value is determined at the beginning of \c Execute(). */
ThreadIdType m_NumberOfWorkUnitsUsed;
ThreadIdType m_NumberOfWorkUnits;
typename DomainPartitionerType::Pointer m_DomainPartitioner;
DomainType m_CompleteDomain;
MultiThreaderBase::Pointer m_MultiThreader;
Expand Down
33 changes: 8 additions & 25 deletions Modules/Core/Common/include/itkDomainThreader.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,12 @@ namespace itk
template< typename TDomainPartitioner, typename TAssociate >
DomainThreader< TDomainPartitioner, TAssociate >
::DomainThreader()
: m_Associate(nullptr),
m_NumberOfWorkUnitsUsed(0)
{
this->m_DomainPartitioner = DomainPartitionerType::New();
this->m_MultiThreader = MultiThreaderBase::New();
this->m_NumberOfWorkUnitsUsed = 0;
this->m_Associate = nullptr;
this->m_NumberOfWorkUnits = this->m_MultiThreader->GetNumberOfWorkUnits();
}

template< typename TDomainPartitioner, typename TAssociate >
Expand All @@ -45,18 +46,6 @@ DomainThreader< TDomainPartitioner, TAssociate >
return this->m_MultiThreader;
}

template< typename TDomainPartitioner, typename TAssociate >
void
DomainThreader< TDomainPartitioner, TAssociate >
::SetNumberOfWorkUnits( const ThreadIdType workUnits )
{
if( workUnits != this->GetNumberOfWorkUnits() )
{
this->m_MultiThreader->SetNumberOfWorkUnits( workUnits );
this->Modified();
};
}

template< typename TDomainPartitioner, typename TAssociate >
void
DomainThreader< TDomainPartitioner, TAssociate >
Expand Down Expand Up @@ -92,24 +81,18 @@ void
DomainThreader< TDomainPartitioner, TAssociate >
::DetermineNumberOfWorkUnitsUsed()
{
const ThreadIdType threaderNumberOfThreads = this->GetMultiThreader()->GetNumberOfWorkUnits();
ThreadIdType numberOfWorkUnits = this->GetNumberOfWorkUnits();

// Attempt a single dummy partition, just to get the number of subdomains actually created
DomainType subdomain;
this->m_NumberOfWorkUnitsUsed = this->m_DomainPartitioner->PartitionDomain(0,
threaderNumberOfThreads,
numberOfWorkUnits,
this->m_CompleteDomain,
subdomain);

if( this->m_NumberOfWorkUnitsUsed < threaderNumberOfThreads )
{
// If PartitionDomain is only able to create a lesser number of subdomains,
// ensure that superfluous work units aren't created
// DomainThreader::SetMaximumNumberOfThreads *should* already have been called by this point,
// but it's not fatal if it somehow gets called later
this->GetMultiThreader()->SetNumberOfWorkUnits(this->m_NumberOfWorkUnitsUsed);
}
else if( this->m_NumberOfWorkUnitsUsed > threaderNumberOfThreads )
this->GetMultiThreader()->SetNumberOfWorkUnits(this->m_NumberOfWorkUnitsUsed);

if( this->m_NumberOfWorkUnitsUsed > numberOfWorkUnits )
{
itkExceptionMacro( "A subclass of ThreadedDomainPartitioner::PartitionDomain"
<< "returned more subdomains than were requested" );
Expand Down