2023-03-12 15:27:28 +00:00
|
|
|
/***
|
|
|
|
Copyright (C) 2023 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
|
|
|
|
2023-03-21 03:18:09 +00:00
|
|
|
File: SMTYield.cpp
|
2023-03-12 15:27:28 +00:00
|
|
|
Date: 2023-3-12
|
|
|
|
Author: Reece
|
|
|
|
***/
|
|
|
|
#include <Source/RuntimeInternal.hpp>
|
2023-03-21 03:18:09 +00:00
|
|
|
#include "SMTYield.hpp"
|
2023-03-12 15:27:28 +00:00
|
|
|
|
2023-08-19 17:14:28 +00:00
|
|
|
namespace Aurora::Threading
|
|
|
|
{
|
|
|
|
AUKN_SYM void SetSpinCountTimeout(AuUInt8 uTimeout)
|
|
|
|
{
|
|
|
|
gRuntimeConfig.threadingConfig.uSpinLoopPowerA = uTimeout;
|
|
|
|
}
|
|
|
|
|
|
|
|
AUKN_SYM AuUInt8 GetSpinCountTimeout()
|
|
|
|
{
|
|
|
|
return gRuntimeConfig.threadingConfig.uSpinLoopPowerA;
|
|
|
|
}
|
|
|
|
|
|
|
|
AUKN_SYM void SetThreadLocalAdditionalSpinCountTimeout(AuUInt8 uTimeout)
|
|
|
|
{
|
|
|
|
gHasThreadLocalTimeout = 1;
|
2023-08-20 08:50:41 +00:00
|
|
|
tlsSpinCountLocal = uTimeout;
|
2023-08-19 17:14:28 +00:00
|
|
|
}
|
2023-08-20 08:47:31 +00:00
|
|
|
|
|
|
|
AUKN_SYM AuUInt32 GetTotalSpinCountTimeout()
|
|
|
|
{
|
|
|
|
AuUInt32 uCount {};
|
2023-08-25 11:42:31 +00:00
|
|
|
|
|
|
|
if (!gRuntimeConfig.threadingConfig.bPlatformIsSMPProcessorOptimized)
|
|
|
|
{
|
|
|
|
return 16;
|
|
|
|
}
|
|
|
|
|
2023-08-27 18:43:21 +00:00
|
|
|
uCount = AuUInt32(gRuntimeConfig.threadingConfig.uSpinLoopPowerA);
|
2023-08-20 08:47:31 +00:00
|
|
|
if (gHasThreadLocalTimeout)
|
|
|
|
{
|
2023-08-20 08:50:41 +00:00
|
|
|
uCount += 1u << AuUInt32(tlsSpinCountLocal);
|
2023-08-20 08:47:31 +00:00
|
|
|
}
|
2023-08-25 11:42:31 +00:00
|
|
|
|
2023-08-20 08:47:31 +00:00
|
|
|
return uCount;
|
|
|
|
}
|
2023-08-20 15:20:57 +00:00
|
|
|
|
|
|
|
AUKN_SYM const ThreadingConfig *GetThreadingConfig()
|
|
|
|
{
|
|
|
|
return &gRuntimeConfig.threadingConfig;
|
|
|
|
}
|
|
|
|
|
|
|
|
AUKN_SYM void SetThreadingConfig(const ThreadingConfig *pUpdateConfig)
|
|
|
|
{
|
|
|
|
if (!pUpdateConfig)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2023-08-21 18:17:05 +00:00
|
|
|
gRuntimeConfig.threadingConfig = decltype(gRuntimeConfig.threadingConfig)(ThreadingConfig(*pUpdateConfig));
|
2023-08-22 11:57:47 +00:00
|
|
|
|
|
|
|
Primitives::InitAdaptiveThreshold();
|
2023-08-20 15:20:57 +00:00
|
|
|
}
|
2023-08-23 13:52:47 +00:00
|
|
|
|
|
|
|
AUKN_SYM bool IsWaitOnRecommended();
|
2023-08-19 17:14:28 +00:00
|
|
|
}
|
|
|
|
|
2023-03-12 15:27:28 +00:00
|
|
|
namespace Aurora::Threading::Primitives
|
|
|
|
{
|
2023-08-22 11:57:47 +00:00
|
|
|
void InitAdaptiveThreshold()
|
|
|
|
{
|
|
|
|
auto uCores = AuHwInfo::GetCPUInfo().uThreads;
|
|
|
|
|
2023-08-23 13:52:47 +00:00
|
|
|
gUseFutexRWLock = gRuntimeConfig.threadingConfig.bPreferFutexRWLock &&
|
|
|
|
IsWaitOnRecommended();
|
2023-03-12 15:27:28 +00:00
|
|
|
|
2023-08-24 14:12:49 +00:00
|
|
|
if (uCores == 1)
|
2023-08-22 11:57:47 +00:00
|
|
|
{
|
|
|
|
gSpinAdaptiveThreshold = 0;
|
2023-08-24 14:12:49 +00:00
|
|
|
gRuntimeConfig.threadingConfig.bPlatformIsSMPProcessorOptimized = false;
|
2023-08-22 11:57:47 +00:00
|
|
|
return;
|
|
|
|
}
|
2023-03-12 15:27:28 +00:00
|
|
|
|
2023-08-24 14:12:49 +00:00
|
|
|
if (!gRuntimeConfig.threadingConfig.bForceEnableAdaptiveSpin)
|
2023-08-23 13:52:47 +00:00
|
|
|
{
|
|
|
|
gSpinAdaptiveThreshold = 0;
|
2023-08-24 14:12:49 +00:00
|
|
|
return;
|
2023-08-23 13:52:47 +00:00
|
|
|
}
|
2023-08-24 14:12:49 +00:00
|
|
|
|
|
|
|
if (uCores >= 16)
|
2023-08-22 11:57:47 +00:00
|
|
|
{
|
|
|
|
gSpinAdaptiveThreshold = uCores / gRuntimeConfig.threadingConfig.uAdaptiveSpinCUCnt16;
|
|
|
|
}
|
|
|
|
else if (uCores >= 8 && gRuntimeConfig.threadingConfig.uAdaptiveSpinCUCnt8)
|
|
|
|
{
|
|
|
|
gSpinAdaptiveThreshold = uCores / gRuntimeConfig.threadingConfig.uAdaptiveSpinCUCnt8;
|
|
|
|
}
|
|
|
|
else if (uCores >= 4 && gRuntimeConfig.threadingConfig.uAdaptiveSpinCUCnt4)
|
|
|
|
{
|
|
|
|
gSpinAdaptiveThreshold = uCores / gRuntimeConfig.threadingConfig.uAdaptiveSpinCUCnt4;
|
|
|
|
}
|
|
|
|
else if (uCores >= 0 && gRuntimeConfig.threadingConfig.uAdaptiveSpinCUCnt0)
|
|
|
|
{
|
|
|
|
gSpinAdaptiveThreshold = uCores / gRuntimeConfig.threadingConfig.uAdaptiveSpinCUCnt0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
gSpinAdaptiveThreshold = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void InitAdaptiveThresholdFirstTime()
|
|
|
|
{
|
|
|
|
if (!gRuntimeConfig.threadingConfig.bForceEnableAdaptiveSpin)
|
|
|
|
{
|
|
|
|
#if defined(AURORA_IS_LINUX_DERIVED)
|
|
|
|
if (gRuntimeConfig.threadingConfig.bPreferLinuxAdaptiveSpin)
|
|
|
|
{
|
|
|
|
gRuntimeConfig.threadingConfig.bForceEnableAdaptiveSpin = true;
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
if (AuSwInfo::IsWindows10OrGreater())
|
|
|
|
{
|
2023-08-27 18:43:21 +00:00
|
|
|
gRuntimeConfig.threadingConfig.bForceEnableAdaptiveSpin = gRuntimeConfig.threadingConfig.bPreferNewWin32AdaptiveSpin;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
gRuntimeConfig.threadingConfig.bForceEnableAdaptiveSpin = gRuntimeConfig.threadingConfig.bPreferOldWin32AdaptiveSpin;
|
2023-08-22 11:57:47 +00:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
InitAdaptiveThreshold();
|
|
|
|
}
|
2023-03-12 15:27:28 +00:00
|
|
|
}
|