主要内容

本页采用了机器翻译。点击此处可查看英文原文。

选择如何在并行计算中管理数据

R2026b

要执行并行计算,您需要管理 MATLAB® 客户端和并行工作单元之间的数据访问和传输。使用此页面来决定如何向客户端和工作单元传输数据。您可以管理文件、MATLAB 变量和句柄类型资源等数据。

确定您的数据管理方法

管理数据的最佳技术取决于您的并行应用程序。使用下表来查找您的目标并找到合适的数据管理函数及其主要特性。在某些情况下,多种类型的对象或函数可能满足您的要求。您可以根据工作流选择对象或函数的类型。

将数据从客户端传输到工作单元

使用此表确定将数据从客户端传输到工作单元的一些目标并发现推荐的工作流。

目标推荐的工作流

在交互式并行池中使用 MATLAB 工作区中的变量。

parfor 和 spmd 函数自动将客户端工作区中的变量传输给工作单元。要将变量发送给 parfeval 计算中的工作单元,您必须在 parfeval 函数调用中将变量指定为输入参量。

将 MATLAB 工作区中的变量通过批处理工作流传输给集群上的工作单元。

将变量作为输入传递到 batch 函数中。

让工作单元访问存储在桌面上的大量数据。

  • 为了让并行池中的工作单元访问大数据,请将数据保存到 parallel.pool.Constant 对象。

  • 为了让使用 batch 函数创建的批处理作业中的工作单元能够访问大数据,请将数据作为参量传递给批处理函数。

  • 为了让使用 createJob 函数创建的批处理作业中的工作单元能够访问大数据,您可以在提交作业任务之前将数据传递给作业 ValueStore 对象。

访问存储在云中的大量数据或大文件,并在现场或云集群中进行处理。

使用带有 tall 数组和分布式数组的 datastore 来访问和处理内存中容纳不了的数据。

允许工作单元访问存储在客户端计算机上的文件。

对于并行池中的工作单元:

  • 如果文件很小或包含实时数据,您可以使用 addAttachedFiles 函数指定要发送给工作单元的文件。

  • 如果文件很大或包含静态数据,您可以通过将文件移动到集群存储来减少数据传输开销。使用 addpath 函数将它们的位置添加到工作单元的搜索路径中。

对于运行批处理作业的工作单元:

  • 如果文件很小或者经常被修改,您可以通过将作业的 AutoAttachFiles 属性设置为 true 来让 MATLAB 确定将哪些文件发送给工作单元。您可以通过运行 listAutoAttachedFiles 函数来检查 AutoAttachFiles 是否已获取所有文件依赖关系。

  • 您还可以使用作业的 AttachedFiles 属性指定要发送给工作单元的文件。

  • 如果文件很大或者不经常修改,您可以通过将文件移动到集群存储并使用作业的 AdditionalPaths 属性指定其位置来减少数据传输开销。您必须确保工作单元有权访问集群存储位置。

访问存储在集群上的自定义 MATLAB 函数或库。

使用并行作业的 AdditionalPaths 属性指定库或函数的路径。

允许并行池中的工作单元访问不可复制的资源,例如数据库连接或文件句柄

使用 parallel.pool.Constant 对象来管理跨池工作单元的句柄类型资源,例如数据库连接或文件句柄。

向正在运行某个函数的交互式池中的工作单元发送一条消息。

创建一个工作单元可以轮询以接收数据的 parallel.pool.PollableDataQueue 对象。有关此工作流的示例,请参阅 使用可轮询数据队列向工作单元发送消息。 (自 R2025a 起)

在 R2025a 之前的版本中: 在工作单元端创建一个 parallel.pool.PollableDataQueue 对象,并将该对象发送回客户端。然后您可以使用 PollableDataQueue 对象向工作单元发送消息。有关此工作流的示例,请参阅 接收有关工作单元的通信。

在工作单元之间传输数据

使用此表确定在工作单元之间传输数据的一些目标并发现推荐的工作流。

目标推荐的工作流

  • 作为并行管道应用程序的一部分,协调工作单元之间的数据传输。

  • 使用消息传递接口 (MPI) 在工作单元之间进行通信。

在交互式并行池中,使用 parallel.pool.PollableDataQueue 在工作单元之间传输消息和数据。有关此工作流的示例,请参阅 使用可轮询数据队列在工作单元之间传输数据。 (自 R2025a 起)

