void InitThreadPool() { boost::uint32_t systemCores = Threading::GetAvailableCoresMask(); boost::uint32_t mainAffinity = systemCores; #ifndef UNIT_TEST mainAffinity &= configHandler->GetUnsigned("SetCoreAffinity"); #endif boost::uint32_t ompAvailCores = systemCores & ~mainAffinity; { #ifndef UNIT_TEST int workerCount = std::min(ThreadPool::GetMaxThreads() - 1, configHandler->GetUnsigned("WorkerThreadCount")); ThreadPool::SetThreadSpinTime(configHandler->GetUnsigned("WorkerThreadSpinTime")); #else int workerCount = -1; #endif const int numCores = ThreadPool::GetMaxThreads(); // For latency reasons our worker threads yield rarely and so eat a lot cputime with idleing. // So it's better we always leave 1 core free for our other threads, drivers & OS if (workerCount < 0) { if (numCores == 2) { workerCount = numCores; } else if (numCores < 6) { workerCount = numCores - 1; } else { workerCount = numCores / 2; } } if (workerCount > numCores) { LOG_L(L_WARNING, "Set ThreadPool workers to %i, but there are just %i cores!", workerCount, numCores); workerCount = numCores; } ThreadPool::SetThreadCount(workerCount); } // set affinity of worker threads boost::uint32_t ompCores = 0; ompCores = parallel_reduce([&]() -> boost::uint32_t { const int i = ThreadPool::GetThreadNum(); // 0 is the source thread, skip if (i == 0) return 0; boost::uint32_t ompCore = GetCpuCoreForWorkerThread(i - 1, ompAvailCores, mainAffinity); //boost::uint32_t ompCore = ompAvailCores; Threading::SetAffinity(ompCore); return ompCore; }, [](boost::uint32_t a, boost::unique_future<boost::uint32_t>& b) -> boost::uint32_t { return a | b.get(); }); // affinity of mainthread boost::uint32_t nonOmpCores = ~ompCores; if (mainAffinity == 0) mainAffinity = systemCores; Threading::SetAffinityHelper("Main", mainAffinity & nonOmpCores); }
void InitThreadPool() { boost::uint32_t systemCores = Threading::GetAvailableCoresMask(); boost::uint32_t mainAffinity = systemCores; boost::uint32_t ompAvailCores = systemCores & ~mainAffinity; #ifndef UNIT_TEST mainAffinity = systemCores & configHandler->GetUnsigned("SetCoreAffinity"); #endif { int workerCount = -1; #ifndef UNIT_TEST workerCount = configHandler->GetUnsigned("WorkerThreadCount"); ThreadPool::SetThreadSpinTime(configHandler->GetUnsigned("WorkerThreadSpinTime")); #endif // For latency reasons our worker threads yield rarely and so eat a lot cputime with idleing. // So it's better we always leave 1 core free for our other threads, drivers & OS if (workerCount < 0) workerCount = ThreadPool::GetMaxThreads() - 1; //if (workerCount > ThreadPool::GetMaxThreads()) LOG_L(L_WARNING, ""); ThreadPool::SetThreadCount(workerCount); } // set affinity of worker threads boost::uint32_t ompCores = 0; ompCores = parallel_reduce([&]() -> boost::uint32_t { const int i = ThreadPool::GetThreadNum(); if (i != 0) { // 0 is the source thread, skip boost::uint32_t ompCore = GetCpuCoreForWorkerThread(i - 1, ompAvailCores, mainAffinity); Threading::SetAffinity(ompCore); return ompCore; } return 0; }, [](boost::uint32_t a, boost::unique_future<boost::uint32_t>& b) -> boost::uint32_t { return a | b.get(); }); // affinity of mainthread boost::uint32_t nonOmpCores = ~ompCores; if (mainAffinity == 0) mainAffinity = systemCores; Threading::SetAffinityHelper("Main", mainAffinity & nonOmpCores); }