Various micro- and medium- optimizations
This commit is contained in:
1 parent
2eb622030e
commit
cd1debe9d6
25 files changed
+4403
-3210
No files matched your search
@@ -12,680 +12,6 @@ public static class ULongExtensions
|
||||
private const ulong Pow2WindowFallbackThreshold = 32UL;
|
||||
private const int Pow2WindowOddPowerCount = 1 << (Pow2WindowSize - 1);
|
||||
|
||||
private struct Pow2OddPowerTable
|
||||
{
|
||||
public ulong Element0;
|
||||
public ulong Element1;
|
||||
public ulong Element2;
|
||||
public ulong Element3;
|
||||
public ulong Element4;
|
||||
public ulong Element5;
|
||||
public ulong Element6;
|
||||
public ulong Element7;
|
||||
public ulong Element8;
|
||||
public ulong Element9;
|
||||
public ulong Element10;
|
||||
public ulong Element11;
|
||||
public ulong Element12;
|
||||
public ulong Element13;
|
||||
public ulong Element14;
|
||||
public ulong Element15;
|
||||
public ulong Element16;
|
||||
public ulong Element17;
|
||||
public ulong Element18;
|
||||
public ulong Element19;
|
||||
public ulong Element20;
|
||||
public ulong Element21;
|
||||
public ulong Element22;
|
||||
public ulong Element23;
|
||||
public ulong Element24;
|
||||
public ulong Element25;
|
||||
public ulong Element26;
|
||||
public ulong Element27;
|
||||
public ulong Element28;
|
||||
public ulong Element29;
|
||||
public ulong Element30;
|
||||
public ulong Element31;
|
||||
public ulong Element32;
|
||||
public ulong Element33;
|
||||
public ulong Element34;
|
||||
public ulong Element35;
|
||||
public ulong Element36;
|
||||
public ulong Element37;
|
||||
public ulong Element38;
|
||||
public ulong Element39;
|
||||
public ulong Element40;
|
||||
public ulong Element41;
|
||||
public ulong Element42;
|
||||
public ulong Element43;
|
||||
public ulong Element44;
|
||||
public ulong Element45;
|
||||
public ulong Element46;
|
||||
public ulong Element47;
|
||||
public ulong Element48;
|
||||
public ulong Element49;
|
||||
public ulong Element50;
|
||||
public ulong Element51;
|
||||
public ulong Element52;
|
||||
public ulong Element53;
|
||||
public ulong Element54;
|
||||
public ulong Element55;
|
||||
public ulong Element56;
|
||||
public ulong Element57;
|
||||
public ulong Element58;
|
||||
public ulong Element59;
|
||||
public ulong Element60;
|
||||
public ulong Element61;
|
||||
public ulong Element62;
|
||||
public ulong Element63;
|
||||
public ulong Element64;
|
||||
public ulong Element65;
|
||||
public ulong Element66;
|
||||
public ulong Element67;
|
||||
public ulong Element68;
|
||||
public ulong Element69;
|
||||
public ulong Element70;
|
||||
public ulong Element71;
|
||||
public ulong Element72;
|
||||
public ulong Element73;
|
||||
public ulong Element74;
|
||||
public ulong Element75;
|
||||
public ulong Element76;
|
||||
public ulong Element77;
|
||||
public ulong Element78;
|
||||
public ulong Element79;
|
||||
public ulong Element80;
|
||||
public ulong Element81;
|
||||
public ulong Element82;
|
||||
public ulong Element83;
|
||||
public ulong Element84;
|
||||
public ulong Element85;
|
||||
public ulong Element86;
|
||||
public ulong Element87;
|
||||
public ulong Element88;
|
||||
public ulong Element89;
|
||||
public ulong Element90;
|
||||
public ulong Element91;
|
||||
public ulong Element92;
|
||||
public ulong Element93;
|
||||
public ulong Element94;
|
||||
public ulong Element95;
|
||||
public ulong Element96;
|
||||
public ulong Element97;
|
||||
public ulong Element98;
|
||||
public ulong Element99;
|
||||
public ulong Element100;
|
||||
public ulong Element101;
|
||||
public ulong Element102;
|
||||
public ulong Element103;
|
||||
public ulong Element104;
|
||||
public ulong Element105;
|
||||
public ulong Element106;
|
||||
public ulong Element107;
|
||||
public ulong Element108;
|
||||
public ulong Element109;
|
||||
public ulong Element110;
|
||||
public ulong Element111;
|
||||
public ulong Element112;
|
||||
public ulong Element113;
|
||||
public ulong Element114;
|
||||
public ulong Element115;
|
||||
public ulong Element116;
|
||||
public ulong Element117;
|
||||
public ulong Element118;
|
||||
public ulong Element119;
|
||||
public ulong Element120;
|
||||
public ulong Element121;
|
||||
public ulong Element122;
|
||||
public ulong Element123;
|
||||
public ulong Element124;
|
||||
public ulong Element125;
|
||||
public ulong Element126;
|
||||
public ulong Element127;
|
||||
|
||||
public ulong this[int index]
|
||||
{
|
||||
get
|
||||
{
|
||||
return GetElement(index);
|
||||
}
|
||||
|
||||
set
|
||||
{
|
||||
SetElement(index, value);
|
||||
}
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private ulong GetElement(int index) => index switch
|
||||
{
|
||||
0 => Element0,
|
||||
1 => Element1,
|
||||
2 => Element2,
|
||||
3 => Element3,
|
||||
4 => Element4,
|
||||
5 => Element5,
|
||||
6 => Element6,
|
||||
7 => Element7,
|
||||
8 => Element8,
|
||||
9 => Element9,
|
||||
10 => Element10,
|
||||
11 => Element11,
|
||||
12 => Element12,
|
||||
13 => Element13,
|
||||
14 => Element14,
|
||||
15 => Element15,
|
||||
16 => Element16,
|
||||
17 => Element17,
|
||||
18 => Element18,
|
||||
19 => Element19,
|
||||
20 => Element20,
|
||||
21 => Element21,
|
||||
22 => Element22,
|
||||
23 => Element23,
|
||||
24 => Element24,
|
||||
25 => Element25,
|
||||
26 => Element26,
|
||||
27 => Element27,
|
||||
28 => Element28,
|
||||
29 => Element29,
|
||||
30 => Element30,
|
||||
31 => Element31,
|
||||
32 => Element32,
|
||||
33 => Element33,
|
||||
34 => Element34,
|
||||
35 => Element35,
|
||||
36 => Element36,
|
||||
37 => Element37,
|
||||
38 => Element38,
|
||||
39 => Element39,
|
||||
40 => Element40,
|
||||
41 => Element41,
|
||||
42 => Element42,
|
||||
43 => Element43,
|
||||
44 => Element44,
|
||||
45 => Element45,
|
||||
46 => Element46,
|
||||
47 => Element47,
|
||||
48 => Element48,
|
||||
49 => Element49,
|
||||
50 => Element50,
|
||||
51 => Element51,
|
||||
52 => Element52,
|
||||
53 => Element53,
|
||||
54 => Element54,
|
||||
55 => Element55,
|
||||
56 => Element56,
|
||||
57 => Element57,
|
||||
58 => Element58,
|
||||
59 => Element59,
|
||||
60 => Element60,
|
||||
61 => Element61,
|
||||
62 => Element62,
|
||||
63 => Element63,
|
||||
64 => Element64,
|
||||
65 => Element65,
|
||||
66 => Element66,
|
||||
67 => Element67,
|
||||
68 => Element68,
|
||||
69 => Element69,
|
||||
70 => Element70,
|
||||
71 => Element71,
|
||||
72 => Element72,
|
||||
73 => Element73,
|
||||
74 => Element74,
|
||||
75 => Element75,
|
||||
76 => Element76,
|
||||
77 => Element77,
|
||||
78 => Element78,
|
||||
79 => Element79,
|
||||
80 => Element80,
|
||||
81 => Element81,
|
||||
82 => Element82,
|
||||
83 => Element83,
|
||||
84 => Element84,
|
||||
85 => Element85,
|
||||
86 => Element86,
|
||||
87 => Element87,
|
||||
88 => Element88,
|
||||
89 => Element89,
|
||||
90 => Element90,
|
||||
91 => Element91,
|
||||
92 => Element92,
|
||||
93 => Element93,
|
||||
94 => Element94,
|
||||
95 => Element95,
|
||||
96 => Element96,
|
||||
97 => Element97,
|
||||
98 => Element98,
|
||||
99 => Element99,
|
||||
100 => Element100,
|
||||
101 => Element101,
|
||||
102 => Element102,
|
||||
103 => Element103,
|
||||
104 => Element104,
|
||||
105 => Element105,
|
||||
106 => Element106,
|
||||
107 => Element107,
|
||||
108 => Element108,
|
||||
109 => Element109,
|
||||
110 => Element110,
|
||||
111 => Element111,
|
||||
112 => Element112,
|
||||
113 => Element113,
|
||||
114 => Element114,
|
||||
115 => Element115,
|
||||
116 => Element116,
|
||||
117 => Element117,
|
||||
118 => Element118,
|
||||
119 => Element119,
|
||||
120 => Element120,
|
||||
121 => Element121,
|
||||
122 => Element122,
|
||||
123 => Element123,
|
||||
124 => Element124,
|
||||
125 => Element125,
|
||||
126 => Element126,
|
||||
127 => Element127,
|
||||
_ => Element0,
|
||||
};
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private void SetElement(int index, ulong value)
|
||||
{
|
||||
switch (index)
|
||||
{
|
||||
case 0:
|
||||
Element0 = value;
|
||||
return;
|
||||
case 1:
|
||||
Element1 = value;
|
||||
return;
|
||||
case 2:
|
||||
Element2 = value;
|
||||
return;
|
||||
case 3:
|
||||
Element3 = value;
|
||||
return;
|
||||
case 4:
|
||||
Element4 = value;
|
||||
return;
|
||||
case 5:
|
||||
Element5 = value;
|
||||
return;
|
||||
case 6:
|
||||
Element6 = value;
|
||||
return;
|
||||
case 7:
|
||||
Element7 = value;
|
||||
return;
|
||||
case 8:
|
||||
Element8 = value;
|
||||
return;
|
||||
case 9:
|
||||
Element9 = value;
|
||||
return;
|
||||
case 10:
|
||||
Element10 = value;
|
||||
return;
|
||||
case 11:
|
||||
Element11 = value;
|
||||
return;
|
||||
case 12:
|
||||
Element12 = value;
|
||||
return;
|
||||
case 13:
|
||||
Element13 = value;
|
||||
return;
|
||||
case 14:
|
||||
Element14 = value;
|
||||
return;
|
||||
case 15:
|
||||
Element15 = value;
|
||||
return;
|
||||
case 16:
|
||||
Element16 = value;
|
||||
return;
|
||||
case 17:
|
||||
Element17 = value;
|
||||
return;
|
||||
case 18:
|
||||
Element18 = value;
|
||||
return;
|
||||
case 19:
|
||||
Element19 = value;
|
||||
return;
|
||||
case 20:
|
||||
Element20 = value;
|
||||
return;
|
||||
case 21:
|
||||
Element21 = value;
|
||||
return;
|
||||
case 22:
|
||||
Element22 = value;
|
||||
return;
|
||||
case 23:
|
||||
Element23 = value;
|
||||
return;
|
||||
case 24:
|
||||
Element24 = value;
|
||||
return;
|
||||
case 25:
|
||||
Element25 = value;
|
||||
return;
|
||||
case 26:
|
||||
Element26 = value;
|
||||
return;
|
||||
case 27:
|
||||
Element27 = value;
|
||||
return;
|
||||
case 28:
|
||||
Element28 = value;
|
||||
return;
|
||||
case 29:
|
||||
Element29 = value;
|
||||
return;
|
||||
case 30:
|
||||
Element30 = value;
|
||||
return;
|
||||
case 31:
|
||||
Element31 = value;
|
||||
return;
|
||||
case 32:
|
||||
Element32 = value;
|
||||
return;
|
||||
case 33:
|
||||
Element33 = value;
|
||||
return;
|
||||
case 34:
|
||||
Element34 = value;
|
||||
return;
|
||||
case 35:
|
||||
Element35 = value;
|
||||
return;
|
||||
case 36:
|
||||
Element36 = value;
|
||||
return;
|
||||
case 37:
|
||||
Element37 = value;
|
||||
return;
|
||||
case 38:
|
||||
Element38 = value;
|
||||
return;
|
||||
case 39:
|
||||
Element39 = value;
|
||||
return;
|
||||
case 40:
|
||||
Element40 = value;
|
||||
return;
|
||||
case 41:
|
||||
Element41 = value;
|
||||
return;
|
||||
case 42:
|
||||
Element42 = value;
|
||||
return;
|
||||
case 43:
|
||||
Element43 = value;
|
||||
return;
|
||||
case 44:
|
||||
Element44 = value;
|
||||
return;
|
||||
case 45:
|
||||
Element45 = value;
|
||||
return;
|
||||
case 46:
|
||||
Element46 = value;
|
||||
return;
|
||||
case 47:
|
||||
Element47 = value;
|
||||
return;
|
||||
case 48:
|
||||
Element48 = value;
|
||||
return;
|
||||
case 49:
|
||||
Element49 = value;
|
||||
return;
|
||||
case 50:
|
||||
Element50 = value;
|
||||
return;
|
||||
case 51:
|
||||
Element51 = value;
|
||||
return;
|
||||
case 52:
|
||||
Element52 = value;
|
||||
return;
|
||||
case 53:
|
||||
Element53 = value;
|
||||
return;
|
||||
case 54:
|
||||
Element54 = value;
|
||||
return;
|
||||
case 55:
|
||||
Element55 = value;
|
||||
return;
|
||||
case 56:
|
||||
Element56 = value;
|
||||
return;
|
||||
case 57:
|
||||
Element57 = value;
|
||||
return;
|
||||
case 58:
|
||||
Element58 = value;
|
||||
return;
|
||||
case 59:
|
||||
Element59 = value;
|
||||
return;
|
||||
case 60:
|
||||
Element60 = value;
|
||||
return;
|
||||
case 61:
|
||||
Element61 = value;
|
||||
return;
|
||||
case 62:
|
||||
Element62 = value;
|
||||
return;
|
||||
case 63:
|
||||
Element63 = value;
|
||||
return;
|
||||
case 64:
|
||||
Element64 = value;
|
||||
return;
|
||||
case 65:
|
||||
Element65 = value;
|
||||
return;
|
||||
case 66:
|
||||
Element66 = value;
|
||||
return;
|
||||
case 67:
|
||||
Element67 = value;
|
||||
return;
|
||||
case 68:
|
||||
Element68 = value;
|
||||
return;
|
||||
case 69:
|
||||
Element69 = value;
|
||||
return;
|
||||
case 70:
|
||||
Element70 = value;
|
||||
return;
|
||||
case 71:
|
||||
Element71 = value;
|
||||
return;
|
||||
case 72:
|
||||
Element72 = value;
|
||||
return;
|
||||
case 73:
|
||||
Element73 = value;
|
||||
return;
|
||||
case 74:
|
||||
Element74 = value;
|
||||
return;
|
||||
case 75:
|
||||
Element75 = value;
|
||||
return;
|
||||
case 76:
|
||||
Element76 = value;
|
||||
return;
|
||||
case 77:
|
||||
Element77 = value;
|
||||
return;
|
||||
case 78:
|
||||
Element78 = value;
|
||||
return;
|
||||
case 79:
|
||||
Element79 = value;
|
||||
return;
|
||||
case 80:
|
||||
Element80 = value;
|
||||
return;
|
||||
case 81:
|
||||
Element81 = value;
|
||||
return;
|
||||
case 82:
|
||||
Element82 = value;
|
||||
return;
|
||||
case 83:
|
||||
Element83 = value;
|
||||
return;
|
||||
case 84:
|
||||
Element84 = value;
|
||||
return;
|
||||
case 85:
|
||||
Element85 = value;
|
||||
return;
|
||||
case 86:
|
||||
Element86 = value;
|
||||
return;
|
||||
case 87:
|
||||
Element87 = value;
|
||||
return;
|
||||
case 88:
|
||||
Element88 = value;
|
||||
return;
|
||||
case 89:
|
||||
Element89 = value;
|
||||
return;
|
||||
case 90:
|
||||
Element90 = value;
|
||||
return;
|
||||
case 91:
|
||||
Element91 = value;
|
||||
return;
|
||||
case 92:
|
||||
Element92 = value;
|
||||
return;
|
||||
case 93:
|
||||
Element93 = value;
|
||||
return;
|
||||
case 94:
|
||||
Element94 = value;
|
||||
return;
|
||||
case 95:
|
||||
Element95 = value;
|
||||
return;
|
||||
case 96:
|
||||
Element96 = value;
|
||||
return;
|
||||
case 97:
|
||||
Element97 = value;
|
||||
return;
|
||||
case 98:
|
||||
Element98 = value;
|
||||
return;
|
||||
case 99:
|
||||
Element99 = value;
|
||||
return;
|
||||
case 100:
|
||||
Element100 = value;
|
||||
return;
|
||||
case 101:
|
||||
Element101 = value;
|
||||
return;
|
||||
case 102:
|
||||
Element102 = value;
|
||||
return;
|
||||
case 103:
|
||||
Element103 = value;
|
||||
return;
|
||||
case 104:
|
||||
Element104 = value;
|
||||
return;
|
||||
case 105:
|
||||
Element105 = value;
|
||||
return;
|
||||
case 106:
|
||||
Element106 = value;
|
||||
return;
|
||||
case 107:
|
||||
Element107 = value;
|
||||
return;
|
||||
case 108:
|
||||
Element108 = value;
|
||||
return;
|
||||
case 109:
|
||||
Element109 = value;
|
||||
return;
|
||||
case 110:
|
||||
Element110 = value;
|
||||
return;
|
||||
case 111:
|
||||
Element111 = value;
|
||||
return;
|
||||
case 112:
|
||||
Element112 = value;
|
||||
return;
|
||||
case 113:
|
||||
Element113 = value;
|
||||
return;
|
||||
case 114:
|
||||
Element114 = value;
|
||||
return;
|
||||
case 115:
|
||||
Element115 = value;
|
||||
return;
|
||||
case 116:
|
||||
Element116 = value;
|
||||
return;
|
||||
case 117:
|
||||
Element117 = value;
|
||||
return;
|
||||
case 118:
|
||||
Element118 = value;
|
||||
return;
|
||||
case 119:
|
||||
Element119 = value;
|
||||
return;
|
||||
case 120:
|
||||
Element120 = value;
|
||||
return;
|
||||
case 121:
|
||||
Element121 = value;
|
||||
return;
|
||||
case 122:
|
||||
Element122 = value;
|
||||
return;
|
||||
case 123:
|
||||
Element123 = value;
|
||||
return;
|
||||
case 124:
|
||||
Element124 = value;
|
||||
return;
|
||||
case 125:
|
||||
Element125 = value;
|
||||
return;
|
||||
case 126:
|
||||
Element126 = value;
|
||||
return;
|
||||
case 127:
|
||||
Element127 = value;
|
||||
return;
|
||||
default:
|
||||
// ILGPU kernels cannot throw exceptions, and callers guarantee the index range.
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static ulong CalculateOrder(this ulong q)
|
||||
{
|
||||
if (q <= 2UL)
|
||||
@@ -1019,8 +345,7 @@ public static class ULongExtensions
|
||||
|
||||
ulong result = divisor.MontgomeryOne;
|
||||
ulong nPrime = divisor.NPrime;
|
||||
Pow2OddPowerTable oddPowers = default;
|
||||
InitializeMontgomeryOddPowers(divisor, modulus, nPrime, ref oddPowers, oddPowerCount);
|
||||
ulong[] oddPowers = InitializeMontgomeryOddPowers(divisor, modulus, nPrime, oddPowerCount);
|
||||
|
||||
int index = bitLength - 1;
|
||||
while (index >= 0)
|
||||
@@ -1136,12 +461,13 @@ public static class ULongExtensions
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static void InitializeMontgomeryOddPowers(in MontgomeryDivisorData divisor, ulong modulus, ulong nPrime, ref Pow2OddPowerTable oddPowers, int oddPowerCount)
|
||||
private static ulong[] InitializeMontgomeryOddPowers(in MontgomeryDivisorData divisor, ulong modulus, ulong nPrime, int oddPowerCount)
|
||||
{
|
||||
ulong[] oddPowers = new ulong[PerfectNumberConstants.MaxOddPowersCount];
|
||||
oddPowers[0] = divisor.MontgomeryTwo;
|
||||
if (oddPowerCount == 1)
|
||||
{
|
||||
return;
|
||||
return oddPowers;
|
||||
}
|
||||
|
||||
ulong square = divisor.MontgomeryTwoSquared;
|
||||
@@ -1150,6 +476,8 @@ public static class ULongExtensions
|
||||
ulong previous = oddPowers[i - 1];
|
||||
oddPowers[i] = previous.MontgomeryMultiply(square, modulus, nPrime);
|
||||
}
|
||||
|
||||
return oddPowers;
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
|
||||
Reference in new issue
Block a user