使用 spmdSend、spmdReceive、spmdSendReceive 和 spmdBarrier 函数在 spmd 代码块中的工作单元之间进行通信。这些函数使用消息传递接口 (MPI) 在工作单元之间发送和接收数据。

卸载工作单元的结果,以供另一个工作单元处理。

将数据存储在作业或并行池的 ValueStore 对象中。多个工作单元可以读取和写入 ValueStore 对象,该对象存储在客户端和所有工作单元均可访问的共享文件系统上。

将数据从工作单元传输到客户端

使用此表来确定将数据从工作单元传输到客户端的一些目标并发现推荐的工作流。

目标推荐的工作流

从 parfeval 计算中检索结果。

将 fetchOutputs (parfeval) 函数应用于 parfeval Future 对象。

在客户端检索大量结果。

将数据存储在作业或并行池的 ValueStore 对象中。多个工作单元可以读取和写入 ValueStore 对象,该对象存储在客户端和所有工作单元均可访问的共享文件系统上。

  • 传输一个大文件到客户端。

  • 将批处理执行期间创建的文件传回客户端。

使用并行池或作业的 FileStore 对象来存储文件。工作单元可以读取和写入 FileStore 对象,该对象存储在客户端和所有工作单元均可访问的共享文件系统上。

从并行作业中获取结果。

将 fetchOutputs (Job) 函数应用于作业对象,以检索作业中所有任务的所有输出参量。

从运行脚本或表达式的 batch 作业加载工作区变量。

将 load 函数应用于作业对象,以将所有工作区变量加载到工作单元上。

在执行期间将数据从工作单元传输到客户端

使用此表确定在执行期间从工作单元传输数据的一些目标并发现推荐的工作流。

目标推荐的工作流

检查交互式并行池中 parfor 或 parfeval 计算的结果。

使用 PollableDataQueue 在执行期间将结果发送给客户端。

使用在交互式并行池中运行的函数的数据更新图、进度条或其他用户界面。

使用 parallel.pool.DataQueue 将数据发送到客户端,并使用 afterEach 运行在收到新数据时更新用户界面的函数。

对于需要调用 1000 次 afterEach 更新函数的超大型计算,您可能需要关闭可视化功能。可视化结果可能非常有用,但是当扩展到大型计算时,您会发现性能有所下降。

异步收集数据以使用来自 parfeval 计算的数据来更新图、进度条或其他用户界面。

使用 afterEach 来安排一个回调函数,该函数在 Future 对象完成后更新用户界面。

  • 跟踪作业的进度。

  • 在作业运行时检索一些中间结果。

将数据存储在作业的 ValueStore 对象中。使用 ValueStore 对象的 KeyUpdatedFcn 或 KeyRemovedFcn 属性来运行回调函数,当从 ValueStore 添加或删除数据时,该函数会更新客户端的用户界面。

  • 发送一个大文件给客户端。

  • 将批处理执行期间创建的文件传回客户端。

将文件存储在作业的 FileStore 对象中以存储文件。使用 FileStore 对象的 KeyUpdatedFcn 或 KeyRemovedFcn 属性来运行回调函数,当从 FileStore 添加或删除文件时,该函数将文件发送到客户端。

比较数据管理函数和对象

一些管理数据的并行计算对象和函数具有类似的特点。本节对具有类似数据管理功能的函数和对象进行了比较。

DataQueue 与 ValueStore

DataQueue 和 ValueStore 是 Parallel Computing Toolbox™ 中的两个对象,您可以使用它们在客户端和工作单元之间传输数据。DataQueue 对象按照先进先出 (FIFO) 的顺序将数据从工作单元传递给客户端,而 ValueStore 存储多个工作单元以及客户端可以访问和更新的数据。您可以使用这两个对象向客户端进行异步数据传输。但是,DataQueue 仅在交互式并行池中受支持。

DataQueue 和 ValueStore 之间的选择取决于并行应用程序中所需的数据访问模式。如果您有许多独立的任务,工作单元可以按任何顺序执行这些任务,并且您希望以流式方式将数据传递给客户端,那么请使用 DataQueue 对象。但是,如果您想存储和共享值给多个工作单元并随时访问或更新它,那么请改用 ValueStore。

