// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen // SPDX-License-Identifier: BSD-3-Clause #include "SMP/Common/vtkSMPToolsImpl.h" #include "SMP/STDThread/vtkSMPToolsImpl.txx" #include "vtkStringScanner.h" #include // For std::getenv() #include // For std::thread::hardware_concurrency() #ifdef __EMSCRIPTEN__ #include "vtkSMPWebAssembly.h" #include #endif namespace vtk { namespace detail { namespace smp { VTK_ABI_NAMESPACE_BEGIN static int specifiedNumThreadsSTD; // Default initialized to zero //------------------------------------------------------------------------------ int GetNumberOfThreadsSTDThread() { return specifiedNumThreadsSTD ? specifiedNumThreadsSTD : std::thread::hardware_concurrency(); } //------------------------------------------------------------------------------ template <> void vtkSMPToolsImpl::Initialize(int numThreads) { const int maxThreads = vtkSMPToolsImpl::GetEstimatedDefaultNumberOfThreads(); if (numThreads == 0) { const char* vtkSmpNumThreads = std::getenv("VTK_SMP_MAX_THREADS"); if (vtkSmpNumThreads) { VTK_FROM_CHARS_IF_ERROR_BREAK(vtkSmpNumThreads, numThreads); } else { specifiedNumThreadsSTD = 0; } } if (numThreads > 0) { numThreads = std::min(numThreads, maxThreads); specifiedNumThreadsSTD = numThreads; } } //------------------------------------------------------------------------------ template <> int vtkSMPToolsImpl::GetEstimatedNumberOfThreads() { return specifiedNumThreadsSTD > 0 ? specifiedNumThreadsSTD : vtkSMPToolsImpl::GetEstimatedDefaultNumberOfThreads(); } //------------------------------------------------------------------------------ template <> int vtkSMPToolsImpl::GetEstimatedDefaultNumberOfThreads() { #if defined(__EMSCRIPTEN_PTHREADS__) && (VTK_WEBASSEMBLY_SMP_THREAD_POOL_SIZE > 0) int maxThreads = VTK_WEBASSEMBLY_SMP_THREAD_POOL_SIZE; #else int maxThreads = std::thread::hardware_concurrency(); #endif return maxThreads; } //------------------------------------------------------------------------------ template <> bool vtkSMPToolsImpl::GetSingleThread() { return vtkSMPThreadPool::GetInstance().GetSingleThread(); } //------------------------------------------------------------------------------ template <> bool vtkSMPToolsImpl::IsParallelScope() { return vtkSMPThreadPool::GetInstance().IsParallelScope(); } VTK_ABI_NAMESPACE_END } // namespace smp } // namespace detail } // namespace vtk