是否可以异步启动并行池?

Can a parallel pool be started asynchronously?

提问人:Will 提问时间:10/27/2020 更新时间:6/28/2023 访问量:141

问:

首次启动 MATLAB 并行池时,通常需要几秒钟的时间。因此,在用户交互式应用程序中,有一种动机是确保在计算任务的第一个需求到来之前有一个并行池在运行,因此启动并行池的过程不会添加到响应请求的总时间中。

但是,每个编程操作(例如我所看到的)将启动并行池都会阻止执行,直到池完成启动。这意味着即使用户在一段时间内不需要调用并行池,他们也不能做任何其他事情,例如开始设置计算成本高昂的请求(例如填写用户界面),直到并行池完成启动。parpool

这是非常令人沮丧的!如果是任何其他耗时的准备操作,一旦并行池到位,就可以在后台使用,并且不会阻碍用户的工作流程,直到任何请求在完成该准备工作时实际调用。但是,由于此任务实际上解决了缺少正在运行的并行池的问题,因此用户似乎必须等待他们实际上可能不需要使用的东西,直到任务完成很长时间后。parfeval

有什么办法可以解决这种明显的可用性限制吗?

MATLAB 异步 并行处理

评论

1赞 Ander Biguri 10/27/2020
我不这么认为,不。MATLAB本身不是异步的。
0赞 Will 10/27/2020
@AnderBiguri,MATLAB主线程的同步性显然不是一个完全的障碍。并行池上的操作和图形绘制操作是由该线程上的同步操作启动的异步任务的两个示例。我也想不出一种方法来完成这个特定的任务,但这就是我问这个问题的原因。
1赞 Ander Biguri 10/27/2020
是的,我明白你的意思,但我仍然认为答案是否定的。
0赞 Will 10/27/2020
@AnderBiguri我在这里见过你,知道你知道什么是答案,什么不是答案:)
1赞 Will 10/27/2020
@AnderBiguri同样 - 如果不出意外,对反复出现的常见烦恼缺乏好的答案,这本身就值得一个可发现的问答问题,供其他人在试图了解答案是否确实存在时登陆!

答:

2赞 Edric 11/2/2020 #1

目前无法在后台启动并行池。有几个潜在的缓解措施可能会有所帮助:

  1. 永远不要显式调用 - 只需让池的自动创建仅在您命中并行语言构造(如 、 或 )时才开始创建池。parpoolparforparfevalspmd
  2. 如果您使用的集群可能在一段时间内无法为工作线程请求提供服务,则可以使用批处理在后台启动整个计算。(这可能只适用于运行时间相当长的计算)。

评论

1赞 Will 11/2/2020
谢谢你的回答!鉴于您在 MathWorks 的专业领域,我不得不勉强接受这是目前不可避免的限制,尽管我私下里可能希望有一些您不愿意公开标明的未记录的技巧;)
1赞 Will 6/28/2023 #2

从 MATLAB R2021b 开始,对于大多数需要在后台完成的计算工作,添加 backgroundPool 是更合适的解决方案。它不能访问与实际启动并行工作线程池相同的所有功能(据我所知,这仍然无法在后台完成),但对于创建响应式用户交互界面的既定用例,它是消除大多数接口延迟的理想选择。

评论

0赞 Cris Luengo 6/28/2023
确实,这是不错的新功能。对于旧版本的 MATAB,应该更快,因为它不会启动后台 MATLAB 会话。另一种选择是在启动期间启动并行池,人们习惯于应用程序需要一些时间来加载。parpool('Threads')
0赞 Edric 7/11/2023
请注意,和都是基于线程的池。根据文档 uk.mathworks.com/help/matlab/ref/parallel.backgroundpool.html 它们共享资源,这实际上意味着一旦其中一个被创建,另一个几乎可以立即创建。(此外,自 R2021b 以来,线程池启动时间应该有相当大的改善)。backgroundPoolparpool('Threads')
0赞 Will 7/11/2023
@Edric这有助于解释为什么当我最初问这个问题时,我认为我没有找到太多解决的问题!与我记得在 2020 年尝试过的任何东西相比,它现在确实非常快......parpool('Threads')