使用保证不重叠的索引对向量进行并行随机访问

问题描述 投票:0回答:1

背景

我已经实现了广泛的阶段碰撞检测算法,该算法返回索引的嵌套向量 (

Vec<Vec<usize>>
)。我可以保证每个索引在嵌套向量中最多出现一次。我想使用这些索引来索引物体向量并并行执行窄相碰撞检测。

问题

在一个最小的示例中,我们将为每个索引向量获取对元素的 &mut 引用,以形成唯一 &mut 引用的向量,并对此向量执行窄相位检测。

let bodies: Vec<u8> = vec![0,1,2,3,4,5,6];
let pass: Vec<Vec<usize>> = vec![vec![0,4],vec![2,3,5]];

pass.par_iter()
  .map(|indices| {
      let local_bodies: Vec<&mut u8> = 
          indices.iter().map(|i| &mut bodies[i]).collect();
      narrow_phase(&local_bodies)
});

但是我遇到的错误有两个:

  • 对主体中元素的
    &mut
    引用无法逃逸到内部闭包之外。
  • 我们不能借用可变的 *body,因为它是
    Fn
    闭包中捕获的变量

问题

在 Rust 中进行此类随机访问和安全变异的首选方法是什么?我想避免使用

Arc
Mutex
的开销。此外,我知道编译器本身无法通过随机访问来保证安全,而是需要一些额外的功能(如
Arc
Mutex
)。

相关问题

许多首选答案是使用内置

chunks_mut
和/或
split_at_mut
但是我认为它们在这里不适用,因为索引不是连续的。

我发现另一个question似乎有完全相同的问题,但是解决方案使用

std::cell::Cell
,它没有实现
Sync
特征(link)。

multithreading rust vector random-access rayon
1个回答
0
投票

到目前为止,我个人还没有使用过它,但是

paradis
板条箱旨在提供

具有不相交索引的并行处理。

它提供了低级不安全 API 和高级 API,“[允许]用安全代码或最少的不安全代码来表达许多并行访问模式”。

© www.soinside.com 2019 - 2024. All rights reserved.