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:
187 case ThreaderEnum::Pool:
189 case ThreaderEnum::TBB:
191 case ThreaderEnum::Unknown:
210 SetGlobalDefaultThreader(ThreaderEnum threaderType);
212 GetGlobalDefaultThreader();
222 GetGlobalDefaultNumberOfThreads();
225 #if !defined(ITK_LEGACY_REMOVE)
228 itkLegacyMacro(
virtual void SetNumberOfThreads(
ThreadIdType numberOfThreads))
230 this->SetMaximumNumberOfThreads(numberOfThreads);
231 this->SetNumberOfWorkUnits(this->GetMaximumNumberOfThreads());
233 itkLegacyMacro(
virtual ThreadIdType GetNumberOfThreads()) {
return this->GetNumberOfWorkUnits(); }
245 ITK_GCC_PRAGMA_DIAG_PUSH()
246 ITK_GCC_PRAGMA_DIAG(ignored "-Wattributes")
247 INTEL_PRAGMA_WARN_PUSH
248 INTEL_SUPPRESS_warning_1292
250 CLANG_SUPPRESS_Wcpp14_extensions
252 # ifdef ITK_LEGACY_SILENT
253 struct ThreadInfoStruct
255 struct [[deprecated("Use WorkUnitInfo, ThreadInfoStruct is deprecated since ITK 5.0")]] ThreadInfoStruct
259 INTEL_PRAGMA_WARN_POP
270 ITK_PROCESS_ABORTED_EXCEPTION,
276 ITK_GCC_PRAGMA_DIAG_POP()
278 #endif // ITK_LEGACY_REMOVE
295 #if !defined(ITK_LEGACY_REMOVE)
298 static constexpr
ThreadExitCodeEnum ITK_EXCEPTION = ThreadExitCodeEnum::ITK_EXCEPTION;
300 ThreadExitCodeEnum::ITK_PROCESS_ABORTED_EXCEPTION;
301 static constexpr
ThreadExitCodeEnum STD_EXCEPTION = ThreadExitCodeEnum::STD_EXCEPTION;
312 SingleMethodExecute() = 0;
325 #ifndef ITK_FUTURE_LEGACY_REMOVE
328 template <
unsigned int VDimension>
351 template <
unsigned int VDimension,
typename TFunction>
352 ITK_TEMPLATE_EXPORT
void
355 this->ParallelizeImageRegion(
361 for (
unsigned int d = 0; d < VDimension; ++d)
375 template <
unsigned int VDimension,
typename TFunction>
376 ITK_TEMPLATE_EXPORT
void
382 if constexpr (VDimension <= 1)
386 funcP(requestedRegion);
390 constexpr
unsigned int SplitDimension = VDimension - 1;
394 for (
unsigned int splitDimension = 0, dimension = 0; dimension < VDimension; ++dimension)
396 if (dimension != restrictedDirection)
398 splitIndex[splitDimension] = requestedRegion.
GetIndex(dimension);
399 splitSize[splitDimension] = requestedRegion.
GetSize(dimension);
404 this->ParallelizeImageRegion(
406 splitIndex.m_InternalArray,
407 splitSize.m_InternalArray,
409 ImageRegion<VDimension> restrictedRequestedRegion;
410 restrictedRequestedRegion.SetIndex(restrictedDirection, requestedRegion.GetIndex(restrictedDirection));
411 restrictedRequestedRegion.SetSize(restrictedDirection, requestedRegion.GetSize(restrictedDirection));
412 for (unsigned int splitDimension = 0, dimension = 0; dimension < VDimension; ++dimension)
414 if (dimension != restrictedDirection)
416 restrictedRequestedRegion.SetIndex(dimension, index[splitDimension]);
417 restrictedRequestedRegion.SetSize(dimension, size[splitDimension]);
421 funcP(restrictedRequestedRegion);
430 ParallelizeImageRegion(
unsigned int dimension,
433 ThreadingFunctorType funcP,
438 ~MultiThreaderBase()
override;
440 PrintSelf(std::ostream & os, Indent indent)
const override;
451 ParallelizeArrayHelper(
void * arg);
463 ParallelizeImageRegionHelper(
void * arg);
485 SingleMethodProxy(
void * arg);
491 void * m_SingleData{
nullptr };
495 SetGlobalDefaultThreaderPrivate(ThreaderEnum threaderType);
497 GetGlobalDefaultThreaderPrivate();
502 std::atomic<bool> m_UpdateProgress{
true };
512 GetGlobalDefaultNumberOfThreadsByPlatform();