我看过一篇名为A Primer on Scheduling Fork-Join Parallelism with Work Stealing的论文。我想实现持续窃取,调用后的其余代码spawn
有资格被窃取。这是论文中的代码。
1 e();
2 spawn f();
3 g();
4 sync;
5 h();
一个重要的设计选择是向窃贼线程提供哪个分支。使用图 1,选择是:
偷孩子:
- f() 可用于窃贼线程。
- 执行 e() 的线程执行 g()。
持续偷窃:
- 也称为“偷父母”。
- 执行 e() 的线程执行 f()。
- 延续(接下来将调用 g())对窃贼线程可用。
我听说保存延续需要保存两组寄存器(易失性/非易失性/FPU)。在我所做的光纤实现中,我最终实现了儿童窃取。我读到了关于偷孩子的(理论上的)负面信息(无限数量的可运行任务,请参阅论文以获取更多信息),所以我想改用延续。
我正在考虑两个函数,shift
和reset
,其中reset
界定了当前的延续,并shift
具体化了当前的延续。我的要求在 C 环境中是否合理?
编辑:我正在考虑reset
为当前函数调用(= 第 3 行)制作保存返回地址/NV GPR,并shift
在将值返回给reset
.