fetchOutputs (parfeval) 与 ValueStore

使用 fetchOutputs 函数检索 Future 对象的输出参量,软件在您运行 parfeval 或 parfevalOnAll 计算时返回该参量。fetchOutputs 阻止客户端直到计算完成,然后将 parfeval 或 parfevalOnAll 计算的结果发送到客户端。相比之下,您可以使用 ValueStore 来存储和检索任何并行计算的值,还可以在不阻止程序的情况下检索生成的中间结果。此外,ValueStore 对象不保存在系统内存中,因此您可以将大量结果存储在 ValueStore 中。不过,存储大量数据时要小心,以免填满集群上的磁盘空间。

如果您只需要检索 parfeval 或 parfevalOnAll 计算的输出,那么 fetchOutputs 是更简单的选项。但是,如果您想存储和访问多个独立并行计算的结果,请使用 ValueStore。当有多个 parfeval 计算生成大量数据时,使用池 ValueStore 对象可以帮助避免客户端的内存问题。您可以将结果暂时保存在 ValueStore 中,并在需要时检索它们。

load 和 fetchOutputs (Jobs) 与 ValueStore

load、fetchOutputs (Jobs) 和 ValueStore 提供了将数据从作业传回客户端的不同方式。

load 检索与您使用 batch 函数运行脚本或表达式时创建的作业相关的变量。这包括您提供的任何输入参量和工作单元在计算过程中创建的临时变量。load 不会从运行函数的 batch 作业中检索变量,并且您无法在作业运行时检索结果。fetchOutputs (Jobs) 检索您使用 batch、createJob 或 createCommunicatingJob 函数创建的已完成作业的任务中包含的输出参量。如果调用 fetchOutputs (Jobs) 函数时作业仍在运行,则 fetchOutputs (Jobs) 函数将返回错误。

当您在集群上创建一个作业时,软件会自动为该作业创建一个 ValueStore 对象,您可以使用它来存储作业执行过程中生成的数据。与 load 和 fetchOutputs 函数不同,ValueStore 对象不会自动存储数据。相反,您必须手动将数据作为键值对添加到 ValueStore 对象。工作单元可以将数据存储在 ValueStore 对象中,MATLAB 客户端可以在作业执行期间检索该对象。此外,ValueStore 对象不保存在系统内存中,因此您可以在存储库中存储大量结果。

要在作业完成后检索作业结果,请使用 load 或 fetchOutputs (Jobs) 函数。要在作业仍在运行时访问结果或跟踪作业的进度,或者存储可能占用大量内存的结果,请使用 ValueStore 对象

AdditionalPaths 与 AttachedFiles 与 AutoAttachedFiles

AdditionalPaths、AttachedFiles 和 AutoAttachedFiles 都是并行作业属性,您可以使用它们来指定在工作单元上运行并行代码所需的其他文件和目录。

AdditionalPaths 是一个属性,您可以使用它将集群文件位置添加到运行您的作业的所有工作单元程序上的 MATLAB 路径中。如果在集群存储中存储了包含大量数据的文件、工作单元所需的函数或库,但默认情况下它们不在 MATLAB 路径上,那么这将很有用。

AttachedFiles 属性允许您指定工作单元所需但未存储在集群存储上的文件或目录。在并行代码运行之前,这些文件被复制到每个工作单元上的临时目录中。这些文件可以是脚本、函数或数据文件,并且必须位于客户端的目录结构内。

使用 AutoAttachedFiles 属性允许工作单元所需的文件自动附加到作业。当您提交一个作业或任务时,MATLAB 会对所有任务函数,或者批处理作业脚本或函数执行依赖关系分析。然后,它会自动将所需的文件添加到作业或任务对象中,以便将其传输给工作单元。本质上,如果您知道不需要软件为您识别文件,则只需将 AutoAttachedFiles 属性设置为 false。例如,如果您的作业要使用的文件已经存在于集群中,那么可能位于其中一个 AdditionalPaths 位置内。

当集群上存储了所有工作单元都需要的函数和库时,使用 AdditionalPaths。当您有运行代码所需的小文件时,请使用 AttachedFiles。为了让 MATLAB 自动确定作业是否需要运行其他文件,请将 AutoAttachedFiles 属性设置为 true。

另请参阅

| | | | | | | | | | |

主题