MethodImpl attributes adjustments.
This commit is contained in:
1 parent
ed299edf56
commit
4edad10be8
2 files changed
+18
-19
No files matched your search
@@ -14,7 +14,7 @@ public struct BigIntegerCycleRemainderStepper(BigInteger cycleLength)
|
|||||||
private BigInteger _previousValue = BigInteger.Zero;
|
private BigInteger _previousValue = BigInteger.Zero;
|
||||||
private BigInteger _currentRemainder = BigInteger.Zero;
|
private BigInteger _currentRemainder = BigInteger.Zero;
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
public BigInteger Initialize(BigInteger value)
|
public BigInteger Initialize(BigInteger value)
|
||||||
{
|
{
|
||||||
_previousValue = value;
|
_previousValue = value;
|
||||||
@@ -22,7 +22,7 @@ public struct BigIntegerCycleRemainderStepper(BigInteger cycleLength)
|
|||||||
return _currentRemainder;
|
return _currentRemainder;
|
||||||
}
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
public BigInteger ComputeNext(BigInteger value)
|
public BigInteger ComputeNext(BigInteger value)
|
||||||
{
|
{
|
||||||
BigInteger delta = value - _previousValue;
|
BigInteger delta = value - _previousValue;
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ public struct GpuUInt128 : IComparable<GpuUInt128>, IEquatable<GpuUInt128>
|
|||||||
private const ulong NativeModuloChunkMask = (1UL << NativeModuloChunkBits) - 1UL;
|
private const ulong NativeModuloChunkMask = (1UL << NativeModuloChunkBits) - 1UL;
|
||||||
|
|
||||||
private const int Pow2WindowSizeBits = 8;
|
private const int Pow2WindowSizeBits = 8;
|
||||||
private const int Pow2WindowOddPowerCount = 1 << (Pow2WindowSizeBits - 1);
|
|
||||||
private const int Pow2WindowMaxExponent = (1 << Pow2WindowSizeBits) - 1;
|
private const int Pow2WindowMaxExponent = (1 << Pow2WindowSizeBits) - 1;
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
@@ -54,7 +53,7 @@ public struct GpuUInt128 : IComparable<GpuUInt128>, IEquatable<GpuUInt128>
|
|||||||
get => High == 0UL && Low == 0UL;
|
get => High == 0UL && Low == 0UL;
|
||||||
}
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
public readonly int GetBitLength()
|
public readonly int GetBitLength()
|
||||||
{
|
{
|
||||||
ulong temp = High;
|
ulong temp = High;
|
||||||
@@ -89,7 +88,7 @@ public struct GpuUInt128 : IComparable<GpuUInt128>, IEquatable<GpuUInt128>
|
|||||||
public readonly ReadOnlyGpuUInt128 AsReadOnly() => new(this);
|
public readonly ReadOnlyGpuUInt128 AsReadOnly() => new(this);
|
||||||
|
|
||||||
// Operators must return fresh instances so callers never rely on accidental in-place mutation. Prefer the mutating helpers when state updates are required.
|
// Operators must return fresh instances so callers never rely on accidental in-place mutation. Prefer the mutating helpers when state updates are required.
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
public static GpuUInt128 operator +(GpuUInt128 left, GpuUInt128 right)
|
public static GpuUInt128 operator +(GpuUInt128 left, GpuUInt128 right)
|
||||||
{
|
{
|
||||||
GpuUInt128 result = new(left.High, left.Low);
|
GpuUInt128 result = new(left.High, left.Low);
|
||||||
@@ -97,7 +96,7 @@ public struct GpuUInt128 : IComparable<GpuUInt128>, IEquatable<GpuUInt128>
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
public static GpuUInt128 operator -(GpuUInt128 left, GpuUInt128 right)
|
public static GpuUInt128 operator -(GpuUInt128 left, GpuUInt128 right)
|
||||||
{
|
{
|
||||||
GpuUInt128 result = new(left.High, left.Low);
|
GpuUInt128 result = new(left.High, left.Low);
|
||||||
@@ -105,18 +104,18 @@ public struct GpuUInt128 : IComparable<GpuUInt128>, IEquatable<GpuUInt128>
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
public static GpuUInt128 operator ^(GpuUInt128 left, GpuUInt128 right) =>
|
public static GpuUInt128 operator ^(GpuUInt128 left, GpuUInt128 right) =>
|
||||||
new(left.High ^ right.High, left.Low ^ right.Low);
|
new(left.High ^ right.High, left.Low ^ right.Low);
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
public static GpuUInt128 operator *(GpuUInt128 left, GpuUInt128 right)
|
public static GpuUInt128 operator *(GpuUInt128 left, GpuUInt128 right)
|
||||||
{
|
{
|
||||||
Multiply(left, right, out var high, out var low);
|
Multiply(left, right, out var high, out var low);
|
||||||
return new GpuUInt128(high, low);
|
return new GpuUInt128(high, low);
|
||||||
}
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
public static GpuUInt128 operator <<(GpuUInt128 value, int shift)
|
public static GpuUInt128 operator <<(GpuUInt128 value, int shift)
|
||||||
{
|
{
|
||||||
shift &= 127;
|
shift &= 127;
|
||||||
@@ -144,7 +143,7 @@ public struct GpuUInt128 : IComparable<GpuUInt128>, IEquatable<GpuUInt128>
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
public static GpuUInt128 operator >>(GpuUInt128 value, int shift)
|
public static GpuUInt128 operator >>(GpuUInt128 value, int shift)
|
||||||
{
|
{
|
||||||
shift &= 127;
|
shift &= 127;
|
||||||
@@ -198,7 +197,7 @@ public struct GpuUInt128 : IComparable<GpuUInt128>, IEquatable<GpuUInt128>
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
public readonly int CompareTo(GpuUInt128 other)
|
public readonly int CompareTo(GpuUInt128 other)
|
||||||
{
|
{
|
||||||
if (High < other.High)
|
if (High < other.High)
|
||||||
@@ -224,7 +223,7 @@ public struct GpuUInt128 : IComparable<GpuUInt128>, IEquatable<GpuUInt128>
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
public readonly int CompareTo(in ReadOnlyGpuUInt128 other)
|
public readonly int CompareTo(in ReadOnlyGpuUInt128 other)
|
||||||
{
|
{
|
||||||
if (High < other.High)
|
if (High < other.High)
|
||||||
@@ -266,7 +265,7 @@ public struct GpuUInt128 : IComparable<GpuUInt128>, IEquatable<GpuUInt128>
|
|||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
public void Add(GpuUInt128 other) => Add(other.High, other.Low);
|
public void Add(GpuUInt128 other) => Add(other.High, other.Low);
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
public void Add(ulong otherHigh, ulong otherLow)
|
public void Add(ulong otherHigh, ulong otherLow)
|
||||||
{
|
{
|
||||||
ulong originalLow = Low;
|
ulong originalLow = Low;
|
||||||
@@ -279,7 +278,7 @@ public struct GpuUInt128 : IComparable<GpuUInt128>, IEquatable<GpuUInt128>
|
|||||||
High = low + originalLow;
|
High = low + originalLow;
|
||||||
}
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
public void Add(ulong value)
|
public void Add(ulong value)
|
||||||
{
|
{
|
||||||
ulong low = Low + value;
|
ulong low = Low + value;
|
||||||
@@ -368,7 +367,7 @@ public struct GpuUInt128 : IComparable<GpuUInt128>, IEquatable<GpuUInt128>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
public void AddMod(in ReadOnlyGpuUInt128 value, ulong modulus)
|
public void AddMod(in ReadOnlyGpuUInt128 value, ulong modulus)
|
||||||
{
|
{
|
||||||
// TODO: Pre-reduce the operands via the Montgomery ladder used in MulMod64Benchmarks so the GPU
|
// TODO: Pre-reduce the operands via the Montgomery ladder used in MulMod64Benchmarks so the GPU
|
||||||
@@ -389,7 +388,7 @@ public struct GpuUInt128 : IComparable<GpuUInt128>, IEquatable<GpuUInt128>
|
|||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
public void AddMod(GpuUInt128 value, ulong modulus) => AddMod(value.Low, modulus);
|
public void AddMod(GpuUInt128 value, ulong modulus) => AddMod(value.Low, modulus);
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
public void AddMod(ulong value, ulong modulus)
|
public void AddMod(ulong value, ulong modulus)
|
||||||
{
|
{
|
||||||
// TODO: Fold these operands with the ImmediateModulo helper once the GPU shim exposes it, avoiding
|
// TODO: Fold these operands with the ImmediateModulo helper once the GPU shim exposes it, avoiding
|
||||||
@@ -413,7 +412,7 @@ public struct GpuUInt128 : IComparable<GpuUInt128>, IEquatable<GpuUInt128>
|
|||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
public void Sub(GpuUInt128 other) => SubInternal(other.High, other.Low);
|
public void Sub(GpuUInt128 other) => SubInternal(other.High, other.Low);
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
private void SubInternal(ulong otherHigh, ulong otherLow)
|
private void SubInternal(ulong otherHigh, ulong otherLow)
|
||||||
{
|
{
|
||||||
ulong borrow = Low < otherLow ? 1UL : 0UL;
|
ulong borrow = Low < otherLow ? 1UL : 0UL;
|
||||||
@@ -421,7 +420,7 @@ public struct GpuUInt128 : IComparable<GpuUInt128>, IEquatable<GpuUInt128>
|
|||||||
Low -= otherLow;
|
Low -= otherLow;
|
||||||
}
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
public static ulong MulHigh(ulong x, ulong y)
|
public static ulong MulHigh(ulong x, ulong y)
|
||||||
{
|
{
|
||||||
// TODO: Review if we can reuse any other existing variables to reduce registry pressure.
|
// TODO: Review if we can reuse any other existing variables to reduce registry pressure.
|
||||||
@@ -454,7 +453,7 @@ public struct GpuUInt128 : IComparable<GpuUInt128>, IEquatable<GpuUInt128>
|
|||||||
return yHigh;
|
return yHigh;
|
||||||
}
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
// Kept by-value to coexist with the ref readonly overload below while still signaling read-only intent.
|
// Kept by-value to coexist with the ref readonly overload below while still signaling read-only intent.
|
||||||
public void MulMod(ReadOnlyGpuUInt128 value, in ReadOnlyGpuUInt128 modulus)
|
public void MulMod(ReadOnlyGpuUInt128 value, in ReadOnlyGpuUInt128 modulus)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in new issue
Block a user