< 返回版块

rust-dev 发表于 2022-10-22 08:11

  1. 如下:外层正常循环,里面套了一层rayon,rayon执行时间为40ms
for i in 0..10{
   ...
   //40ms
   par.iter{

    }
   ...
}
  1. 把1中的外层循环也改成rayon,但这时里层的rayon运算速度变慢了,为178ms,请问这是为什么?
let x = (0..10).collect::<Vec<_>>();
x.par.iter().map(||{
   ....
   //178 ms
   par.iter{

    }
   ...
});

评论区

写评论
Borber 2022-10-24 13:34

赞, 好代码! 👍

--
👇
Pikachu: 有几个细节问题想要确认一下:

  1. 你的CPU最大支持多少个并行任务?
  2. 外层循环的总耗时有变化吗?
  3. 你有手动设置thread pool大小吗?

我的怀疑是,当你的外层循环已经并行的时候,thread pool里面所有的线程都被占用了。这时候内层循环就没办法并行了,所以你的第二段代码测出来的可能是单线程执行的耗时+rayon的overhead。

具体细节我之后自己测一下试试看。

作者 rust-dev 2022-10-22 18:26

非常感谢大佬!!!这个例子解释的非常好,如果CPU支持的线程数再大一点,那么理论上Both loop parallelization的Outer time应该在10ms左右。

--
👇
Pikachu: rust playground

Result:

Number of threads: 2
No parallelization.         Outer time: 40.253767ms, inner time sum: 40.251077ms
Inner loop parallelization. Outer time: 20.277292ms, inner time sum: 20.275192ms
Outer loop parallelization. Outer time: 20.255621ms, inner time sum: 40.308479ms
Both loop parallelization.  Outer time: 20.214752ms, inner time sum: 40.281379ms
Pikachu 2022-10-22 11:55

rust playground

Result:

Number of threads: 2
No parallelization.         Outer time: 40.253767ms, inner time sum: 40.251077ms
Inner loop parallelization. Outer time: 20.277292ms, inner time sum: 20.275192ms
Outer loop parallelization. Outer time: 20.255621ms, inner time sum: 40.308479ms
Both loop parallelization.  Outer time: 20.214752ms, inner time sum: 40.281379ms
Pikachu 2022-10-22 10:25

有几个细节问题想要确认一下:

  1. 你的CPU最大支持多少个并行任务?
  2. 外层循环的总耗时有变化吗?
  3. 你有手动设置thread pool大小吗?

我的怀疑是,当你的外层循环已经并行的时候,thread pool里面所有的线程都被占用了。这时候内层循环就没办法并行了,所以你的第二段代码测出来的可能是单线程执行的耗时+rayon的overhead。

具体细节我之后自己测一下试试看。

1 共 4 条评论, 1 页