working on L4's tlsf
This commit is contained in:
@@ -64,7 +64,7 @@ namespace StgSharp.HighPerformance.Memory
|
||||
private unsafe struct CacheLineMetadata
|
||||
{
|
||||
|
||||
#region lsf area
|
||||
#region tlsf area
|
||||
|
||||
internal const ulong Mask48Bits = 0x0000FFFFFFFFFFFF;
|
||||
|
||||
|
||||
@@ -41,10 +41,21 @@ namespace StgSharp.HighPerformance.Memory
|
||||
private const int PredictionCount = 2048;
|
||||
private const int PredictionLeastAhead = 1024;
|
||||
|
||||
// private static readonly IIntrinsicKernel _intrinsic = IIntrinsicKernel.Instance;
|
||||
/// <summary>
|
||||
/// Array of metadata for each cache line, also used as metadata for tlsf allocator.
|
||||
/// </summary>
|
||||
private readonly CacheLineMetadata* _head;
|
||||
/// <summary>
|
||||
/// Count of cache lines mapped for each prediction, used for eviction policy.
|
||||
/// </summary>
|
||||
private readonly MapArray* _mapCount;
|
||||
/// <summary>
|
||||
/// Count of times each cache line is predicted, used for eviction policy.
|
||||
/// </summary>
|
||||
private readonly PredictionArray* _predictCount;
|
||||
/// <summary>
|
||||
/// Original memory view for prediction span.
|
||||
/// </summary>
|
||||
private readonly CacheLineDescription* _prediction;
|
||||
private bool _disposed;
|
||||
private bool _exhausted;
|
||||
@@ -99,7 +110,7 @@ namespace StgSharp.HighPerformance.Memory
|
||||
ptr += predictionCountSize;
|
||||
|
||||
M512* mPtr = (M512*)_head;
|
||||
for (uint i = 0; i < CacheLineCount; i++) {
|
||||
for (uint i = 1; i < CacheLineCount; i++) {
|
||||
mPtr->BroadCastFrom<ulong>(0);
|
||||
}
|
||||
}
|
||||
@@ -135,17 +146,13 @@ namespace StgSharp.HighPerformance.Memory
|
||||
}
|
||||
_disposed = true;
|
||||
_map.Dispose();
|
||||
#pragma warning disable CA1816
|
||||
GC.SuppressFinalize(_bufferAllocator);
|
||||
#pragma warning restore CA1816
|
||||
|
||||
|
||||
// init order is fallow by align requirement of each component.
|
||||
nuint entrySize = TLSF.RequestedAllocation; // SIMDID, no less than 16 byte bit
|
||||
nuint headSize = ((nuint)Unsafe.SizeOf<CacheLineMetadata>()) * CacheLineCount; // 16 byte align
|
||||
nuint predictionSize = ((nuint)Unsafe.SizeOf<CacheLineDescription>()) * PredictionCount; //16 byte align
|
||||
nuint mapSize = SwissTable.RequestedNativeMemorySize; // 16 byte align
|
||||
nuint predictionCountSize = (nuint)Unsafe.SizeOf<PredictionArray>(); // 16 byte align
|
||||
nuint normalizedBufferSize = ByteCapacity; // align to 4096 byte, page size
|
||||
Numa.Free((void*)_baseAddress, _bindedNuma, entrySize + headSize + mapSize + predictionSize + (predictionCountSize * 2) + normalizedBufferSize);
|
||||
Numa.Free((void*)_baseAddress, _bindedNuma, AllocSize);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
@@ -184,7 +191,7 @@ namespace StgSharp.HighPerformance.Memory
|
||||
_ = Interlocked.Increment(ref _activeCount);
|
||||
_ = Interlocked.Decrement(ref _aheadCount);
|
||||
_ = Interlocked.Decrement(ref (*_mapCount)[entry->Id]);
|
||||
return new L4CacheLine((nuint)entry->Address, ref _activeCount, ref entry->RefCount);
|
||||
return new L4CacheLine((nuint)entry->Position, ref _activeCount, ref entry->RefCount);
|
||||
} else
|
||||
{
|
||||
_ = Interlocked.Decrement(ref entry->RefCount);
|
||||
|
||||
Reference in New Issue
Block a user