在本地集群上编写独立于作业的程序
使用本地集群创建并运行作业
有些作业需要比 parfor 和 spmd 等高级构造所提供的功能更多的控制。在这种情况下,您必须对创建和运行作业的所有步骤进行编程。您可以在您的计算机上的本地并行环境(或本地集群)中创建和测试您的作业,而无需使用网络集群的资源。将任务分配给所有在客户端计算机上运行的工作单元不会带来任何性能增强。因此,此功能主要用于代码开发、测试和调试。
注意
在 Microsoft® Windows® 操作系统上的本地集群中运行的工作单元可以显示 Simulink® 图形以及某些函数(例如 uigetfile 和 uigetdir)的输出。(对于其他平台或调度器,工作单元无法显示任何图形输出。)此行为将在未来的版本中删除。
本节详细介绍了使用本地集群的 Parallel Computing Toolbox™ 软件进行典型编程会话的步骤:
客户端会话与集群交互时使用的对象仅仅是对集群作业存储位置中的数据的引用,而不是对客户端会话中的数据的引用。创建作业和任务后,您可以关闭客户端会话并重新启动它,并且您的作业仍然驻留在存储位置。您可以使用集群对象的 findJob 函数或 Jobs 属性来查找现有作业。
创建集群对象
您使用 parcluster 函数在本地 MATLAB® 会话中创建一个代表本地调度器的对象。
c = parcluster('local');创建作业
您使用 createJob 函数创建一个作业。该语句在集群作业存储位置创建一个作业,并在客户端会话中创建作业对象 job1。如果省略命令末尾的分号,它会显示有关该作业的一些信息。
job1 = createJob(c)
Job
Properties:
ID: 1
Type: independent
Username: mylogin
State: pending
SubmitDateTime:
StartDateTime:
RunningDuration: 0 days 0h 0m 0s
NumThreads: 1
AutoAttachFiles: true
Auto Attached Files: List files
AttachedFiles: {}
AutoAddClientPath: false
AdditionalPaths: {}
Associated Tasks:
Number Pending: 0
Number Running: 0
Number Finished: 0
Task ID of Errors: []
Task ID of Warnings: []该作业的 State 属性是 pending。这意味着该作业尚未提交(排队)运行,因此您现在可以向其中添加任务。
调度器显示现在指示您的作业(即待处理的作业)的存在,如以下部分清单所示:
c
Local Cluster
Properties:
Profile: local
Modified: false
Host: myhost
NumWorkers: 6
NumThreads: 1
JobStorageLocation: C:\Users\mylogin\AppData\Roaming\MathWorks...
\MATLAB\local_cluster_jobs\R2021b
RequiresOnlineLicensing: false
Associated Jobs:
Number Pending: 1
Number Queued: 0
Number Running: 0
Number Finished: 0创建任务
创建作业后,您可以使用 createTask 函数为该作业创建任务。任务定义了作业运行期间工作单元要评估的函数。通常,一份作业的任务都是相同的。在此示例中,五个任务各自生成一个 3×3 的随机数矩阵。
createTask(job1, @rand, 1, {{3,3} {3,3} {3,3} {3,3} {3,3}});Tasks 的 job1 属性现在是一个 5×1 的任务对象矩阵。
job1.Tasks
5x1 Task array:
ID State FinishDateTime Function Errors Warnings
-----------------------------------------------------------------
1 1 pending rand 0 0
2 2 pending rand 0 0
3 3 pending rand 0 0
4 4 pending rand 0 0
5 5 pending rand 0 0向集群提交作业
要运行您的作业并评估其任务,您可以使用 submit 函数将作业提交给集群。
submit(job1)
本地调度器启动您计算机上的工作单元,并将 job1 的任务分配给这些工作单元进行评估。
获取作业结果
每个任务评估的结果都作为元胞数组存储在任务对象 OutputArguments 属性中。等待作业完成后,使用函数 fetchOutputs 检索作业中所有任务的结果。
wait(job1) results = fetchOutputs(job1);
显示每个任务的结果。
results{1:5}ans =
0.1349 0.5332 0.2621
0.6744 0.1150 0.9625
0.9301 0.6540 0.8972
ans =
0.6383 0.6509 0.4429
0.5195 0.3018 0.3972
0.1398 0.7101 0.7996
ans =
0.9730 0.2934 0.6071
0.7104 0.1558 0.5349
0.3614 0.3421 0.4118
ans =
0.3241 0.9401 0.1897
0.0078 0.3231 0.3685
0.9383 0.3569 0.5250
ans =
0.4716 0.6667 0.7993
0.5674 0.6959 0.9165
0.3813 0.8325 0.8324作业完成后,您可以重复这些命令来检查集群、作业和任务对象的更新状态:
c job1 job1.Tasks
本地集群行为
本地调度器在 MATLAB 客户端会话中运行,因此您不必为本地调度器启动任何单独的调度器或 MATLAB 作业调度器进程。当您向本地集群提交一个作业时,调度器会为作业中的每个任务启动一个 MATLAB 工作单元。您可以为本地配置文件允许的尽可能多的工作单元执行此操作。如果您的作业所包含的任务多于允许的工作单元数量,则调度器将等待当前任务之一完成后,再启动另一个 MATLAB 工作单元来评估下一个任务。您可以修改 local 集群配置文件中允许的工作单元数量。如果未指定,则默认仅运行与计算机上的计算核心一样多的工作单元。
本地集群与任何其他调度器或 MATLAB 作业调度器没有交互,也不与 mjs 服务下在客户端计算机上运行的任何其他工作单元交互。您的计算机上的多个 MATLAB 会话可以各自使用自己的工作单元程序启动自己的本地调度器,但这些组彼此之间不会交互。
当您结束 MATLAB 客户端会话时,其本地调度器和任何正在运行的工作单元也会立即停止。