提问人:ElevenLee 提问时间:8/17/2023 更新时间:8/17/2023 访问量:74
澄清 rust rayon 嵌套线程池工作线程编号
Clarify rust rayon nested thread pool worker numbers
问:
我尝试以嵌套方式使用并行迭代器。由于全局池具有固定数量的线程,因此我倾向于在外池生成的线程中各创建一个外池和一个内池。rayon
main
use rayon::prelude::*;
fn stress(index: u32) {
println!("Runner {} started.", index);
let mut _x = 0;
loop {
_x += 1;
_x -= 1;
}
}
fn sub(outer: u32) {
let inner_pool = rayon::ThreadPoolBuilder::new().num_threads(1 as usize).build().unwrap();
inner_pool.install(|| {
vec![1, 2, 3, 4].into_par_iter().map(|inner| stress(outer * 10 + inner)).collect()
})
}
fn main() {
let outer_pool = rayon::ThreadPoolBuilder::new().num_threads(1 as usize).build().unwrap();
outer_pool.install(|| vec![1, 2, 3, 4].into_par_iter().map(|outer| sub(outer)).collect())
}
正如代码所示,我有 16 个作业,这些作业被拆分为一个 4x4 组来运行,并且将创建一个外部池和一个内部池,两者都只包含 1 个线程。所以我所期望的只有 1 个作业会运行,并且只会打印一行(可能)。但是我有 3 个作业并行运行,并打印了三行(和 )。stress
Runner 11 started.
11
31
41
我知道人造丝
倾向于将工作减少一半,所以我理解为什么而不是应该在之后出现,但我无法弄清楚为什么多个工作可以在字面上的 1x1 池中并行运行。31
21
11
此外,我还尝试了不同的池大小,但结果仍然让我感到困惑。
外 | 内 | 负荷 |
---|---|---|
1 | 1 | 3 |
1 | 2 | 6 |
1 | 3 | 9 |
1 | 4 | 12 |
1 | 16 | 12 |
2 | 1 | 4 |
2 | 2 | 8 |
2 | 3 | 12 |
2 | 4 | 16 |
3 | 1 | 4 |
3 | 2 | 8 |
3 | 3 | 12 |
3 | 4 | 16 |
谁能告诉我?
答: 暂无答案
评论
loop {}