Common: Add helper for getting CPU info

This commit is contained in:
TellowKrinkle 2024-09-13 03:48:07 -05:00
parent 33ab6fd09b
commit 355e3d3cc8
5 changed files with 87 additions and 5 deletions

View File

@ -174,9 +174,6 @@ else()
target_compile_definitions(common PRIVATE "HAS_LIBBACKTRACE=1")
target_link_libraries(common PRIVATE libbacktrace::libbacktrace)
endif()
if(${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD")
target_link_libraries(common PRIVATE cpuinfo)
endif()
endif()
set_source_files_properties(PrecompiledHeader.cpp PROPERTIES HEADER_FILE_ONLY TRUE)
@ -206,6 +203,7 @@ target_link_libraries(common PRIVATE
JPEG::JPEG
PNG::PNG
WebP::libwebp
cpuinfo
)
target_link_libraries(common PUBLIC

View File

@ -271,7 +271,7 @@ std::vector<DarwinMisc::CPUClass> DarwinMisc::GetCPUClasses()
}
else if (std::optional<u32> physcpu = sysctlbyname_T<u32>("hw.physicalcpu"))
{
out.push_back({"Default", *physcpu, sysctlbyname_T<u32>("hw.logicalcpu").value_or(0)});
out.push_back({"Default", *physcpu, sysctlbyname_T<u32>("hw.logicalcpu").value_or(*physcpu)});
}
else
{
@ -281,6 +281,35 @@ std::vector<DarwinMisc::CPUClass> DarwinMisc::GetCPUClasses()
return out;
}
static CPUInfo CalcCPUInfo()
{
CPUInfo out;
char name[256];
size_t name_size = sizeof(name);
if (0 != sysctlbyname("machdep.cpu.brand_string", name, &name_size, nullptr, 0))
strcpy(name, "Unknown");
out.name = name;
if (sysctlbyname_T<u32>("sysctl.proc_translated").value_or(0))
out.name += " (Rosetta)";
std::vector<DarwinMisc::CPUClass> classes = DarwinMisc::GetCPUClasses();
out.num_clusters = static_cast<u32>(classes.size());
out.num_big_cores = classes.empty() ? 0 : classes[0].num_physical;
out.num_threads = classes.empty() ? 0 : classes[0].num_logical;
out.num_small_cores = 0;
for (std::size_t i = 1; i < classes.size(); i++)
{
out.num_small_cores += classes[i].num_physical;
out.num_threads += classes[i].num_logical;
}
return out;
}
const CPUInfo& GetCPUInfo()
{
static const CPUInfo info = CalcCPUInfo();
return info;
}
size_t HostSys::GetRuntimePageSize()
{
return sysctlbyname_T<u32>("hw.pagesize").value_or(0);

View File

@ -5,6 +5,10 @@
#include "Console.h"
#include "VectorIntrin.h"
#ifndef __APPLE__
#include "cpuinfo.h"
#endif
static u32 PAUSE_TIME = 0;
static void MultiPause()
@ -135,3 +139,43 @@ void AbortWithMessage(const char* msg)
#endif
abort();
}
#ifndef __APPLE__
// MacOS version is in DarwinMisc
static CPUInfo CalcCPUInfo()
{
CPUInfo out;
out.name = cpuinfo_get_package(0)->name;
out.num_threads = cpuinfo_get_processors_count();
out.num_clusters = cpuinfo_get_clusters_count();
out.num_big_cores = 0;
out.num_small_cores = 0;
const cpuinfo_cluster* clusters = cpuinfo_get_clusters();
uint64_t big_freq = 0;
for (uint32_t i = 0; i < out.num_clusters; i++)
{
const cpuinfo_cluster& cluster = clusters[i];
if (cluster.frequency > big_freq)
{
out.num_small_cores += out.num_big_cores;
out.num_big_cores = cluster.core_count;
big_freq = cluster.frequency;
}
else if (cluster.frequency == big_freq)
{
out.num_big_cores += cluster.core_count;
}
else
{
out.num_small_cores += cluster.core_count;
}
}
return out;
}
const CPUInfo& GetCPUInfo()
{
static const CPUInfo info = CalcCPUInfo();
return info;
}
#endif

View File

@ -192,6 +192,16 @@ extern const u32 SPIN_TIME_NS;
extern std::string GetOSVersionString();
struct CPUInfo {
std::string name;
u32 num_big_cores;
u32 num_small_cores;
u32 num_threads;
u32 num_clusters;
};
const CPUInfo& GetCPUInfo();
namespace Common
{
/// Enables or disables the screen saver from starting.

View File

@ -32,6 +32,7 @@
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\cpuinfo\include</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\fast_float\include</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\fmt\include</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\jpgd</AdditionalIncludeDirectories>
@ -191,4 +192,4 @@
<ImportGroup Label="ExtensionTargets">
<Import Project="$(VCTargetsPath)\BuildCustomizations\masm.targets" />
</ImportGroup>
</Project>
</Project>