small changed

This commit is contained in:
Youmu Liu
2026-04-07 18:08:34 +08:00
parent 7bf2104edb
commit 94a3127c0d
40 changed files with 113 additions and 64 deletions
@@ -44,5 +44,21 @@ namespace StgSharp.Common.HighPerformance.ProcessorAbstraction
/// </summary>
public readonly uint NumaNodeId;
internal LogicalCore(
uint globalCpuId,
uint numaGroupId,
uint numaNodeId
)
{
GlobalCpuId = globalCpuId;
NumaGroupId = numaGroupId;
NumaNodeId = numaNodeId;
}
[Obsolete(
"Do not manually create instances of LogicalCore. Use NumaNode to obtain LogicalCore instances.",
true)]
public LogicalCore() { }
}
}
@@ -47,9 +47,9 @@ namespace StgSharp.Common.HighPerformance.ProcessorAbstraction
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
[DefaultDllImportSearchPaths(DllImportSearchPath.AssemblyDirectory)]
public static partial int GetNumaEach(
int numaId,
Span<ulong> coreCountInNuma,
Span<ulong> globalCpuIdInNuma
uint numaId,
Span<ulong> CpuIndexInNuma,
Span<uint> globalCpuIdInNuma
);
[LibraryImport(Native.LibName, EntryPoint = "sn_get_numa_overall")]
@@ -68,12 +68,22 @@ namespace StgSharp.Common.HighPerformance.ProcessorAbstraction
throw new InvalidOperationException("Failed to get NUMA overall information.");
}
_numaNodes = new NumaNode[numaNodeCount];
for (int i = 0; i < numaNodeCount; i++)
{
NumaNode node = new(coreCountInNuma[i]);
GetNumaEach(i, coreCountInNuma, node.GlobalCpuIds);
for (uint i = 0; i < numaNodeCount; i++) {
_numaNodes[i] = InitNumaNode(i, coreCountInNuma[(int)i]);
}
}
[MethodImpl(MethodImplOptions.NoInlining)]
private static NumaNode InitNumaNode(
uint numaId,
int count
)
{
Span<uint> globalIndex = stackalloc uint[count];
Span<ulong> groupIndex = stackalloc ulong[count];
_ = GetNumaEach(numaId, groupIndex, globalIndex);
return new(numaId, count, globalIndex);
}
}
}
@@ -39,11 +39,17 @@ namespace StgSharp.Common.HighPerformance.ProcessorAbstraction
private LogicalCore[] _logicalCores;
public NumaNode(
int count
internal NumaNode(
uint numaId,
int count,
Span<uint> logicalCoreIds
)
{
_logicalCores = new LogicalCore[count];
for (int i = 0; i < count; i++) {
_logicalCores[i] = new LogicalCore(1, numaId, logicalCoreIds[i]);
}
}
public int LogicalCoreCount => _logicalCores.Length;