mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-04 22:11:26 +12:00
Detect hyperthreading on Windows
This commit is contained in:
parent
d7be0a96f3
commit
1dd3a4b3f0
1 changed files with 47 additions and 1 deletions
|
@ -14,6 +14,7 @@
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
#include <Psapi.h>
|
#include <Psapi.h>
|
||||||
#include <process.h>
|
#include <process.h>
|
||||||
|
#include <sysinfoapi.h>
|
||||||
#else
|
#else
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
#define _XOPEN_SOURCE
|
#define _XOPEN_SOURCE
|
||||||
|
@ -1823,8 +1824,53 @@ void thread_ctrl::detect_cpu_layout()
|
||||||
{
|
{
|
||||||
g_native_core_layout.store(native_core_arrangement::amd_ccx);
|
g_native_core_layout.store(native_core_arrangement::amd_ccx);
|
||||||
}
|
}
|
||||||
|
else if (system_id.find("Intel") != std::string::npos)
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
const LOGICAL_PROCESSOR_RELATIONSHIP relationship = LOGICAL_PROCESSOR_RELATIONSHIP::RelationProcessorCore;
|
||||||
|
DWORD buffer_size = 0;
|
||||||
|
|
||||||
// TODO: Detect hyperthreaded intel CPUs
|
// If buffer size is set to 0 bytes, it will be overwritten with the required size
|
||||||
|
if (GetLogicalProcessorInformationEx(relationship, nullptr, &buffer_size))
|
||||||
|
{
|
||||||
|
LOG_ERROR(GENERAL, "GetLogicalProcessorInformationEx returned 0 bytes");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
DWORD error_code = GetLastError();
|
||||||
|
if (error_code != ERROR_INSUFFICIENT_BUFFER)
|
||||||
|
{
|
||||||
|
LOG_ERROR(GENERAL, "Unexpected windows error code when detecting CPU layout: %u", error_code);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<u8> buffer(buffer_size);
|
||||||
|
|
||||||
|
if (!GetLogicalProcessorInformationEx(relationship,
|
||||||
|
reinterpret_cast<SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *>(buffer.data()), &buffer_size))
|
||||||
|
{
|
||||||
|
LOG_ERROR(GENERAL, "GetLogicalProcessorInformationEx failed (size=%u, error=%u)", buffer_size, GetLastError());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Iterate through the buffer until a core with hyperthreading is found
|
||||||
|
auto ptr = reinterpret_cast<std::uintptr_t>(buffer.data());
|
||||||
|
const std::uintptr_t end = ptr + buffer_size;
|
||||||
|
|
||||||
|
while (ptr < end)
|
||||||
|
{
|
||||||
|
auto info = reinterpret_cast<SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX *>(ptr);
|
||||||
|
if (info->Relationship == relationship && info->Processor.Flags == LTP_PC_SMT)
|
||||||
|
{
|
||||||
|
g_native_core_layout.store(native_core_arrangement::intel_ht);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ptr += info->Size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
LOG_TODO(GENERAL, "Thread scheduler is not implemented for Intel and this OS");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
u16 thread_ctrl::get_affinity_mask(thread_class group)
|
u16 thread_ctrl::get_affinity_mask(thread_class group)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue