|
@@ -883,29 +883,44 @@ RDPF<WIDTH>::RDPF(MPCTIO &tio, yield_t &yield,
|
|
|
// The bit-shared choice bit is bit (depth-level-1) of the
|
|
|
// XOR-shared target index
|
|
|
RegBS bs_choice = target.bit(depth-level-1);
|
|
|
- bool cfbit;
|
|
|
|
|
|
+ // At each layer, we can create the next internal layer and the
|
|
|
+ // leaf layer in parallel coroutines if we're making an
|
|
|
+ // incremental RDPF. If not, exactly one of these coroutines
|
|
|
+ // will be created, and we just run that one.
|
|
|
+ std::vector<coro_t> coroutines;
|
|
|
if (level < depth-1) {
|
|
|
- DPFnode CW;
|
|
|
- // This field is ignored when we're not expanding to a leaf
|
|
|
- // level, but it needs to be an lvalue reference.
|
|
|
- int noleafinfo = 0;
|
|
|
- create_level(tio, yield, curlevel, nextlevel, player, level,
|
|
|
- depth, bs_choice, CW, cfbit, save_expansion, noleafinfo,
|
|
|
- aes_ops);
|
|
|
- cfbits |= (value_t(cfbit)<<level);
|
|
|
- if (player < 2) {
|
|
|
- cw.push_back(CW);
|
|
|
- }
|
|
|
+ coroutines.emplace_back([this, &tio, curlevel, nextlevel,
|
|
|
+ player, level, depth, bs_choice, save_expansion,
|
|
|
+ &aes_ops] (yield_t &yield) {
|
|
|
+ DPFnode CW;
|
|
|
+ bool cfbit;
|
|
|
+ // This field is ignored when we're not expanding to a leaf
|
|
|
+ // level, but it needs to be an lvalue reference.
|
|
|
+ int noleafinfo = 0;
|
|
|
+ create_level(tio, yield, curlevel, nextlevel, player, level,
|
|
|
+ depth, bs_choice, CW, cfbit, save_expansion, noleafinfo,
|
|
|
+ aes_ops);
|
|
|
+ cfbits |= (value_t(cfbit)<<level);
|
|
|
+ if (player < 2) {
|
|
|
+ cw.push_back(CW);
|
|
|
+ }
|
|
|
+ });
|
|
|
}
|
|
|
if (incremental || level == depth-1) {
|
|
|
- LeafNode CW;
|
|
|
- create_level(tio, yield, curlevel, leaflevel, player, level,
|
|
|
- depth, bs_choice, CW, cfbit, save_expansion,
|
|
|
- li[depth-level-1], aes_ops);
|
|
|
- leaf_cfbits |= (value_t(cfbit)<<(depth-level-1));
|
|
|
- li[depth-level-1].leaf_cw = CW;
|
|
|
+ coroutines.emplace_back([this, &tio, curlevel, leaflevel,
|
|
|
+ player, level, depth, bs_choice, save_expansion,
|
|
|
+ &aes_ops](yield_t &yield) {
|
|
|
+ LeafNode CW;
|
|
|
+ bool cfbit;
|
|
|
+ create_level(tio, yield, curlevel, leaflevel, player,
|
|
|
+ level, depth, bs_choice, CW, cfbit, save_expansion,
|
|
|
+ li[depth-level-1], aes_ops);
|
|
|
+ leaf_cfbits |= (value_t(cfbit)<<(depth-level-1));
|
|
|
+ li[depth-level-1].leaf_cw = CW;
|
|
|
+ });
|
|
|
}
|
|
|
+ run_coroutines(yield, coroutines);
|
|
|
|
|
|
if (!save_expansion) {
|
|
|
delete[] leaflevel;
|