Increase arena node size 24 -> 32
This commit is contained in:
+13
-10
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user