Skip to content

Commit 544002c

Browse files
committed
Merge #678: Preventing compiler optimizations in benchmarks without a memory fence
362bb25 Modified bench_scalar_split so it won't get optimized out (Elichai Turkel) 73a30c6 Added accumulators and checks on benchmarks so they won't get optimized out (Elichai Turkel) Pull request description: As asked #667 (comment) this is the parts of #667 that don't require an assembly memory fence. I splitted them to 2 commits, one with obvious easy ones. and another that changes the logic a bit to achieve this (See #667 (comment) ) ACKs for top commit: jonasnick: ACK 362bb25 real-or-random: ACK 362bb25 I read the diff and I ran the benchmarks Tree-SHA512: d5e47f5d64c3b035155276f057671ceb7f5852f24c7102fee4d0141aabebf882039f3eae0d152bae89d0603bc09fa6ad9f7bc6b8c0f74a668ee252c727517804
2 parents 0c774d8 + 362bb25 commit 544002c

File tree

1 file changed

+32
-22
lines changed

1 file changed

+32
-22
lines changed

src/bench_internal.c

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,13 @@ void bench_setup(void* arg) {
5757
}
5858

5959
void bench_scalar_add(void* arg) {
60-
int i;
60+
int i, j = 0;
6161
bench_inv *data = (bench_inv*)arg;
6262

6363
for (i = 0; i < 2000000; i++) {
64-
secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);
64+
j += secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);
6565
}
66+
CHECK(j <= 2000000);
6667
}
6768

6869
void bench_scalar_negate(void* arg) {
@@ -94,35 +95,37 @@ void bench_scalar_mul(void* arg) {
9495

9596
#ifdef USE_ENDOMORPHISM
9697
void bench_scalar_split(void* arg) {
97-
int i;
98+
int i, j = 0;
9899
bench_inv *data = (bench_inv*)arg;
99100

100101
for (i = 0; i < 20000; i++) {
101-
secp256k1_scalar l, r;
102-
secp256k1_scalar_split_lambda(&l, &r, &data->scalar_x);
103-
secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);
102+
secp256k1_scalar_split_lambda(&data->scalar_x, &data->scalar_y, &data->scalar_x);
103+
j += secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);
104104
}
105+
CHECK(j <= 20000);
105106
}
106107
#endif
107108

108109
void bench_scalar_inverse(void* arg) {
109-
int i;
110+
int i, j = 0;
110111
bench_inv *data = (bench_inv*)arg;
111112

112113
for (i = 0; i < 2000; i++) {
113114
secp256k1_scalar_inverse(&data->scalar_x, &data->scalar_x);
114-
secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);
115+
j += secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);
115116
}
117+
CHECK(j <= 2000);
116118
}
117119

118120
void bench_scalar_inverse_var(void* arg) {
119-
int i;
121+
int i, j = 0;
120122
bench_inv *data = (bench_inv*)arg;
121123

122124
for (i = 0; i < 2000; i++) {
123125
secp256k1_scalar_inverse_var(&data->scalar_x, &data->scalar_x);
124-
secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);
126+
j += secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);
125127
}
128+
CHECK(j <= 2000);
126129
}
127130

128131
void bench_field_normalize(void* arg) {
@@ -182,15 +185,16 @@ void bench_field_inverse_var(void* arg) {
182185
}
183186

184187
void bench_field_sqrt(void* arg) {
185-
int i;
188+
int i, j = 0;
186189
bench_inv *data = (bench_inv*)arg;
187190
secp256k1_fe t;
188191

189192
for (i = 0; i < 20000; i++) {
190193
t = data->fe_x;
191-
secp256k1_fe_sqrt(&data->fe_x, &t);
194+
j += secp256k1_fe_sqrt(&data->fe_x, &t);
192195
secp256k1_fe_add(&data->fe_x, &data->fe_y);
193196
}
197+
CHECK(j <= 20000);
194198
}
195199

196200
void bench_group_double_var(void* arg) {
@@ -230,32 +234,37 @@ void bench_group_add_affine_var(void* arg) {
230234
}
231235

232236
void bench_group_jacobi_var(void* arg) {
233-
int i;
237+
int i, j = 0;
234238
bench_inv *data = (bench_inv*)arg;
235239

236240
for (i = 0; i < 20000; i++) {
237-
secp256k1_gej_has_quad_y_var(&data->gej_x);
241+
j += secp256k1_gej_has_quad_y_var(&data->gej_x);
238242
}
243+
CHECK(j == 20000);
239244
}
240245

241246
void bench_ecmult_wnaf(void* arg) {
242-
int i;
247+
int i, bits = 0, overflow = 0;
243248
bench_inv *data = (bench_inv*)arg;
244249

245250
for (i = 0; i < 20000; i++) {
246-
secp256k1_ecmult_wnaf(data->wnaf, 256, &data->scalar_x, WINDOW_A);
247-
secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);
251+
bits += secp256k1_ecmult_wnaf(data->wnaf, 256, &data->scalar_x, WINDOW_A);
252+
overflow += secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);
248253
}
254+
CHECK(overflow >= 0);
255+
CHECK(bits <= 256*20000);
249256
}
250257

251258
void bench_wnaf_const(void* arg) {
252-
int i;
259+
int i, bits = 0, overflow = 0;
253260
bench_inv *data = (bench_inv*)arg;
254261

255262
for (i = 0; i < 20000; i++) {
256-
secp256k1_wnaf_const(data->wnaf, &data->scalar_x, WINDOW_A, 256);
257-
secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);
263+
bits += secp256k1_wnaf_const(data->wnaf, &data->scalar_x, WINDOW_A, 256);
264+
overflow += secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);
258265
}
266+
CHECK(overflow >= 0);
267+
CHECK(bits <= 256*20000);
259268
}
260269

261270

@@ -312,7 +321,7 @@ void bench_context_sign(void* arg) {
312321

313322
#ifndef USE_NUM_NONE
314323
void bench_num_jacobi(void* arg) {
315-
int i;
324+
int i, j = 0;
316325
bench_inv *data = (bench_inv*)arg;
317326
secp256k1_num nx, norder;
318327

@@ -321,8 +330,9 @@ void bench_num_jacobi(void* arg) {
321330
secp256k1_scalar_get_num(&norder, &data->scalar_y);
322331

323332
for (i = 0; i < 200000; i++) {
324-
secp256k1_num_jacobi(&nx, &norder);
333+
j += secp256k1_num_jacobi(&nx, &norder);
325334
}
335+
CHECK(j <= 200000);
326336
}
327337
#endif
328338

0 commit comments

Comments
 (0)