Main Content

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

spmdSendReceive

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

自 R2022b 起

    说明

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

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

    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 中推出