问题标签 [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.
performance - 如何并行扩展集合?
我有一个 HashMap,我想尽可能快地添加元素。我尝试使用par_extend
,但它实际上最终比串行版本慢。我的猜测是它正在并行评估迭代器,但串行扩展集合。这是我的代码:
是否有一种更快的方法来扩展实际上并行添加元素的 HashMap?或者类似的可以并行扩展的数据结构?我知道使用类似的东西会运行得更快FnvHashMap
,但似乎也应该可以通过并行性来加快速度。(是的,我正在编译--release
)
multithreading - 为什么并行化不能提供更大的加速?
我正在尝试制作可以使用多线程快速扩展的HashMap 的变体。我正在使用余数对数据进行分区。它正在工作,但与我的顺序版本相比,它的加速非常小。这是我的代码:
这是我机器上的输出:
并行版本更快,但比我通常使用 Rayon 获得的加速要小得多。我使用的是 16 核 Ryzen 5950x,所以我通常使用 Rayon 获得超过 10 倍的加速。为什么在这种情况下加速比小得多?有没有办法改进并行版本以有效地使用所有 CPU 的内核?
编辑:
我在 Windows 上,以防万一。
multithreading - 在并行迭代器中执行计算,然后将其提供给单线程迭代器?
考虑以下示例:
我收到以下错误:
我的意图是只让 do_something_expensive_returning_lots_of_data 以多线程方式执行,然后一旦执行,就有一个带有调用结果的单线程迭代器,这样我就可以安全地 mutate h
。人造丝可以吗?
multithreading - Recursive impl Extend for HashMap<_, HashSet<_>> 在哪里组合集合,而不是覆盖?
我正在尝试使我的代码适应我之前的问题的解决方案。基本上,我有一个HashMap<String, HashSet<String>>
应该由人造丝的par_extend 生成。问题是键重复,在这种情况下,我希望HashSet
s 被组合,而不是被覆盖。换句话说,有没有办法在impl Extend
此处添加自定义,以便以下代码正确执行?
rust - Rust - 如何与 Rayon 并行处理向量的 while 循环?
我正在尝试使用 while 循环处理向量。目前它是按顺序一次获取每个元素。有没有办法与人造丝并行处理矢量元素并获得相同的结果。它会提高下面给出的代码的性能吗?基本上我从 tcp 客户端获取连续消息并将它们转换为向量然后处理它们。我想让处理部分更快。示例代码如下。
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 尝试的事物列表,然后我在每件事之后观察得分。我希望这个递归调用堆栈的顶层在许多线程中启动顶层,但每个线程应该是顺序的。
multithreading - 内部带有并行迭代器的多个 Rayon `spawn`
我正在尝试在异步环境(tokio)中加快 CPU 繁重的计算。我最初的解决方案是使用rayon::spawn
并行迭代器来实际执行。带有伪代码的最小示例:
这一定是错误的,因为如上所述,所有任务都需要 2 小时才能运行,但如果我删除.par_bridge()
,那么第一个任务只需要 20 分钟(正如预期的那样,因为第一组数据要小得多),而其余任务则需要 4 小时以上。
我希望这不是 XY 问题。我究竟做错了什么?