Skip to content

Commit 51e1af6

Browse files
Merge pull request #1026 from filecoin-project/feat/pad-reader
feat: improved approach to do bit padding/calculate piece commitments
2 parents b1518ee + 8b33d50 commit 51e1af6

File tree

14 files changed

+922
-562
lines changed

14 files changed

+922
-562
lines changed

fil-proofs-tooling/src/bin/benchy/flarp.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ pub struct FlarpOutputs {
8989
tree_r_last_wall_time_ms: u64,
9090
window_comm_leaves_time_cpu_time_ms: u64,
9191
window_comm_leaves_time_wall_time_ms: u64,
92+
add_piece_cpu_time_ms: u64,
93+
add_piece_wall_time_ms: u64,
94+
generate_piece_commitment_cpu_time_ms: u64,
95+
generate_piece_commitment_wall_time_ms: u64,
9296
#[serde(flatten)]
9397
circuits: CircuitOutputs,
9498
}
@@ -157,6 +161,14 @@ fn augment_with_op_measurements(mut output: &mut FlarpOutputs) {
157161
output.post_partial_ticket_hash_cpu_time_ms = cpu_time;
158162
output.post_partial_ticket_hash_time_ms = wall_time;
159163
}
164+
AddPiece => {
165+
output.add_piece_cpu_time_ms = cpu_time;
166+
output.add_piece_wall_time_ms = wall_time;
167+
}
168+
GeneratePieceCommitment => {
169+
output.generate_piece_commitment_cpu_time_ms = cpu_time;
170+
output.generate_piece_commitment_wall_time_ms = wall_time;
171+
}
160172
}
161173
}
162174
}
@@ -183,6 +195,7 @@ pub fn run(
183195
skip_seal_proof: bool,
184196
skip_post_proof: bool,
185197
only_replicate: bool,
198+
only_add_piece: bool,
186199
) -> Metadata<FlarpReport> {
187200
configure_global_config(&inputs);
188201

@@ -192,15 +205,15 @@ pub fn run(
192205

193206
assert!(inputs.num_sectors > 0, "Missing num_sectors");
194207

195-
let (cfg, created, replica_measurement) =
196-
create_replicas(sector_size, inputs.num_sectors as usize);
208+
let (cfg, repls) = create_replicas(sector_size, inputs.num_sectors as usize, only_add_piece);
197209

198-
if only_replicate {
210+
if only_add_piece || only_replicate {
199211
augment_with_op_measurements(&mut outputs);
200212
return Metadata::wrap(FlarpReport { inputs, outputs })
201213
.expect("failed to retrieve metadata");
202214
}
203215

216+
let (created, replica_measurement) = repls.unwrap();
204217
generate_params(&inputs);
205218

206219
if !skip_seal_proof {

fil-proofs-tooling/src/bin/benchy/main.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,12 @@ fn main() -> Result<()> {
134134
.long("only-replicate")
135135
.takes_value(false)
136136
.help("only run replication"),
137+
)
138+
.arg(
139+
Arg::with_name("only-add-piece")
140+
.long("only-add-piece")
141+
.takes_value(false)
142+
.help("only run piece addition"),
137143
);
138144

139145
let merkleproof_cmd = SubCommand::with_name("merkleproofs")
@@ -215,6 +221,7 @@ fn main() -> Result<()> {
215221
m.is_present("skip-seal-proof"),
216222
m.is_present("skip-post-proof"),
217223
m.is_present("only-replicate"),
224+
m.is_present("only-add-piece"),
218225
);
219226

220227
serde_json::to_writer(stdout(), &outputs)

fil-proofs-tooling/src/bin/benchy/shared.rs

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,8 @@ use fil_proofs_tooling::{measure, FuncMeasurement};
99
use filecoin_proofs::constants::POREP_PARTITIONS;
1010
use filecoin_proofs::types::{PaddedBytesAmount, PoRepConfig, SectorSize, UnpaddedBytesAmount};
1111
use filecoin_proofs::{
12-
add_piece, generate_piece_commitment, seal_pre_commit_phase1, seal_pre_commit_phase2,
13-
validate_cache_for_precommit_phase2, PieceInfo, PoRepProofPartitions, PrivateReplicaInfo,
14-
PublicReplicaInfo, SealPreCommitOutput,
12+
add_piece, seal_pre_commit_phase1, seal_pre_commit_phase2, validate_cache_for_precommit_phase2,
13+
PieceInfo, PoRepProofPartitions, PrivateReplicaInfo, PublicReplicaInfo, SealPreCommitOutput,
1514
};
1615
use storage_proofs::sector::SectorId;
1716

@@ -26,7 +25,7 @@ pub struct PreCommitReplicaOutput {
2625
pub public_replica_info: PublicReplicaInfo,
2726
}
2827

29-
pub fn create_piece(piece_bytes: UnpaddedBytesAmount) -> (NamedTempFile, PieceInfo) {
28+
pub fn create_piece(piece_bytes: UnpaddedBytesAmount) -> NamedTempFile {
3029
info!("create_piece");
3130
let mut file = NamedTempFile::new().expect("failed to create piece file");
3231
{
@@ -57,24 +56,19 @@ pub fn create_piece(piece_bytes: UnpaddedBytesAmount) -> (NamedTempFile, PieceIn
5756
.seek(SeekFrom::Start(0))
5857
.expect("failed to seek to beginning of piece file");
5958

60-
info!("generating piece commitment");
61-
let info = generate_piece_commitment(file.as_file_mut(), piece_bytes)
62-
.expect("failed to generate piece commitment");
63-
64-
file.as_file_mut()
65-
.seek(SeekFrom::Start(0))
66-
.expect("failed to seek to beginning of piece file");
67-
68-
(file, info)
59+
file
6960
}
7061

7162
pub fn create_replicas(
7263
sector_size: SectorSize,
7364
qty_sectors: usize,
65+
only_add: bool,
7466
) -> (
7567
PoRepConfig,
76-
Vec<(SectorId, PreCommitReplicaOutput)>,
77-
FuncMeasurement<Vec<SealPreCommitOutput>>,
68+
Option<(
69+
Vec<(SectorId, PreCommitReplicaOutput)>,
70+
FuncMeasurement<Vec<SealPreCommitOutput>>,
71+
)>,
7872
) {
7973
info!("creating replicas: {:?} - {}", sector_size, qty_sectors);
8074
let sector_size_unpadded_bytes_ammount =
@@ -115,30 +109,35 @@ pub fn create_replicas(
115109
staged_files.push(staged_file);
116110
}
117111

118-
let (piece_files, piece_infos): (Vec<_>, Vec<_>) = (0..qty_sectors)
112+
let piece_files: Vec<_> = (0..qty_sectors)
119113
.into_par_iter()
120114
.map(|_i| {
121-
let (piece_file, piece_info) = create_piece(UnpaddedBytesAmount::from(
122-
PaddedBytesAmount::from(sector_size),
123-
));
124-
(piece_file, vec![piece_info])
115+
create_piece(UnpaddedBytesAmount::from(PaddedBytesAmount::from(
116+
sector_size,
117+
)))
125118
})
126-
.unzip();
119+
.collect();
127120

128121
info!("adding pieces");
122+
let mut piece_infos = Vec::new();
129123
for (i, (mut piece_file, mut staged_file)) in piece_files
130124
.into_iter()
131125
.zip(staged_files.iter_mut())
132126
.enumerate()
133127
{
134128
info!("add piece {}", i);
135-
add_piece(
129+
let info = add_piece(
136130
&mut piece_file,
137131
&mut staged_file,
138132
sector_size_unpadded_bytes_ammount,
139133
&[],
140134
)
141135
.unwrap();
136+
piece_infos.push(vec![info]);
137+
}
138+
139+
if only_add {
140+
return (porep_config, None);
142141
}
143142

144143
let seal_pre_commit_outputs = measure(|| {
@@ -213,5 +212,5 @@ pub fn create_replicas(
213212
));
214213
}
215214

216-
(porep_config, out, seal_pre_commit_outputs)
215+
(porep_config, Some((out, seal_pre_commit_outputs)))
217216
}

filecoin-proofs/Cargo.toml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ lazy_static = "1.2"
1717
memmap = "0.7"
1818
colored = "1.6"
1919
pbr = "1.0"
20-
tempfile = "3"
2120
byteorder = "1"
2221
itertools = "0.8"
2322
serde_cbor = "0.10.2"
@@ -46,22 +45,24 @@ bincode = "1.1.2"
4645
anyhow = "1.0.23"
4746
rand_xorshift = "0.2.0"
4847
typenum = "1.11.2"
48+
bitintr = "0.3.0"
49+
gperftools = { version = "0.2", optional = true }
4950

5051
[dependencies.reqwest]
5152
version = "0.9"
5253
default-features = false
5354
features = ["default-tls-vendored"]
5455

5556
[dev-dependencies]
56-
gperftools = "0.2"
5757
criterion = "0.3"
5858
rexpect = "0.3.0"
5959
pretty_assertions = "0.6.1"
6060
failure = "0.1"
61+
tempfile = "3"
6162

6263
[features]
6364
default = ["gpu"]
64-
cpu-profile = []
65+
cpu-profile = ["gperftools"]
6566
heap-profile = ["gperftools/heap"]
6667
simd = ["storage-proofs/simd"]
6768
asm = ["storage-proofs/asm"]
Lines changed: 37 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,40 @@
1-
use std::fs::File;
2-
use std::io::{Read, Seek, SeekFrom};
1+
use std::io::{self, Read};
32
use std::time::Duration;
43

54
use criterion::{criterion_group, criterion_main, Criterion, ParameterizedBenchmark, Throughput};
6-
use filecoin_proofs::fr32::{write_padded, write_unpadded};
75
use rand::{thread_rng, Rng};
86

7+
#[cfg(feature = "cpu-profile")]
8+
#[inline(always)]
9+
fn start_profile(stage: &str) {
10+
gperftools::profiler::PROFILER
11+
.lock()
12+
.unwrap()
13+
.start(format!("./{}.profile", stage))
14+
.unwrap();
15+
}
16+
17+
#[cfg(not(feature = "cpu-profile"))]
18+
#[inline(always)]
19+
fn start_profile(_stage: &str) {}
20+
21+
#[cfg(feature = "cpu-profile")]
22+
#[inline(always)]
23+
fn stop_profile() {
24+
gperftools::profiler::PROFILER
25+
.lock()
26+
.unwrap()
27+
.stop()
28+
.unwrap();
29+
}
30+
31+
#[cfg(not(feature = "cpu-profile"))]
32+
#[inline(always)]
33+
fn stop_profile() {}
34+
935
fn random_data(size: usize) -> Vec<u8> {
1036
let mut rng = thread_rng();
11-
let mut data = vec![0u8; size as usize];
12-
for i in 0..data.len() {
13-
data[i] = rng.gen();
14-
}
15-
data
37+
(0..size).map(|_| rng.gen()).collect()
1638
}
1739

1840
fn preprocessing_benchmark(c: &mut Criterion) {
@@ -22,56 +44,23 @@ fn preprocessing_benchmark(c: &mut Criterion) {
2244
"write_padded",
2345
|b, size| {
2446
let data = random_data(*size);
47+
let mut buf = Vec::with_capacity(*size);
2548

49+
start_profile(&format!("write_padded_{}", *size));
2650
b.iter(|| {
27-
let tmpfile: File = tempfile::tempfile().unwrap();
28-
29-
write_padded_bench(tmpfile, data.clone());
30-
})
51+
let mut reader = filecoin_proofs::PadReader::new(io::Cursor::new(&data));
52+
reader.read_to_end(&mut buf).unwrap();
53+
assert!(buf.len() >= data.len());
54+
});
55+
stop_profile();
3156
},
3257
vec![128, 256, 512, 256_000, 512_000, 1024_000, 2048_000],
3358
)
34-
.with_function("write_padded + unpadded", |b, size| {
35-
let data = random_data(*size);
36-
37-
b.iter(|| {
38-
let tmpfile: File = tempfile::tempfile().unwrap();
39-
40-
write_padded_unpadded_bench(tmpfile, data.clone());
41-
})
42-
})
4359
.sample_size(10)
4460
.throughput(|s| Throughput::Bytes(*s as u64))
4561
.warm_up_time(Duration::from_secs(1)),
4662
);
4763
}
4864

49-
fn write_padded_bench(mut file: File, data: Vec<u8>) {
50-
let _ = write_padded(&mut &data[..], &mut file).unwrap();
51-
let padded_written = file.seek(SeekFrom::End(0)).unwrap() as usize;
52-
53-
assert!(padded_written > data.len());
54-
}
55-
56-
fn write_padded_unpadded_bench(mut file: File, data: Vec<u8>) {
57-
write_padded(&mut &data[..], &mut file).unwrap();
58-
59-
let padded_written = file.seek(SeekFrom::End(0)).unwrap() as usize;
60-
61-
assert!(padded_written > data.len());
62-
63-
let mut buf = Vec::with_capacity(padded_written);
64-
file.seek(SeekFrom::Start(0)).unwrap();
65-
file.read_to_end(&mut buf).unwrap();
66-
67-
let mut unpadded_file: File = tempfile::tempfile().unwrap();
68-
69-
write_unpadded(&buf, &mut unpadded_file, 0, data.len()).unwrap();
70-
71-
let unpadded_written = unpadded_file.seek(SeekFrom::End(0)).unwrap() as usize;
72-
73-
assert!(unpadded_written == data.len());
74-
}
75-
7665
criterion_group!(benches, preprocessing_benchmark);
7766
criterion_main!(benches);

0 commit comments

Comments
 (0)