@@ -28,19 +28,26 @@ typedef struct {
28
28
secp256k1_gej * expected_output ;
29
29
secp256k1_ecmult_multi_func ecmult_multi ;
30
30
31
- /* Changes per test */
31
+ /* Changes per benchmark */
32
32
size_t count ;
33
33
int includes_g ;
34
34
35
- /* Changes per test iteration */
35
+ /* Changes per benchmark iteration, used to pick different scalars and pubkeys
36
+ * in each run. */
36
37
size_t offset1 ;
37
38
size_t offset2 ;
38
39
39
- /* Test output. */
40
+ /* Benchmark output. */
40
41
secp256k1_gej * output ;
41
42
} bench_data ;
42
43
43
- static int bench_callback (secp256k1_scalar * sc , secp256k1_ge * ge , size_t idx , void * arg ) {
44
+ /* Hashes x into [0, POINTS) twice and store the result in offset1 and offset2. */
45
+ static void hash_into_offset (bench_data * data , size_t x ) {
46
+ data -> offset1 = (x * 0x537b7f6f + 0x8f66a481 ) % POINTS ;
47
+ data -> offset2 = (x * 0x7f6f537b + 0x6a1a8f49 ) % POINTS ;
48
+ }
49
+
50
+ static int bench_ecmult_multi_callback (secp256k1_scalar * sc , secp256k1_ge * ge , size_t idx , void * arg ) {
44
51
bench_data * data = (bench_data * )arg ;
45
52
if (data -> includes_g ) ++ idx ;
46
53
if (idx == 0 ) {
@@ -53,7 +60,7 @@ static int bench_callback(secp256k1_scalar* sc, secp256k1_ge* ge, size_t idx, vo
53
60
return 1 ;
54
61
}
55
62
56
- static void bench_ecmult (void * arg , int iters ) {
63
+ static void bench_ecmult_multi (void * arg , int iters ) {
57
64
bench_data * data = (bench_data * )arg ;
58
65
59
66
int includes_g = data -> includes_g ;
@@ -62,19 +69,18 @@ static void bench_ecmult(void* arg, int iters) {
62
69
iters = iters / data -> count ;
63
70
64
71
for (iter = 0 ; iter < iters ; ++ iter ) {
65
- data -> ecmult_multi (& data -> ctx -> error_callback , & data -> ctx -> ecmult_ctx , data -> scratch , & data -> output [iter ], data -> includes_g ? & data -> scalars [data -> offset1 ] : NULL , bench_callback , arg , count - includes_g );
72
+ data -> ecmult_multi (& data -> ctx -> error_callback , & data -> ctx -> ecmult_ctx , data -> scratch , & data -> output [iter ], data -> includes_g ? & data -> scalars [data -> offset1 ] : NULL , bench_ecmult_multi_callback , arg , count - includes_g );
66
73
data -> offset1 = (data -> offset1 + count ) % POINTS ;
67
74
data -> offset2 = (data -> offset2 + count - 1 ) % POINTS ;
68
75
}
69
76
}
70
77
71
- static void bench_ecmult_setup (void * arg ) {
78
+ static void bench_ecmult_multi_setup (void * arg ) {
72
79
bench_data * data = (bench_data * )arg ;
73
- data -> offset1 = (data -> count * 0x537b7f6f + 0x8f66a481 ) % POINTS ;
74
- data -> offset2 = (data -> count * 0x7f6f537b + 0x6a1a8f49 ) % POINTS ;
80
+ hash_into_offset (data , data -> count );
75
81
}
76
82
77
- static void bench_ecmult_teardown (void * arg , int iters ) {
83
+ static void bench_ecmult_multi_teardown (void * arg , int iters ) {
78
84
bench_data * data = (bench_data * )arg ;
79
85
int iter ;
80
86
iters = iters / data -> count ;
@@ -102,7 +108,7 @@ static void generate_scalar(uint32_t num, secp256k1_scalar* scalar) {
102
108
CHECK (!overflow );
103
109
}
104
110
105
- static void run_test (bench_data * data , size_t count , int includes_g , int num_iters ) {
111
+ static void run_ecmult_multi_bench (bench_data * data , size_t count , int includes_g , int num_iters ) {
106
112
char str [32 ];
107
113
static const secp256k1_scalar zero = SECP256K1_SCALAR_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
108
114
size_t iters = 1 + num_iters / count ;
@@ -112,8 +118,7 @@ static void run_test(bench_data* data, size_t count, int includes_g, int num_ite
112
118
data -> includes_g = includes_g ;
113
119
114
120
/* Compute (the negation of) the expected results directly. */
115
- data -> offset1 = (data -> count * 0x537b7f6f + 0x8f66a481 ) % POINTS ;
116
- data -> offset2 = (data -> count * 0x7f6f537b + 0x6a1a8f49 ) % POINTS ;
121
+ hash_into_offset (data , data -> count );
117
122
for (iter = 0 ; iter < iters ; ++ iter ) {
118
123
secp256k1_scalar tmp ;
119
124
secp256k1_scalar total = data -> scalars [(data -> offset1 ++ ) % POINTS ];
@@ -127,8 +132,8 @@ static void run_test(bench_data* data, size_t count, int includes_g, int num_ite
127
132
}
128
133
129
134
/* Run the benchmark. */
130
- sprintf (str , includes_g ? "ecmult_ %ig" : "ecmult_ %i" , (int )count );
131
- run_benchmark (str , bench_ecmult , bench_ecmult_setup , bench_ecmult_teardown , data , 10 , count * iters );
135
+ sprintf (str , includes_g ? "ecmult_multi %ig" : "ecmult_multi %i" , (int )count );
136
+ run_benchmark (str , bench_ecmult_multi , bench_ecmult_multi_setup , bench_ecmult_multi_teardown , data , 10 , count * iters );
132
137
}
133
138
134
139
int main (int argc , char * * argv ) {
@@ -185,7 +190,7 @@ int main(int argc, char **argv) {
185
190
free (pubkeys_gej );
186
191
187
192
for (i = 1 ; i <= 8 ; ++ i ) {
188
- run_test (& data , i , 1 , iters );
193
+ run_ecmult_multi_bench (& data , i , 1 , iters );
189
194
}
190
195
191
196
/* This is disabled with low count of iterations because the loop runs 77 times even with iters=1
@@ -194,7 +199,7 @@ int main(int argc, char **argv) {
194
199
if (iters > 2 ) {
195
200
for (p = 0 ; p <= 11 ; ++ p ) {
196
201
for (i = 9 ; i <= 16 ; ++ i ) {
197
- run_test (& data , i << p , 1 , iters );
202
+ run_ecmult_multi_bench (& data , i << p , 1 , iters );
198
203
}
199
204
}
200
205
}
0 commit comments