我正在尝试并行化 Rust 中的简单嵌套 for 循环,rayon
但无法:
fn repulsion_force(object: &mut Vec<Node>) {
let v0 = 500.0;
let dx = 0.1;
for i in 0..object.len() {
for j in i + 1..object.len() {
let dir = object[j].position - object[i].position;
let l = dir.length();
let mi = object[i].mass;
let mj = object[j].mass;
let c = (dx / l).powi(13);
let v = dir.normalize() * 3.0 * (v0 / dx) * c;
object[i].current_acceleration -= v / mi;
object[j].current_acceleration += v / mj;
}
}
}
试图关注这篇文章并创建了这个:
use rayon::prelude::*;
object.par_iter_mut()
.enumerate()
.zip(object.par_iter_mut().enumerate())
.for_each(|((i, a), (j, b))| {
if j > i {
// code here
}
});
一次不能
*object
多次借用可变的借用第二个可变借用发生在这里
但它没有用。我的问题与帖子中的问题有点不同,因为我在一次迭代中修改了两个元素并试图将它们都借用为 Rust 不喜欢的可变元素,而我不喜欢在不需要时进行双倍计算的想法。
另一种尝试是迭代Range
:
use rayon::prelude::*;
let length = object.len();
(0..length).par_bridge().for_each(|i| {
(i+1..length).for_each(|j| {
let dir = object[j].position - object[i].position;
let l = dir.length();
let mi = object[i].mass;
let mj = object[j].mass;
let c = (dx / l).powi(13);
let v = dir.normalize() * 3.0 * (v0 / dx) * c;
object[i].current_acceleration -= v / mi;
object[j].current_acceleration += v / mj;
});
不能借用
object
可变的,因为它是Fn
闭包中的捕获变量
老实说,这个我根本不明白,E0596也没有多大帮助——我object
的是&mut
. Rust 新手,希望有任何帮助!