Skip to content

Commit 49963bf

Browse files
committed
fully working speculative execution
1 parent 449fd0b commit 49963bf

File tree

2 files changed

+496
-206
lines changed

2 files changed

+496
-206
lines changed

coding_benchmark/src/minimum_redundancy.rs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@ fn decode_spec(coding: Arc<Coding<u8>>, bits: Arc<Vec<bool>>) {
112112
let cursor = Arc::new(AtomicUsize::new(0));
113113

114114
loop {
115+
if cursor.load(Ordering::SeqCst) == bits.len() {
116+
break;
117+
};
115118
let unique_code_lengths: HashSet<u32> = coding.code_lengths().values().cloned().collect();
116119
let mut sorted_code_lengths: Vec<u32> = Vec::from_iter(unique_code_lengths);
117120
sorted_code_lengths.sort_unstable(); // sort_unstable is often faster and appropriate here
@@ -144,28 +147,35 @@ fn decode_spec(coding: Arc<Coding<u8>>, bits: Arc<Vec<bool>>) {
144147
let bits_arc = Arc::clone(&bits);
145148
let coding_arc = Arc::clone(&coding);
146149
let cursor_arc = Arc::clone(&cursor);
150+
let start_index = cursor_arc.load(Ordering::SeqCst) + l as usize;
151+
if start_index > bits_arc.len() {
152+
break;
153+
};
147154
let handle = thread::spawn(move || {
148155
let mut len = 0;
149156
let mut decoder = coding_arc.decoder();
150-
let start_index = cursor_arc.load(Ordering::SeqCst) + l as usize;
157+
151158
let mut bits_iter = bits_arc[start_index..].into_iter();
152159
while let Some(b) = bits_iter.next() {
153160
len += 1;
154161
if let minimum_redundancy::DecodingResult::Value(v) =
155162
decoder.consume(&coding_arc, *b as u32)
156163
{
157164
black_box(v);
158-
return len;
165+
return Some(len);
159166
}
160167
}
161-
panic!("invalid encoded value");
168+
None
162169
});
163170
handles.insert(l, handle);
164171
}
165172
let producer_len = producer_handle.join().unwrap();
166173
if let Some(handle) = handles.remove(&producer_len) {
167-
let guess_len = handle.join().unwrap();
168-
cursor.fetch_add((producer_len + guess_len) as usize, Ordering::SeqCst);
174+
if let Some(guess_len) = handle.join().unwrap() {
175+
cursor.fetch_add((producer_len + guess_len) as usize, Ordering::SeqCst);
176+
} else {
177+
cursor.fetch_add((producer_len) as usize, Ordering::SeqCst);
178+
}
169179
} else {
170180
cursor.fetch_add((producer_len) as usize, Ordering::SeqCst);
171181
}
@@ -354,11 +364,11 @@ pub fn benchmark(conf: &super::Conf) {
354364
BitsPerFragment(1),
355365
&frequencies,
356366
));
357-
let iter = bits.clone().into_iter();
358-
conf.print_speed(
359-
" decoding from a queue (without storing)",
360-
conf.measure(|| decode(&coding, iter.clone())),
361-
);
367+
// let iter = bits.clone().into_iter();
368+
// conf.print_speed(
369+
// " decoding from a queue (without storing)",
370+
// conf.measure(|| decode(&coding, iter.clone())),
371+
// );
362372
let bits_arc = Arc::new(bits);
363373
conf.print_speed(
364374
" decoding from a queue (without storing) using speculative execution",

0 commit comments

Comments
 (0)