主要内容

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

gather

将分布式数组、Composite 对象或 gpuArray 对象传输到本地工作区

说明

X = gather(A) 可以对以下数组数据进行操作:

  • gpuArray 上:将 A 的元素从 GPU 传输到本地工作区并将它们分配给 X

  • 在分布式数组上,spmd 语句之外:将来自多个工作单元的 A 元素收集到本地工作区并将它们分配给 X

  • 在共存分布式数组中,在 spmd 语句或通信作业内:将 A 的元素聚集在一起并将它们复制到每个工作单元上的 X 中。

您可以在其他数据类型上调用 gather,例如 tall 数组(请参阅 gather (tall))。如果数据类型不支持收集,则 gather 没有效果。

收集 GPU 数组或分布式数组的成本可能很高,而且通常没有必要,除非您需要将结果与不支持这些类型数组的函数一起使用。有关函数支持的更多信息,请参阅 在 GPU 上运行 MATLAB 函数使用分布式数组运行 MATLAB 函数

X = gather(gpuArray(X))X = gather(distributed(X))X = gather(codistributed(X)) 返回原始数组 X

示例

[X1,X2,...,Xn] = gather(A1,A2,...,An) 将多个数组 A1,A2,...,An 收集到相应的输出 X1,X2,...,Xn 中。输入参量和输出参量的数量必须匹配。

X = gather(Cd,destination) 将共存分布式数组 Cd 转换为变体数组 X,使得所有元素都包含在 destination 指定的工作单元上,而 X 在所有其他工作单元上都是一个 0×0 的空双精度数。

示例

[X1,X2,...,Xn] = gather(Cd1,Cd2,...,Cdn,destination) 将共存分布式数组 Cd1,Cd2,...,Cdn 收集到相应的输出 X1,X2,...,Xn 中,其中所有元素均位于由 destination 指定的工作单元上。输入参量和输出参量的数量必须匹配。

X = gather(Cp) 将来自多个工作单元的 Composite 数组 Cp 的所有元素收集到本地工作区并将它们分配给元胞数组 XX 中的元胞数量取决于 Cp 引用的工作单元数量。 (自 R2023a 起)

示例

[X1,X2,...,Xn] = gather(Cp1,Cp2,...,Cpn) 将 Composite 数组 Cp1,Cp2,...,Cpn 收集到相应的元胞数组 X1,X2,...,Xn 中。输入参量和输出参量的数量必须匹配。 (自 R2023a 起)

示例

全部折叠

将 GPU 操作的结果收集到 MATLAB® 工作区。

G = gpuArray(rand(1024,1));
F = sqrt(G);   % Input and output are both gpuArray
W = gather(G); % Return array to workspace
whos
  Name         Size            Bytes  Class       Attributes

  F         1024x1              8192  gpuArray              
  G         1024x1              8192  gpuArray              
  W         1024x1              8192  double                

将分布式数组 D 的所有元素收集到客户端。

n = 10;
parpool('Processes',4);
D = distributed(magic(n)); % Distribute array to workers
M = gather(D)              % Return array to client

将幻方矩阵分布在您的工作单元中,然后将整个矩阵收集到每个工作单元身上,然后再收集到客户端上。此代码在所有工作单元和客户端上产生与 M = magic(n) 等效的结果。

n = 10;
parpool('Processes',4);
spmd
  Cd = codistributed(magic(n));
  M = gather(Cd); % Gather all elements to all workers
end
S = gather(Cd)   % Gather elements to client

Cd 的所有元素聚集到工作单元 1 上,以执行无法跨分布式数组执行的操作。

n = 10;
spmd
  Cd = codistributed(magic(n));
  out = gather(Cd,1);
  if spmdIndex == 1
    % Characteristic sum for this magic square:
    characteristicSum = sum(1:n^2)/n;
    % Ensure that the diagonal sums are equal to the 
    % characteristic sum:
    areDiagonalsEqual = isequal ...
      (trace(out),trace(flipud(out)),characteristicSum)
  end
end
Worker 1: 
  
  areDiagonalsEqual =
  
    logical
  
     1
  

自 R2023a 起

将并行工作单元上存储的 Composite 数组 Cp 的所有元素收集到客户端上。

使用 spmd 语句在您的工作单元上创建一个幻方矩阵,并在客户端上创建一个 Composite 数组 Cp

n = 10
p = parpool('Processes',4);
spmd
    Cp = magic(n);
end

将存储在您的工作单元身上的结果收集到客户端上。

results = gather(Cp)
results =

  1×4 cell array

    {10×10 double}    {10×10 double}    {10×10 double}    {10×10 double}

输入参数

全部折叠

要收集的数组,指定为 gpuArraydistributed 数组或 codistributed 数组。

要收集的共存分布式数组,指定为 codistributed 数组。

自 R2023a 起

要收集的 Composite 数组,指定为 Composite 数组。

提示

  • 请注意,gather 分别在其执行的所有工作单元的工作区中或 MATLAB 客户端上组装共存分布式或分布式数组,但不会同时在两者中组装。如果在 spmd 语句中使用 gather,则可通过其对应的 Composite 对象在客户端访问收集的数组;请参阅 使用 Composite 访问工作单元变量。如果您在通信作业中运行 gather,则可以将收集的数组作为任务的输出参量返回到客户端。

  • 由于分布式或共存分布式数组上的 gather 函数要求所有工作单元之间进行通信,因此无法通过将该函数放置在 if spmdIndex == 1 等条件语句中,将所有工作单元的数据收集到一个工作单元中。

  • 您可以通过右键点击工作区中的变量,然后选择从 GPU 收集来收集 gpuArray 对象。 (自 R2025a 起)

版本历史记录

在 R2006b 中推出

全部展开