Skip to content

Commit 527ac24

Browse files
author
nixw
committed
Use async to calc points
1 parent 34d3a8e commit 527ac24

File tree

3 files changed

+69
-35
lines changed

3 files changed

+69
-35
lines changed

src/CMakeLists.txt

+1-2
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,7 @@ target_link_libraries(prover rapidsnarkStatic)
113113

114114
add_library(rapidsnark SHARED ${LIB_SOURCES})
115115

116-
117-
if(USE_LOGGER)
116+
if(USE_LOGGER OR NOT USE_OPENMP)
118117
target_link_libraries(prover pthread)
119118
endif()
120119

src/groth16.cpp

+64-29
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "random_generator.hpp"
22
#include "logging.hpp"
3+
#include <future>
34

45
namespace Groth16 {
56

@@ -45,6 +46,62 @@ std::unique_ptr<Prover<Engine>> makeProver(
4546
template <typename Engine>
4647
std::unique_ptr<Proof<Engine>> Prover<Engine>::prove(typename Engine::FrElement *wtns) {
4748

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+
48105
LOG_TRACE("Start Initializing a b c A");
49106
auto a = new typename Engine::FrElement[domainSize];
50107
auto b = new typename Engine::FrElement[domainSize];
@@ -180,35 +237,6 @@ std::unique_ptr<Proof<Engine>> Prover<Engine>::prove(typename Engine::FrElement
180237

181238
delete a;
182239

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-
212240
typename Engine::FrElement r;
213241
typename Engine::FrElement s;
214242
typename Engine::FrElement rs;
@@ -219,6 +247,13 @@ std::unique_ptr<Proof<Engine>> Prover<Engine>::prove(typename Engine::FrElement
219247
randombytes_buf((void *)&(r.v[0]), sizeof(r)-1);
220248
randombytes_buf((void *)&(s.v[0]), sizeof(s)-1);
221249

250+
#ifndef USE_OPENMP
251+
pA_future.get();
252+
pB1_future.get();
253+
pB2_future.get();
254+
pC_future.get();
255+
#endif
256+
222257
typename Engine::G1Point p1;
223258
typename Engine::G2Point p2;
224259

src/groth16.hpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace Groth16 {
1717
typename Engine::G2PointAffine B;
1818
typename Engine::G1PointAffine C;
1919

20-
Proof(Engine &_E) : E(_E) { };
20+
Proof(Engine &_E) : E(_E) { }
2121
std::string toJsonStr();
2222
json toJson();
2323
};
@@ -91,7 +91,7 @@ namespace Groth16 {
9191
pointsH(_pointsH)
9292
{
9393
fft = new FFT<typename Engine::Fr>(domainSize*2);
94-
};
94+
}
9595

9696
~Prover() {
9797
delete fft;
@@ -118,9 +118,9 @@ namespace Groth16 {
118118
void *pointsC,
119119
void *pointsH
120120
);
121-
};
121+
}
122122

123123

124124
#include "groth16.cpp"
125125

126-
#endif
126+
#endif

0 commit comments

Comments
 (0)