1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

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
This commit is contained in:
Teresa Johnson 2016-10-14 00:13:59 +00:00
parent 520d92773b
commit 6b1749d39a
4 changed files with 38 additions and 0 deletions

View File

@ -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

View File

@ -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 <cassert>
@ -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;
}

View File

@ -40,6 +40,7 @@ add_llvm_unittest(SupportTests
StringPool.cpp
SwapByteOrderTest.cpp
TargetParserTest.cpp
Threading.cpp
ThreadLocalTest.cpp
ThreadPool.cpp
TimerTest.cpp

View File

@ -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