Increase arena node size 24 -> 32

This commit is contained in:
Asriel Camora
2024-03-03 19:00:39 -08:00
parent 6f094c58ae
commit 923f29cf3c
2 changed files with 20 additions and 26 deletions
+13 -10
View File
@@ -4,31 +4,34 @@ using System.Runtime.CompilerServices;
namespace Craftimizer.Solver; namespace Craftimizer.Solver;
// Adapted from https://github.com/dtao/ConcurrentList/blob/4fcf1c76e93021a41af5abb2d61a63caeba2adad/ConcurrentList/ConcurrentList.cs public struct ArenaBuffer
public struct ArenaBuffer<T> where T : struct
{ {
// Technically 25, but it's very unlikely to actually get to there. // Technically 25, but it's very unlikely to actually get to there.
// The benchmark reaches 20 at most, but here we have a little leeway just in case. // The benchmark reaches 20 at most, but here we have a little leeway just in case.
private const int MaxSize = 24; internal const int MaxSize = 32;
private static readonly int BatchSize = Vector<float>.Count; internal static readonly int BatchSize = Vector<float>.Count;
private static readonly int BatchSizeBits = int.Log2(BatchSize); internal static readonly int BatchSizeBits = int.Log2(BatchSize);
private static readonly int BatchSizeMask = BatchSize - 1; internal static readonly int BatchSizeMask = BatchSize - 1;
private static readonly int BatchCount = MaxSize / BatchSize; internal static readonly int BatchCount = MaxSize / BatchSize;
}
// Adapted from https://github.com/dtao/ConcurrentList/blob/4fcf1c76e93021a41af5abb2d61a63caeba2adad/ConcurrentList/ConcurrentList.cs
public struct ArenaBuffer<T> where T : struct
{
public ArenaNode<T>[][] Data; public ArenaNode<T>[][] Data;
public int Count { get; private set; } public int Count { get; private set; }
public void Add(ArenaNode<T> node) public void Add(ArenaNode<T> node)
{ {
Data ??= new ArenaNode<T>[BatchCount][]; Data ??= new ArenaNode<T>[ArenaBuffer.BatchCount][];
var idx = Count++; var idx = Count++;
var (arrayIdx, subIdx) = GetArrayIndex(idx); var (arrayIdx, subIdx) = GetArrayIndex(idx);
Data[arrayIdx] ??= new ArenaNode<T>[BatchSize]; Data[arrayIdx] ??= new ArenaNode<T>[ArenaBuffer.BatchSize];
node.ChildIdx = (arrayIdx, subIdx); node.ChildIdx = (arrayIdx, subIdx);
Data[arrayIdx][subIdx] = node; Data[arrayIdx][subIdx] = node;
@@ -37,5 +40,5 @@ public struct ArenaBuffer<T> where T : struct
[Pure] [Pure]
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
private static (int arrayIdx, int subIdx) GetArrayIndex(int idx) => private static (int arrayIdx, int subIdx) GetArrayIndex(int idx) =>
(idx >> BatchSizeBits, idx & BatchSizeMask); (idx >> ArenaBuffer.BatchSizeBits, idx & ArenaBuffer.BatchSizeMask);
} }
+7 -16
View File
@@ -1,12 +1,13 @@
using System.Diagnostics.Contracts; using System.Diagnostics.Contracts;
using System.Numerics;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace Craftimizer.Solver; namespace Craftimizer.Solver;
// Adapted from https://github.com/dtao/ConcurrentList/blob/4fcf1c76e93021a41af5abb2d61a63caeba2adad/ConcurrentList/ConcurrentList.cs // Adapted from https://github.com/dtao/ConcurrentList/blob/4fcf1c76e93021a41af5abb2d61a63caeba2adad/ConcurrentList/ConcurrentList.cs
public struct NodeScoresBuffer public struct NodeScoresBuffer
{ {
[StructLayout(LayoutKind.Auto)]
public readonly struct ScoresBatch public readonly struct ScoresBatch
{ {
public readonly Memory<float> ScoreSum; public readonly Memory<float> ScoreSum;
@@ -15,28 +16,18 @@ public struct NodeScoresBuffer
public ScoresBatch() public ScoresBatch()
{ {
ScoreSum = new float[BatchSize]; ScoreSum = new float[ArenaBuffer.BatchSize];
MaxScore = new float[BatchSize]; MaxScore = new float[ArenaBuffer.BatchSize];
Visits = new int[BatchSize]; Visits = new int[ArenaBuffer.BatchSize];
} }
} }
// Technically 25, but it's very unlikely to actually get to there.
// The benchmark reaches 20 at most, but here we have a little leeway just in case.
private const int MaxSize = 24;
private static readonly int BatchSize = Vector<float>.Count;
private static readonly int BatchSizeBits = int.Log2(BatchSize);
private static readonly int BatchSizeMask = BatchSize - 1;
private static readonly int BatchCount = MaxSize / BatchSize;
public ScoresBatch[] Data; public ScoresBatch[] Data;
public int Count { get; private set; } public int Count { get; private set; }
public void Add() public void Add()
{ {
Data ??= new ScoresBatch[BatchCount]; Data ??= new ScoresBatch[ArenaBuffer.BatchCount];
var idx = Count++; var idx = Count++;
@@ -59,5 +50,5 @@ public struct NodeScoresBuffer
[Pure] [Pure]
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
private static (int arrayIdx, int subIdx) GetArrayIndex(int idx) => private static (int arrayIdx, int subIdx) GetArrayIndex(int idx) =>
(idx >> BatchSizeBits, idx & BatchSizeMask); (idx >> ArenaBuffer.BatchSizeBits, idx & ArenaBuffer.BatchSizeMask);
} }