主要内容

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

spmdSendReceive

spmd 代码块中的工作单元上同时发送和接收数据

自 R2022b 起

    说明

    B = spmdSendReceive(destination,source,A) 将来自 spmd 代码块或通信作业中的当前工作单元的数据 A 发送到 destination,并从 source 接收数据。数组 A 从当前工作单元发送到索引等于 destination 的工作单元。当前工作单元接收索引等于 B 的工作单元发送给当前工作单元 的数据 source

    当您使用此语法时,计算相当于通过同时运行以下代码行来发送和接收数据的工作单元:

    spmdSend(A,destination);
    B = spmdReceive(source);
    

    示例

    B = spmdSendReceive(___,tag) 使用标记 tag 发送和接收数据。当您使用 spmdSendReceive 在工作单元之间发送数据时,可能有多个数据项等待被收集。当您向一个工作单元发送多个数据项时,请为每个数据项添加一个标记以区分这些数据项。

    示例

    全部折叠

    此示例显示如何使用 spmdSendReceivespmd 代码块或通信作业中的工作单元之间发送数据。

    创建一个有四个工作单元的并行池。

    parpool(4);

    当您在创建并行池后执行 spmd 代码块时,默认情况下,池中所有可用的工作单元都会运行 spmd 代码块内的代码。

    创建一个 spmd 代码块。使用 modspmdSendReceive 在工作单元链中发送和接收数据。

    使用 spmdSendReceive 将数据发送到工作单元比当前工作单元的索引大一的工作单元,对运行当前 spmd 代码块的工作单元数量取模。从索引比当前工作单元索引小一的工作单元接收数据,对运行当前 spmd 代码块的工作单元数量取模。

    当您使用模数除法时,索引等于 1 的工作单元将从工作单元等于运行当前 spmd 代码块的工作单元数量的工作单元接收数据。

    spmd
        A = 2*spmdIndex;
        
        destination = 1 + mod((spmdIndex+1)-1, spmdSize);
        source = 1 + mod((spmdIndex-1)-1, spmdSize);
        
        A = spmdSendReceive(destination,source,A)
    end
    Worker 1: 
      A =
          12
    Worker 2: 
      A =
           2
    Worker 3: 
      A =
           4
    Worker 4: 
      A =
           6
    Worker 5: 
      A =
           8
    Worker 6: 
      A =
          10
      

    输入参数

    全部折叠

    目标工作单元的索引,指定为正整数或空数组。目标工作单元从当前工作单元接收数据。该输入必须小于或等于运行当前 spmd 代码块或通信作业的工作单元数量。

    如果此参量是一个空数组,则该函数不会发送任何数据。

    示例: 2

    源工作单元的索引,指定为正整数或空数组。当前工作单元会等待,直到收到来自源工作单元的数据。该值必须小于运行当前 spmd 代码块或通信作业的工作单元数量。

    如果此参量是一个空数组,则该函数不会接收任何数据。

    示例: 1

    从当前工作单元发送的数据,指定为标量、向量、矩阵、多维数组、表、时间表或任何其他 MATLAB 变量。

    示例: magic(3)

    消息标记,指定为非负整数。当您指定此输入时,spmdSendReceive 将从当前工作单元发送带有标记 tag 的数据,并将带有标记 tag 的数据返回到当前工作单元。

    示例: 314159

    提示

    标记有很多用途,例如:

    • 使用标记来节省内存,方法是仅在需要数据时在工作单元上加载数组。

    • 使用标记创建不依赖于发送工作单元索引的代码。

    扩展功能

    全部展开

    版本历史记录

    在 R2022b 中推出