From: Teresa Johnson Date: Fri, 14 Oct 2016 00:13:59 +0000 (+0000) Subject: Add interface for querying physical hardware concurrency X-Git-Tag: llvmorg-4.0.0-rc1~7217 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2bd812c5dc94d16009c911ca6a38457fe4ea21e6;p=platform%2Fupstream%2Fllvm.git Add interface for querying physical hardware concurrency Summary: This will be used by ThinLTO to set the amount of backend parallelism, which performs better when restricted to the number of physical cores (on X86 at least, where getHostNumPhysicalCores is currently defined). If not available this falls back to thread::hardware_concurrency. Note I didn't add to the thread class since that is a typedef to std::thread where available. Reviewers: mehdi_amini Subscribers: beanz, llvm-commits, mgorny Differential Revision: https://reviews.llvm.org/D25585 llvm-svn: 284180 --- diff --git a/llvm/include/llvm/Support/Threading.h b/llvm/include/llvm/Support/Threading.h index 09b96df..7e4a289 100644 --- a/llvm/include/llvm/Support/Threading.h +++ b/llvm/include/llvm/Support/Threading.h @@ -115,6 +115,10 @@ namespace llvm { TsanHappensAfter(&flag); #endif } + + /// Get the amount of currency based on physical cores, if available for the + /// host system, otherwise falls back to thread::hardware_concurrency(). + unsigned hardware_physical_concurrency(); } #endif diff --git a/llvm/lib/Support/Threading.cpp b/llvm/lib/Support/Threading.cpp index e8f5622..415c63f 100644 --- a/llvm/lib/Support/Threading.cpp +++ b/llvm/lib/Support/Threading.cpp @@ -15,6 +15,7 @@ #include "llvm/Support/Threading.h" #include "llvm/Config/config.h" #include "llvm/Support/Atomic.h" +#include "llvm/Support/Host.h" #include "llvm/Support/Mutex.h" #include "llvm/Support/thread.h" #include @@ -116,3 +117,10 @@ void llvm::llvm_execute_on_thread(void (*Fn)(void*), void *UserData, } #endif + +unsigned llvm::hardware_physical_concurrency() { + int NumPhysical = sys::getHostNumPhysicalCores(); + if (NumPhysical == -1) + return thread::hardware_concurrency(); + return NumPhysical; +} diff --git a/llvm/unittests/Support/CMakeLists.txt b/llvm/unittests/Support/CMakeLists.txt index 9aef721..6ae2aed 100644 --- a/llvm/unittests/Support/CMakeLists.txt +++ b/llvm/unittests/Support/CMakeLists.txt @@ -40,6 +40,7 @@ add_llvm_unittest(SupportTests StringPool.cpp SwapByteOrderTest.cpp TargetParserTest.cpp + Threading.cpp ThreadLocalTest.cpp ThreadPool.cpp TimerTest.cpp diff --git a/llvm/unittests/Support/Threading.cpp b/llvm/unittests/Support/Threading.cpp new file mode 100644 index 0000000..30a3c74 --- /dev/null +++ b/llvm/unittests/Support/Threading.cpp @@ -0,0 +1,25 @@ +//===- unittests/Threading.cpp - Thread tests -----------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Support/Threading.h" +#include "llvm/Support/thread.h" +#include "gtest/gtest.h" + +using namespace llvm; + +namespace { + +TEST(Threading, PhysicalConcurrency) { + auto Num = hardware_physical_concurrency(); + // Since Num is unsigned this will also catch us trying to + // return -1. + ASSERT_LE(Num, thread::hardware_concurrency()); +} + +} // end anon namespace