Skip to content

Commit 0db2a0a

Browse files
ADD: UInt256 implementation of evm's op MOD (#9188)
* ADD: UInt256 implementation of evm's op MOD Signed-off-by: Thomas Zamojski <thomas.zamojski@quadratic-labs.com> Signed-off-by: Nikos Baxevanis <nikos.baxevanis@gmail.com> Co-authored-by: Nikos Baxevanis <nikos.baxevanis@gmail.com>
1 parent 531bfa6 commit 0db2a0a

File tree

13 files changed

+1816
-80
lines changed

13 files changed

+1816
-80
lines changed

ethereum/core/src/jmh/java/org/hyperledger/besu/ethereum/vm/operations/AddModOperationBenchmark.java

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,149 @@
1818
import org.hyperledger.besu.evm.operation.AddModOperation;
1919
import org.hyperledger.besu.evm.operation.Operation;
2020

21+
import java.util.concurrent.ThreadLocalRandom;
22+
23+
import org.apache.tuweni.bytes.Bytes;
24+
import org.openjdk.jmh.annotations.Level;
25+
import org.openjdk.jmh.annotations.Param;
26+
import org.openjdk.jmh.annotations.Setup;
27+
2128
public class AddModOperationBenchmark extends TernaryOperationBenchmark {
2229

30+
// Benches for (a + b) % c
31+
32+
// Define available scenarios
33+
public enum Case {
34+
ADDMOD_32_32_32(1, 1, 1),
35+
ADDMOD_64_32_32(2, 1, 1),
36+
ADDMOD_64_64_32(2, 2, 1),
37+
ADDMOD_64_64_64(2, 2, 2),
38+
ADDMOD_128_32_32(4, 1, 1),
39+
ADDMOD_128_64_32(4, 2, 1),
40+
ADDMOD_128_64_64(4, 2, 2),
41+
ADDMOD_128_128_32(4, 4, 1),
42+
ADDMOD_128_128_64(4, 4, 2),
43+
ADDMOD_128_128_128(4, 4, 3),
44+
ADDMOD_192_32_32(6, 1, 1),
45+
ADDMOD_192_64_32(6, 2, 1),
46+
ADDMOD_192_64_64(6, 2, 2),
47+
ADDMOD_192_128_32(6, 4, 1),
48+
ADDMOD_192_128_64(6, 4, 2),
49+
ADDMOD_192_128_128(6, 4, 4),
50+
ADDMOD_192_192_32(6, 6, 1),
51+
ADDMOD_192_192_64(6, 6, 2),
52+
ADDMOD_192_192_128(6, 6, 4),
53+
ADDMOD_192_192_192(6, 6, 6),
54+
ADDMOD_256_32_32(8, 1, 1),
55+
ADDMOD_256_64_32(8, 2, 1),
56+
ADDMOD_256_64_64(8, 2, 2),
57+
ADDMOD_256_128_32(8, 4, 1),
58+
ADDMOD_256_128_64(8, 4, 2),
59+
ADDMOD_256_128_128(8, 4, 4),
60+
ADDMOD_256_192_32(8, 6, 1),
61+
ADDMOD_256_192_64(8, 6, 2),
62+
ADDMOD_256_192_128(8, 6, 4),
63+
ADDMOD_256_192_192(8, 6, 6),
64+
ADDMOD_256_256_32(8, 8, 1),
65+
ADDMOD_256_256_64(8, 8, 2),
66+
ADDMOD_256_256_128(8, 8, 4),
67+
ADDMOD_256_256_192(8, 8, 6),
68+
ADDMOD_256_256_256(8, 8, 8),
69+
LARGER_ADDMOD_64_64_128(2, 2, 4),
70+
LARGER_ADDMOD_192_192_256(6, 6, 8),
71+
ZERO_ADDMOD_128_256_0(4, 8, 0),
72+
FULL_RANDOM(-1, -1, -1);
73+
74+
final int aSize;
75+
final int bSize;
76+
final int cSize;
77+
78+
Case(final int aSize, final int bSize, final int cSize) {
79+
this.aSize = aSize;
80+
this.bSize = bSize;
81+
this.cSize = cSize;
82+
}
83+
}
84+
85+
@Param({
86+
"ADDMOD_32_32_32",
87+
"ADDMOD_64_32_32",
88+
"ADDMOD_64_64_32",
89+
"ADDMOD_64_64_64",
90+
"ADDMOD_128_32_32",
91+
"ADDMOD_128_64_32",
92+
"ADDMOD_128_64_64",
93+
"ADDMOD_128_128_32",
94+
"ADDMOD_128_128_64",
95+
"ADDMOD_128_128_128",
96+
"ADDMOD_192_32_32",
97+
"ADDMOD_192_64_32",
98+
"ADDMOD_192_64_64",
99+
"ADDMOD_192_128_32",
100+
"ADDMOD_192_128_64",
101+
"ADDMOD_192_128_128",
102+
"ADDMOD_192_192_32",
103+
"ADDMOD_192_192_64",
104+
"ADDMOD_192_192_128",
105+
"ADDMOD_192_192_192",
106+
"ADDMOD_256_32_32",
107+
"ADDMOD_256_64_32",
108+
"ADDMOD_256_64_64",
109+
"ADDMOD_256_128_32",
110+
"ADDMOD_256_128_64",
111+
"ADDMOD_256_128_128",
112+
"ADDMOD_256_192_32",
113+
"ADDMOD_256_192_64",
114+
"ADDMOD_256_192_128",
115+
"ADDMOD_256_192_192",
116+
"ADDMOD_256_256_32",
117+
"ADDMOD_256_256_64",
118+
"ADDMOD_256_256_128",
119+
"ADDMOD_256_256_192",
120+
"ADDMOD_256_256_256",
121+
"LARGER_ADDMOD_64_64_128",
122+
"LARGER_ADDMOD_192_192_256",
123+
"ZERO_ADDMOD_128_256_0",
124+
"FULL_RANDOM"
125+
})
126+
private String caseName;
127+
128+
@Setup(Level.Iteration)
129+
@Override
130+
public void setUp() {
131+
frame = BenchmarkHelper.createMessageCallFrame();
132+
133+
Case scenario = Case.valueOf(caseName);
134+
aPool = new Bytes[SAMPLE_SIZE];
135+
bPool = new Bytes[SAMPLE_SIZE];
136+
cPool = new Bytes[SAMPLE_SIZE];
137+
138+
final ThreadLocalRandom random = ThreadLocalRandom.current();
139+
int aSize;
140+
int bSize;
141+
int cSize;
142+
143+
for (int i = 0; i < SAMPLE_SIZE; i++) {
144+
if (scenario.aSize < 0) aSize = random.nextInt(1, 33);
145+
else aSize = scenario.aSize * 4;
146+
if (scenario.bSize < 0) bSize = random.nextInt(1, 33);
147+
else bSize = scenario.bSize * 4;
148+
if (scenario.cSize < 0) cSize = random.nextInt(1, 33);
149+
else cSize = scenario.cSize * 4;
150+
151+
final byte[] a = new byte[aSize];
152+
final byte[] b = new byte[bSize];
153+
final byte[] c = new byte[cSize];
154+
random.nextBytes(a);
155+
random.nextBytes(b);
156+
random.nextBytes(c);
157+
aPool[i] = Bytes.wrap(a);
158+
bPool[i] = Bytes.wrap(b);
159+
cPool[i] = Bytes.wrap(c);
160+
}
161+
index = 0;
162+
}
163+
23164
@Override
24165
protected Operation.OperationResult invoke(final MessageFrame frame) {
25166
return AddModOperation.staticOperation(frame);

ethereum/core/src/jmh/java/org/hyperledger/besu/ethereum/vm/operations/ModOperationBenchmark.java

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,113 @@
1818
import org.hyperledger.besu.evm.operation.ModOperation;
1919
import org.hyperledger.besu.evm.operation.Operation;
2020

21+
import java.math.BigInteger;
22+
import java.util.concurrent.ThreadLocalRandom;
23+
24+
import org.apache.tuweni.bytes.Bytes;
25+
import org.openjdk.jmh.annotations.Level;
26+
import org.openjdk.jmh.annotations.Param;
27+
import org.openjdk.jmh.annotations.Setup;
28+
2129
public class ModOperationBenchmark extends BinaryOperationBenchmark {
30+
// Benches for a % b
31+
32+
// Define available scenarios
33+
public enum Case {
34+
MOD_32_32(1, 1),
35+
MOD_64_32(2, 1),
36+
MOD_64_64(2, 2),
37+
MOD_128_32(4, 1),
38+
MOD_128_64(4, 2),
39+
MOD_128_128(4, 4),
40+
MOD_192_32(6, 1),
41+
MOD_192_64(6, 2),
42+
MOD_192_128(6, 4),
43+
MOD_192_192(6, 6),
44+
MOD_256_32(8, 1),
45+
MOD_256_64(8, 2),
46+
MOD_256_128(8, 4),
47+
MOD_256_192(8, 6),
48+
MOD_256_256(8, 8),
49+
LARGER_MOD_64_128(2, 4),
50+
LARGER_MOD_192_256(6, 8),
51+
ZERO_MOD_128_0(4, 0),
52+
FULL_RANDOM(-1, -1);
53+
54+
final int divSize;
55+
final int modSize;
56+
57+
Case(final int divSize, final int modSize) {
58+
this.divSize = divSize;
59+
this.modSize = modSize;
60+
}
61+
}
62+
63+
@Param({
64+
"MOD_32_32",
65+
"MOD_64_32",
66+
"MOD_64_64",
67+
"MOD_128_32",
68+
"MOD_128_64",
69+
"MOD_128_128",
70+
"MOD_192_32",
71+
"MOD_192_64",
72+
"MOD_192_128",
73+
"MOD_192_192",
74+
"MOD_256_32",
75+
"MOD_256_64",
76+
"MOD_256_128",
77+
"MOD_256_192",
78+
"MOD_256_256",
79+
"LARGER_MOD_64_128",
80+
"LARGER_MOD_192_256",
81+
"ZERO_MOD_128_0",
82+
"FULL_RANDOM"
83+
})
84+
private String caseName;
85+
86+
@Setup(Level.Iteration)
87+
@Override
88+
public void setUp() {
89+
frame = BenchmarkHelper.createMessageCallFrame();
90+
91+
Case scenario = Case.valueOf(caseName);
92+
aPool = new Bytes[SAMPLE_SIZE];
93+
bPool = new Bytes[SAMPLE_SIZE];
94+
95+
final ThreadLocalRandom random = ThreadLocalRandom.current();
96+
int aSize;
97+
int bSize;
98+
99+
for (int i = 0; i < SAMPLE_SIZE; i++) {
100+
if (scenario.divSize < 0) aSize = random.nextInt(1, 33);
101+
else aSize = scenario.divSize * 4;
102+
if (scenario.modSize < 0) bSize = random.nextInt(1, 33);
103+
else bSize = scenario.modSize * 4;
104+
105+
final byte[] a = new byte[aSize];
106+
final byte[] b = new byte[bSize];
107+
random.nextBytes(a);
108+
random.nextBytes(b);
109+
110+
// Swap a and b if necessary
111+
if ((scenario.divSize != scenario.modSize)) {
112+
aPool[i] = Bytes.wrap(a);
113+
bPool[i] = Bytes.wrap(b);
114+
} else {
115+
BigInteger aInt = new BigInteger(a);
116+
BigInteger bInt = new BigInteger(b);
117+
if ((aInt.compareTo(bInt) < 0)) {
118+
aPool[i] = Bytes.wrap(b);
119+
bPool[i] = Bytes.wrap(a);
120+
} else {
121+
aPool[i] = Bytes.wrap(a);
122+
bPool[i] = Bytes.wrap(b);
123+
}
124+
}
125+
}
126+
index = 0;
127+
}
22128

23129
@Override
24130
protected Operation.OperationResult invoke(final MessageFrame frame) {

0 commit comments

Comments
 (0)