-
Notifications
You must be signed in to change notification settings - Fork 2
/
keygen-parallel.go
124 lines (104 loc) · 2.65 KB
/
keygen-parallel.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package vcs
import (
"fmt"
"math"
"os"
"sync"
"github.com/alinush/go-mcl"
)
// [start, stop)
func (vcs *VCS) PrkGen(index uint8, start uint64, stop uint64, wg *sync.WaitGroup) {
os.MkdirAll(vcs.folderPath, os.ModePerm)
fileName := vcs.folderPath + fmt.Sprintf(PRKNAME, index)
f, err := os.Create(fileName)
check(err)
var result mcl.G1
for i := start; i < stop; i++ {
exponent := vcs.SelectPRK(i)
mcl.G1Mul(&result, &vcs.G, &exponent)
_, err = f.Write(result.Serialize())
check(err)
if !vcs.PARAM_TOO_LARGE {
vcs.PRK[i] = result
}
// fmt.Println(i)
}
fmt.Println("Dumped ", fileName, BoundsPrint(start, stop))
defer f.Close()
defer wg.Done()
}
func (vcs *VCS) PrkGenDriver() {
fmt.Println(SEP, "Generating the PRK", SEP)
if !vcs.PARAM_TOO_LARGE {
// Actually we can avoid during Save
vcs.PRK = make([]mcl.G1, vcs.N) // Allocate space for PRK
}
var wg sync.WaitGroup
step := uint64(math.Ceil(float64(vcs.N) / float64(NFILES))) // Maximum size of each file.
start := uint64(0)
stop := step
for i := uint8(0); i < NFILES; i++ {
wg.Add(1)
go vcs.PrkGen(i, start, stop, &wg)
start += step
stop += step
if (i+1)%NCORES == 0 {
wg.Wait()
}
}
wg.Wait()
}
func (vcs *VCS) UpkGen(index uint8, start uint64, stop uint64, wg *sync.WaitGroup) {
os.MkdirAll(vcs.folderPath, os.ModePerm)
fileName := vcs.folderPath + fmt.Sprintf(UPKNAME, index)
f, err := os.Create(fileName)
check(err)
// fmt.Println(fileName)
var result mcl.G1
for j := start; j < stop; j++ {
i, k := IndexInTheLevel(j)
exponent := vcs.SelectUPK(i, k)
mcl.G1Mul(&result, &vcs.G, &exponent)
_, err = f.Write(result.Serialize())
check(err)
if !vcs.PARAM_TOO_LARGE {
vcs.UPK[i][k] = result
}
// fmt.Println(i, k, exponent.IsZero(), result.IsZero(), vcs.PRK[i][k].IsZero())
}
fmt.Println("Dumped ", fileName, BoundsPrint(start, stop))
defer f.Close()
defer wg.Done()
}
func (vcs *VCS) UpkGenDriver() {
var wg sync.WaitGroup
if !vcs.PARAM_TOO_LARGE {
// Allocate space for UPK
vcs.MallocUpk()
}
fmt.Println(SEP, "Generating the UPK", SEP)
numUPK := (uint64(1) << (vcs.L + 1)) - 1 // Number of nodes in the UPK tree
step := uint64(math.Ceil(float64(numUPK) / float64(NFILES)))
start := uint64(0)
stop := step
for i := uint8(0); i < NFILES; i++ {
// fmt.Println(i, start, stop)
wg.Add(1)
go vcs.UpkGen(i, start, stop, &wg)
start += step
stop += step
stop = minUint64(stop, numUPK)
if (i+1)%NCORES == 0 {
wg.Wait()
}
}
wg.Wait()
}
func (vcs *VCS) PrkUpkGen() {
vcs.UpkGenDriver()
if !vcs.DISCARD_PRK && !vcs.PARAM_TOO_LARGE {
fmt.Println(SEP)
vcs.PrkGenDriver() // This also allocates memory for PRK
}
fmt.Println(SEP)
}