问题标签 [work-stealing]

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 投票
3 回答
334 浏览

java - 问题多线程加载数千张图像导致 IOException

我在通过 ForkJoinPool 加载大量图像时遇到问题,我正在使用超线程的 4 核 Intel 进行测试,因此有 8 个逻辑线程。但是,我将池限制为只有 4 个线程。我收到来自 ImageIO 的错误,无法找到图像。

任何关于我做错了什么的见解都会很棒,我注意到它真的只有在我有超过 1700 张图像并且所有图像都超过 5MB 时才会中断。

这是我从 Java 收到的错误:

当我知道文件在那里时。我将此代码用作指南: https ://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html

0 投票
3 回答
1397 浏览

parallel-processing - 工作窃取和双端队列

为什么我们需要一个双端队列来窃取工作?(例如在 Cilk 中)所有者在顶部工作,而小偷从底部偷窃。为什么有用?

我们可能有多个窃贼从底部偷窃。那么,我们不需要锁吗?我在某处读到较大的作业(例如在树中创建)被添加到底部。因此,从底层偷窃效率更高(沟通更少,因为窃贼通过偷窃他们变得更加忙碌)。是这样吗?

0 投票
1 回答
369 浏览

linux - 工作窃取和内核级线程

工作窃取是用户级线程的常用策略。每个进程都有一个工作队列来拿工作,当他们没有工作要做时,会从其他人的队列中窃取。

是否有任何内核为内核级线程实现这种策略?如果不是,原因是什么?

我相信在 Linux 中,内核级线程中有一个线程迁移的概念,它将线程从高负载处理器迁移到低负载处理器,但这似乎是一种不同的算法。但如果我错了,请纠正我。

谢谢

0 投票
1 回答
115 浏览

c++ - 并行化大型动态程序

我有一个用 C++ 编写的高性能动态程序,它的结果放在一个 M × N 表中,大约是 2000 行 × 30000 列。
每个条目(rc)取决于表中其他几列中的几行。

P个处理器并行计算行r的最明显方法是静态分区数据:即,让处理器p计算所有有效k的条目 (r, p + k P ) 。

但是,不同列的条目计算时间略有不同(例如,一个可能需要五倍于另一个),所以我想动态分区数据以获得更好的性能,通过避免停滞提前完成的 CPU 反而让它们从仍在追赶的 CPU 中窃取工作。

解决此问题的一种方法是保留一个原子全局计数器,该计数器指定已计算的列数,并在每次 CPU 需要更多工作时增加它。但是,这会强制所有 CPU 在计算表中的每个
条目后 访问相同的全局计数器- 即,它在一定程度上序列化程序。由于计算每个条目或多或少是一个快速的过程,这在某种程度上是不可取的。

所以,我的问题是:
有没有办法以更可扩展的方式执行这种动态分区(即在计算每个条目后不必访问单个全局计数器)?

0 投票
1 回答
3307 浏览

java - 具有非递归任务的 Java ForkJoinPool,工作窃取是否有效?

我想Runnable通过一种方法将任务提交到 ForkJoinPool:

注意,我使用 JDK 7。

在后台,它们被转换为 ForkJoinTask 对象。我知道 ForkJoinPool 在将任务递归地拆分为较小的任务时是有效的。

问题:

如果没有递归,工作窃取在 ForkJoinPool 中是否仍然有效?

在这种情况下值得吗?

更新 1: 任务很小并且可能不平衡。即使对于严格相等的任务,诸如上下文切换、线程调度、停放、页面未命中等之类的事情也会阻碍导致不平衡

更新 2: Doug Lea 在并发 JSR-166 兴趣组中写道,给出了一个提示:

当所有任务都是异步的并提交到池而不是分叉时,这也大大提高了吞吐量,这成为构建参与者框架以及许多您可能使用 ThreadPoolExecutor 的普通服务的合理方式。

我认为,当涉及到相当小的 CPU 密集型任务时,ForkJoinPool 是要走的路,这要归功于这种优化。要点是这些任务已经很小,不需要递归分解。工作窃取工作,无论是大任务还是小任务 - 任务都可以被另一个空闲的工作人员从忙碌的工作人员的双端队列中抢走。

更新 3: ForkJoinPool 的可扩展性- Akka 乒乓球团队的基准测试显示了很好的结果。

尽管如此,要更有效地应用 ForkJoinPool 需要进行性能调整。

0 投票
2 回答
5973 浏览

java - 在 Java 8 中,Executors.newWorkStealingPool() 是否也提供了任务队列?

是否有与 Java 8 结合使用的待处理任务队列Executors.newWorkStealingPool()

例如,假设 #available cores 是 2,并且Executors.newWorkStealingPool()是空的,因为 2 个任务已经在运行。那么如果将第三个任务提交给工作窃取执行者会发生什么?是排队吗?如果是,那么所述队列上的界限是什么?

提前致谢。

0 投票
1 回答
69 浏览

wpf - WPF 调度程序和工作窃取?

我有一个使用 WPF 作为其 GUI 的应用程序,但是,在命令启动时,处理负载非常重。我注意到当引擎(繁重的处理)运行时我的 GUI 相当缓慢,并且在 VS2015 中使用“应用程序时间线”工具时,我注意到我的一些引擎代码正在 UI 线程上运行。

引擎从以下行开始,如果我理解该LongRunning标志,则创建一个新线程并在该线程上运行给定的函数。

上面引用的DoWork方法重复用于Parallel.For排队数百个任务。

调度程序线程是否有可能通过运行 TaskScheduler 队列中的任务来“提供帮助”?如果是这样,是否有可能阻止这种情况以保持 GUI 响应(尽管会损害后台任务)?

0 投票
1 回答
194 浏览

scheduling - Cilk工作窃取性能

我正在阅读描述 Cilk 窃取调度性能的工作的论文。

1)我的理解是调度程序不知道关键路径的任务,但只是试图在任何情况下通过窃取任务图中不“深”的任务来维持其执行。那是对的吗?

2)此外,Cilk 窃取调度程序的工作是否假设所有任务都具有相似的复杂性?如果任务的复杂性不统一,是不是调度器在实现最佳性能(即最佳负载平衡)方面的灵活性会降低?

0 投票
2 回答
6319 浏览

java - 在 ForkJoinpool 上使用 CompletableFuture 并避免线程等待

您好,我认为使用 CompletableFuture 和默认值ForkJoinPool我可以优化任务的执行而不是经典ExecutorService,但我错过了一些东西

使用此代码执行需要 1 秒,我有 3 个工作线程:

好的,看起来很正常。

但是使用此代码,需要 3 秒:

我认为睡眠线程将用于启动其他等待任务,它也应该需要 1 秒。例如,我读过 IO WAINTING 线程状态意味着该线程可以重用于其他任务。我可以用 测试这种行为Thread.sleep()吗?我的测试方法是错误的还是我理解错误?

0 投票
1 回答
394 浏览

java - 是否可以使用 Executors.newWorkStealingPool() 编写递归分叉连接解决方​​案?

下面的代码旨在展示递归 fork 连接(查找最大值)的简单用法,我知道 Java JIT 可以在简单的单线程循环中更快地实现这一点,但这只是为了演示。

我最初使用 ForkJoin 框架实现了一个查找最大值,该框架适用于大型双精度数组 (1024*1024)。

我觉得我应该能够在使用 ForkJoin 框架的情况下实现相同的目标,只使用 Executor.workStealingPool() 和 Callables / Futures。

这可能吗?

我的尝试如下: