28 #ifndef itkMultiThreaderBase_h
29 #define itkMultiThreaderBase_h
84 extern ITKCommon_EXPORT std::ostream &
86 extern ITKCommon_EXPORT std::ostream &
103 struct MultiThreaderBaseGlobals;
128 SetMaximumNumberOfThreads(
ThreadIdType numberOfThreads);
141 SetUpdateProgress(
bool updates);
142 itkGetConstMacro(UpdateProgress,
bool);
152 GetGlobalMaximumNumberOfThreads();
160 itkLegacyMacro(
static void SetGlobalDefaultUseThreadPool(
const bool GlobalDefaultUseThreadPool));
161 itkLegacyMacro(
static bool GetGlobalDefaultUseThreadPool());
165 #if !defined(ITK_LEGACY_REMOVE)
167 static constexpr
ThreaderEnum Platform = ThreaderEnum::Platform;
168 static constexpr
ThreaderEnum First = ThreaderEnum::First;
169 static constexpr
ThreaderEnum Pool = ThreaderEnum::Pool;
171 static constexpr
ThreaderEnum Last = ThreaderEnum::Last;
172 static constexpr
ThreaderEnum Unknown = ThreaderEnum::Unknown;
177 ThreaderTypeFromString(std::string threaderString);
185 case ThreaderEnum::Platform:
188 case ThreaderEnum::Pool:
191 case ThreaderEnum::TBB:
194 case ThreaderEnum::Unknown:
214 SetGlobalDefaultThreader(ThreaderEnum threaderType);
216 GetGlobalDefaultThreader();
226 GetGlobalDefaultNumberOfThreads();
229 #if !defined(ITK_LEGACY_REMOVE)
232 itkLegacyMacro(
virtual void SetNumberOfThreads(
ThreadIdType numberOfThreads))
234 this->SetMaximumNumberOfThreads(numberOfThreads);
235 this->SetNumberOfWorkUnits(this->GetMaximumNumberOfThreads());
237 itkLegacyMacro(
virtual ThreadIdType GetNumberOfThreads()) {
return this->GetNumberOfWorkUnits(); }
249 ITK_GCC_PRAGMA_DIAG_PUSH()
250 ITK_GCC_PRAGMA_DIAG(ignored "-Wattributes")
251 INTEL_PRAGMA_WARN_PUSH
252 INTEL_SUPPRESS_warning_1292
254 CLANG_SUPPRESS_Wcpp14_extensions
256 # ifdef ITK_LEGACY_SILENT
257 struct ThreadInfoStruct
259 struct [[deprecated("Use WorkUnitInfo, ThreadInfoStruct is deprecated since ITK 5.0")]] ThreadInfoStruct
263 INTEL_PRAGMA_WARN_POP
274 ITK_PROCESS_ABORTED_EXCEPTION,
280 ITK_GCC_PRAGMA_DIAG_POP()
282 #endif // ITK_LEGACY_REMOVE
299 #if !defined(ITK_LEGACY_REMOVE)
302 static constexpr
ThreadExitCodeEnum ITK_EXCEPTION = ThreadExitCodeEnum::ITK_EXCEPTION;
304 ThreadExitCodeEnum::ITK_PROCESS_ABORTED_EXCEPTION;
305 static constexpr
ThreadExitCodeEnum STD_EXCEPTION = ThreadExitCodeEnum::STD_EXCEPTION;
316 SingleMethodExecute() = 0;
325 template <
unsigned int VDimension>
344 template <
unsigned int VDimension>
345 ITK_TEMPLATE_EXPORT
void
350 this->ParallelizeImageRegion(
356 for (
unsigned int d = 0; d < VDimension; ++d)
370 template <
unsigned int VDimension>
371 ITK_TEMPLATE_EXPORT
void
381 funcP(requestedRegion);
385 constexpr
unsigned int SplitDimension = (VDimension - 1) ? VDimension - 1 : VDimension;
388 SplitRegionType splitRegion;
389 for (
unsigned int splitDimension = 0, dimension = 0; dimension < VDimension; ++dimension)
391 if (dimension == restrictedDirection)
396 splitRegion.SetSize(splitDimension, requestedRegion.
GetSize(dimension));
400 this->ParallelizeImageRegion(
402 splitRegion.GetIndex().m_InternalArray,
403 splitRegion.GetSize().m_InternalArray,
406 restrictedRequestedRegion.
SetIndex(restrictedDirection, requestedRegion.
GetIndex(restrictedDirection));
407 restrictedRequestedRegion.
SetSize(restrictedDirection, requestedRegion.
GetSize(restrictedDirection));
408 for (
unsigned int splitDimension = 0, dimension = 0; dimension < VDimension; ++dimension)
410 if (dimension == restrictedDirection)
414 restrictedRequestedRegion.
SetIndex(dimension, index[splitDimension]);
415 restrictedRequestedRegion.
SetSize(dimension, size[splitDimension]);
418 funcP(restrictedRequestedRegion);
427 ParallelizeImageRegion(
unsigned int dimension,
430 ThreadingFunctorType funcP,
437 PrintSelf(std::ostream & os,
Indent indent)
const override;
448 ParallelizeArrayHelper(
void * arg);
460 ParallelizeImageRegionHelper(
void * arg);
482 SingleMethodProxy(
void * arg);
488 void * m_SingleData{
nullptr };
492 SetGlobalDefaultThreaderPrivate(ThreaderEnum threaderType);
494 GetGlobalDefaultThreaderPrivate();
499 std::atomic<bool> m_UpdateProgress{
true };
509 GetGlobalDefaultNumberOfThreadsByPlatform();