问题标签 [rayon]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
78 浏览

performance - 如何并行扩展集合?

我有一个 HashMap,我想尽可能快地添加元素。我尝试使用par_extend,但它实际上最终比串行版本慢。我的猜测是它正在并行评估迭代器,但串行扩展集合。这是我的代码:

是否有一种更快的方法来扩展实际上并行添加元素的 HashMap?或者类似的可以并行扩展的数据结构?我知道使用类似的东西会运行得更快FnvHashMap,但似乎也应该可以通过并行性来加快速度。(是的,我正在编译--release

0 投票
0 回答
119 浏览

multithreading - 为什么并行化不能提供更大的加速?

我正在尝试制作可以使用多线程快速扩展的HashMap 的变体。我正在使用余数对数据进行分区。它正在工作,但与我的顺序版本相比,它的加速非常小。这是我的代码:

这是我机器上的输出:

并行版本更快,但比我通常使用 Rayon 获得的加速要小得多。我使用的是 16 核 Ryzen 5950x,所以我通常使用 Rayon 获得超过 10 倍的加速。为什么在这种情况下加速比小得多?有没有办法改进并行版本以有效地使用所有 CPU 的内核?

编辑:

我在 Windows 上,以防万一。

0 投票
2 回答
78 浏览

multithreading - 在并行迭代器中执行计算,然后将其提供给单线程迭代器?

考虑以下示例:

我收到以下错误:

我的意图是只让 do_something_expensive_returning_lots_of_data 以多线程方式执行,然后一旦执行,就有一个带有调用结果的单线程迭代器,这样我就可以安全地 mutate h。人造丝可以吗?

0 投票
1 回答
62 浏览

multithreading - Recursive impl Extend for HashMap<_, HashSet<_>> 在哪里组合集合,而不是覆盖?

我正在尝试使我的代码适应我之前的问题的解决方案。基本上,我有一个HashMap<String, HashSet<String>>应该由人造丝的par_extend 生成。问题是键重复,在这种情况下,我希望HashSets 被组合,而不是被覆盖。换句话说,有没有办法在impl Extend此处添加自定义,以便以下代码正确执行?

0 投票
1 回答
360 浏览

rust - Rust - 如何与 Rayon 并行处理向量的 while 循环?

我正在尝试使用 while 循环处理向量。目前它是按顺序一次获取每个元素。有没有办法与人造丝并行处理矢量元素并获得相同的结果。它会提高下面给出的代码的性能吗?基本上我从 tcp 客户端获取连续消息并将它们转换为向量然后处理它们。我想让处理部分更快。示例代码如下。

0 投票
0 回答
138 浏览

rust - 为什么调用 Rayon 的 into_par_iter 时,盒装闭包的 Vec 大小不合适?

我有一个Vec盒装封口(Vec<Box<Fn(...) -> ...>>)。我可以vec.into_iter().map(...),但我不能将它与 Rayon's 一起使用。into_par_iter vec.into_par_iter().map(...)

这是一个最小化的示例(playground):

我得到的错误:

我的印象是,将封口包裹在盒子中是使封口大小合适的解决方案,所以我在这里做到了。

如果我正确阅读了错误,[Box<dyn Fn(u32) -> Result<u32, ()>>]: Sized则不满足,IntoParallelIterator这是我所追求的先决条件。常规into_iter()工作正常,因此 Rayon 设置了一些额外的限制。我预计人造丝会有更多的限制,但我认为这将是关于Send

我知道在这个最小的例子中我可以使用fn(...)类型而不是Fn(...)类型,因为它们不捕获任何值,但我的真实代码当然会捕获引用。

我正在使用 Rayon 为一个使用 minimax 风格的小游戏编写 AI,其中我有一个供 AI 尝试的事物列表,然后我在每件事之后观察得分。我希望这个递归调用堆栈的顶层在许多线程中启动顶层,但每个线程应该是顺序的。

0 投票
1 回答
499 浏览

multithreading - 使用`结果>` Rust 中的技巧,但跨多个线程

Result<X, Box<dyn Error>>使用返回来注释函数以允许它们完全返回任何错误是一个常见的技巧。但是,如果错误本身没有实现,则无法从线程返回它Send。例如这段代码:

给出这个错误:

操场


另一方面,如果您尝试指定错误必须实现Send,则该?运算符不再起作用:

操场

我怎样才能继续使用Box<dyn Error>快捷方式,但仅限于可以发送的错误,允许它跨线程工作?

0 投票
0 回答
83 浏览

rust - 无互斥体的人造丝并行迭代器的顺序依赖缓存

我对需要处理一系列计算的数千个项目进行了计算,其中每个 n 迭代需要处理 [n - 1, n, n + 1] 的数据。最好在图表上理解这一点迭代图表

迭代器内部的所有计算都是相同的,所以我们可以缓存它。但是用人造丝做的最好方法是什么?

我想根据线程级别缓存它。因此,如果我们有 4 个迭代的线程,我们可以为每个组(0 - n/4,n/4 - 2*n/4,..)提供缓存,但我们无法控制人造丝中的迭代顺序。

有没有更好的方法在没有互斥锁的人造丝中拥有每个线程或共享缓存?

重要说明:我不知道需要哪个迭代来进行计算。它在运行时确定,所以基本上我不能在迭代之前进行所有计算。

0 投票
2 回答
243 浏览

multithreading - 带有 Rust `Sender` 和 Rayon 的 `for_each_with()` 的嵌套循环

我有一些涉及使用嵌套循环的多线程代码,其中内部循环并行运行。每个线程之间的“共享”是一个Sender将返回结果的。值得注意的是,因此Sender克隆Send它并使用人造丝发送它应该没有问题for_each_with()。但是,编译此代码:

给我:

游乐场

现在我在想这可能是因为我试图克隆一个引用,但是如果我将实际移动senderfor_each_with()(ie for_each_with(sender, ...)) 中,它将被外部循环的第一次迭代消耗:

游乐场)。

如何以满足 Rust 编译器的方式实现此模式?

0 投票
0 回答
111 浏览

multithreading - 内部带有并行迭代器的多个 Rayon `spawn`

我正在尝试在异步环境(tokio)中加快 CPU 繁重的计算。我最初的解决方案是使用rayon::spawn并行迭代器来实际执行。带有伪代码的最小示例:

这一定是错误的,因为如上所述,所有任务都需要 2 小时才能运行,但如果我删除.par_bridge(),那么第一个任务只需要 20 分钟(正如预期的那样,因为第一组数据要小得多),而其余任务则需要 4 小时以上。

我希望这不是 XY 问题。我究竟做错了什么?