编程提示
项目开发指南
在为 Parallel Computing Toolbox™ 软件编写代码时,您应该一步步提高应用程序的复杂性。在每个步骤验证您的程序可以避免您同时调试几个潜在的问题。如果您在任何步骤遇到任何问题,请返回上一步并重新验证您的代码。
分布式或并行计算应用程序的推荐编程实践是
在本地机器上正常运行代码。首先验证所有函数,以便在进展过程中,您不必同时调试函数和分布。在本地计算机上的 MATLAB® 软件单个实例中运行您的函数。有关编程建议,请参阅 提升性能的方法。
决定您是否需要一份独立的或通信性的作业。如果您的应用程序涉及需要同时执行计算的大型数据集,那么分布式数组的通信作业可能会受益。如果您的应用程序涉及可以彼此独立执行的循环或重复计算,那么独立作业可能是合适的。
修改除法代码。决定如何划分代码。对于独立作业,确定如何最好地将其划分为任务;例如,for 循环的每次迭代可能定义一项任务。对于通信作业,确定如何最好地利用并行处理;例如,大型数组可以分布在所有工作进程上。
使用
spmd
开发并行功能。使用带有本地池的spmd
在多个工作进程上并行开发您的函数。随着您的进步并在远程集群上使用spmd
,这可能就是完成工作所需要的全部内容。使用本地调度器运行独立或通信作业。创建一个独立的或者通信的作业,并使用具有多个本地工作进程的本地调度器来运行该作业。这将验证您的代码是否正确设置为批处理执行,并且对于独立作业,其计算是否正确地划分为任务。
仅在一个集群节点上运行独立作业。运行您的独立作业并执行一项任务来验证您的客户端和集群之间的远程分发是否正常工作,并验证其他文件和路径是否正确传输。
在多个集群节点上运行独立或通信作业。扩大您的作业规模,以包括独立作业所需的尽可能多的任务,或通信作业所需的尽可能多的工作进程。
注意
MATLAB 的客户端会话必须运行 Java® 虚拟机(JVM®)才能使用 Parallel Computing Toolbox 软件。不要以 -nojvm
标志开头 MATLAB。
MATLAB 工作进程的当前工作目录
MATLAB 工作进程在会话开始时的当前目录是
CHECKPOINTBASE\HOSTNAME_WORKERNAME_mlworker_log\work
其中 CHECKPOINTBASE
在 mjs_def
文件中定义,HOSTNAME
是运行该工作进程的节点名称,WORKERNAME
是 MATLAB 工作进程会话的名称。
例如,如果名为 worker22
的工作进程在主机 nodeA52
上运行,并且其 CHECKPOINTBASE
值为 C:\TEMP\MJS\Checkpoint
,则该工作进程会话的起始当前目录为
C:\TEMP\mjs\Checkpoint\nodeA52_worker22_mlworker_log\work
从工作进程写入文件
当多个工作进程尝试写入同一个文件时,可能会出现竞争条件、冲突,或者一个工作进程可能会覆盖另一个工作进程的数据。这可能发生在以下情况:
每台机器有多个工作进程,他们试图写入同一个文件。
工作进程有一个共享的文件系统,并使用相同的路径来识别要写入的文件。
在某些情况下可能会导致错误,但有时覆盖可能会在没有错误的情况下发生。为了避免出现问题,请确保每个工作进程或 parfor
迭代对其写入或保存数据的任何文件都有唯一的访问权限。当多个工作进程读取同一个文件时不会出现问题。
保存或发送对象
不要在 Parallel Computing Toolbox 对象上使用 save
或 load
函数。这些对象所需的一些信息存储在 MATLAB 会话持久内存中,不会保存到文件中。
同样,您不能通过对象的属性在并行计算进程之间发送并行计算对象。例如,您不能将 MATLAB 作业调度器、作业、任务或工作进程对象作为作业的 JobData
属性的一部分传递给 MATLAB 工作进程。
此外,在 MATLAB 客户端中加载、导入或添加到 Java 搜索路径的系统对象(例如,Java 类、.NET 类、共享库等)在工作进程上不可用,除非在工作进程上明确加载、导入或添加。除了在任务函数代码中,加载这些对象的典型方式可能是在 taskStartup
、jobStartup
中,以及在并行池中工作进程的情况下在 poolStartup
中和使用 pctRunOnAll
中。
使用 clear 函数
执行
clear functions
清除当前 MATLAB 会话中的所有 Parallel Computing Toolbox 对象。它们仍然留在 MATLAB 作业调度器中。有关在客户端会话中重新创建这些对象的信息,请参阅 恢复对象。
运行调用 Simulink 软件的任务
在使用 Simulink® 软件的工作进程会话上运行的第一个任务可能需要很长时间才能运行,因为 Simulink 不会在工作进程会话开始时自动启动。相反,Simulink 在第一次调用时启动。该工作进程会话上的后续任务将运行得更快,除非在任务之间重新启动工作进程。
使用 pause 函数
在 Macintosh 或 UNIX® 操作系统上运行的工作进程会话中,pause(Inf)
会立即返回,而不是暂停。这是为了防止在无法中断时工作进程会话挂起。
传输大量数据
涉及通过网络传输许多对象或大量数据的操作可能会花费很长时间。例如,如果作业包含许多任务,则获取作业的 Tasks
属性或所有作业任务的结果可能需要很长时间。另请参阅 附加文件大小限制。
中断作业
由于作业和任务是在客户端会话之外运行的,因此您无法在客户端会话中使用 Ctrl+C (^C) 来中断它们。要控制或中断作业和任务的执行,请使用 cancel
、delete
、demote
、promote
、pause
和 resume
等函数。
加速作业
您可能会发现您的代码在多个工作进程上运行的速度比在一台台式计算机上运行的速度慢。当任务启动和停止时间相对于任务运行时间很重要时,就会出现这种情况。这方面最常见的错误是把任务弄得太小,也就是太细粒度。另一个常见的错误是每次执行任务时发送大量的输入或输出数据。在这两种情况下,传输数据和初始化任务所需的时间远远大于工作进程评估任务函数所需的实际时间。