1
1
#include " random_generator.hpp"
2
2
#include " logging.hpp"
3
+ #include < future>
3
4
4
5
namespace Groth16 {
5
6
@@ -45,6 +46,62 @@ std::unique_ptr<Prover<Engine>> makeProver(
45
46
template <typename Engine>
46
47
std::unique_ptr<Proof<Engine>> Prover<Engine>::prove(typename Engine::FrElement *wtns) {
47
48
49
+ #ifdef USE_OPENMP
50
+ LOG_TRACE (" Start Multiexp A" );
51
+ uint32_t sW = sizeof (wtns[0 ]);
52
+ typename Engine::G1Point pi_a;
53
+ E.g1 .multiMulByScalar (pi_a, pointsA, (uint8_t *)wtns, sW , nVars);
54
+ std::ostringstream ss2;
55
+ ss2 << " pi_a: " << E.g1 .toString (pi_a);
56
+ LOG_DEBUG (ss2);
57
+
58
+ LOG_TRACE (" Start Multiexp B1" );
59
+ typename Engine::G1Point pib1;
60
+ E.g1 .multiMulByScalar (pib1, pointsB1, (uint8_t *)wtns, sW , nVars);
61
+ std::ostringstream ss3;
62
+ ss3 << " pib1: " << E.g1 .toString (pib1);
63
+ LOG_DEBUG (ss3);
64
+
65
+ LOG_TRACE (" Start Multiexp B2" );
66
+ typename Engine::G2Point pi_b;
67
+ E.g2 .multiMulByScalar (pi_b, pointsB2, (uint8_t *)wtns, sW , nVars);
68
+ std::ostringstream ss4;
69
+ ss4 << " pi_b: " << E.g2 .toString (pi_b);
70
+ LOG_DEBUG (ss4);
71
+
72
+ LOG_TRACE (" Start Multiexp C" );
73
+ typename Engine::G1Point pi_c;
74
+ E.g1 .multiMulByScalar (pi_c, pointsC, (uint8_t *)((uint64_t )wtns + (nPublic +1 )*sW ), sW , nVars-nPublic-1 );
75
+ std::ostringstream ss5;
76
+ ss5 << " pi_c: " << E.g1 .toString (pi_c);
77
+ LOG_DEBUG (ss5);
78
+ #else
79
+ LOG_TRACE (" Start Multiexp A" );
80
+ uint32_t sW = sizeof (wtns[0 ]);
81
+ typename Engine::G1Point pi_a;
82
+ auto pA_future = std::async ([&]() {
83
+ E.g1 .multiMulByScalar (pi_a, pointsA, (uint8_t *)wtns, sW , nVars);
84
+ });
85
+
86
+ LOG_TRACE (" Start Multiexp B1" );
87
+ typename Engine::G1Point pib1;
88
+ auto pB1_future = std::async ([&]() {
89
+ E.g1 .multiMulByScalar (pib1, pointsB1, (uint8_t *)wtns, sW , nVars);
90
+ });
91
+
92
+ LOG_TRACE (" Start Multiexp B2" );
93
+ typename Engine::G2Point pi_b;
94
+ auto pB2_future = std::async ([&]() {
95
+ E.g2 .multiMulByScalar (pi_b, pointsB2, (uint8_t *)wtns, sW , nVars);
96
+ });
97
+
98
+ LOG_TRACE (" Start Multiexp C" );
99
+ typename Engine::G1Point pi_c;
100
+ auto pC_future = std::async ([&]() {
101
+ E.g1 .multiMulByScalar (pi_c, pointsC, (uint8_t *)((uint64_t )wtns + (nPublic +1 )*sW ), sW , nVars-nPublic-1 );
102
+ });
103
+ #endif
104
+
48
105
LOG_TRACE (" Start Initializing a b c A" );
49
106
auto a = new typename Engine::FrElement[domainSize];
50
107
auto b = new typename Engine::FrElement[domainSize];
@@ -180,35 +237,6 @@ std::unique_ptr<Proof<Engine>> Prover<Engine>::prove(typename Engine::FrElement
180
237
181
238
delete a;
182
239
183
- LOG_TRACE (" Start Multiexp A" );
184
- uint32_t sW = sizeof (wtns[0 ]);
185
- typename Engine::G1Point pi_a;
186
- E.g1 .multiMulByScalar (pi_a, pointsA, (uint8_t *)wtns, sW , nVars);
187
- std::ostringstream ss2;
188
- ss2 << " pi_a: " << E.g1 .toString (pi_a);
189
- LOG_DEBUG (ss2);
190
-
191
- LOG_TRACE (" Start Multiexp B1" );
192
- typename Engine::G1Point pib1;
193
- E.g1 .multiMulByScalar (pib1, pointsB1, (uint8_t *)wtns, sW , nVars);
194
- std::ostringstream ss3;
195
- ss3 << " pib1: " << E.g1 .toString (pib1);
196
- LOG_DEBUG (ss3);
197
-
198
- LOG_TRACE (" Start Multiexp B2" );
199
- typename Engine::G2Point pi_b;
200
- E.g2 .multiMulByScalar (pi_b, pointsB2, (uint8_t *)wtns, sW , nVars);
201
- std::ostringstream ss4;
202
- ss4 << " pi_b: " << E.g2 .toString (pi_b);
203
- LOG_DEBUG (ss4);
204
-
205
- LOG_TRACE (" Start Multiexp C" );
206
- typename Engine::G1Point pi_c;
207
- E.g1 .multiMulByScalar (pi_c, pointsC, (uint8_t *)((uint64_t )wtns + (nPublic +1 )*sW ), sW , nVars-nPublic-1 );
208
- std::ostringstream ss5;
209
- ss5 << " pi_c: " << E.g1 .toString (pi_c);
210
- LOG_DEBUG (ss5);
211
-
212
240
typename Engine::FrElement r;
213
241
typename Engine::FrElement s;
214
242
typename Engine::FrElement rs;
@@ -219,6 +247,13 @@ std::unique_ptr<Proof<Engine>> Prover<Engine>::prove(typename Engine::FrElement
219
247
randombytes_buf ((void *)&(r.v [0 ]), sizeof (r)-1 );
220
248
randombytes_buf ((void *)&(s.v [0 ]), sizeof (s)-1 );
221
249
250
+ #ifndef USE_OPENMP
251
+ pA_future.get ();
252
+ pB1_future.get ();
253
+ pB2_future.get ();
254
+ pC_future.get ();
255
+ #endif
256
+
222
257
typename Engine::G1Point p1;
223
258
typename Engine::G2Point p2;
224
259
0 commit comments