Main Content

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

spmdReceive

spmd 代码块中的另一个工作进程接收数据

自 R2022b 起

    说明

    示例

    B = spmdReceive 从当前 spmd 代码块或通信作业中的任何工作进程接收 B 发送给当前工作进程的数据。

    当您使用 parforparfeval 卸载计算时,每次只有一个工作进程运行每个计算。这些工作进程都是独立的,彼此之间不通信。如果将 spmdReceive 应用于这些工作进程,该函数将不起作用。

    当工作进程运行 spmdReceive 时,该函数会阻止其他命令的执行,直到工作进程接收到数据。

    要使用 spmdReceive,运行当前 spmd 代码块的工作进程数量必须大于 1。要获取运行当前 spmd 代码块的工作进程数量,请使用 spmdSize 函数。

    B = spmdReceive(source) 接收从索引等于 source 的工作进程发送的数据。要获取工作进程的索引,请使用 spmdIndex 函数。

    B = spmdReceive('any') 从任意工作进程接收数据。

    示例

    B = spmdReceive('any',tag) 接收任意工作进程发送的带有标签 tag 的数据。

    B = spmdReceive(source,tag) 接收索引等于 source 的工作进程发送的带有标签 tag 的数据。

    [B,sourceOut,tagOut] = spmdReceive(___) 接收另一个工作进程发来的数据,返回源工作进程的索引 sourceOut,并返回带有数据的标签 tagOut

    示例

    全部折叠

    此示例显示了如何在 spmd 代码块或通信作业中的工作进程之间发送数据。

    创建一个有四个工作进程的并行池。

    parpool(4);

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

    创建一个 spmd 代码块。在索引等于 1 的工作进程上,创建一个数组。使用 spmdSend 将数组发送给索引等于 2 的工作进程,使用 spmdReceive 来收集数据。

    spmd
        switch spmdIndex
            case 1
                A = magic(3)
                spmdSend(A,2);
            case 2
                B = spmdReceive
        end
    end
    Worker 1: 
      
      A =
      
           8     1     6
           3     5     7
           4     9     2
      
    Worker 2: 
      
      B =
      
           8     1     6
           3     5     7
           4     9     2
      

    此示例展示了如何在 spmd 代码块或通信作业中的工作进程之间标记和发送数据。

    创建一个有四个工作进程的并行池。

    parpool(4);

    创建一个 spmd 代码块。在索引等于 1 的工作进程上,创建两个数组 A1A2。在创建数组之前和之间,使用 pause 函数暂停执行以仿真一些工作。然后,使用 spmdSend 将矩阵发送给索引等于 2 的工作进程。

    用整数标记每个矩阵。在索引等于 2 的工作进程上,使用 spmdReceive 来收集数据。

    tic
    spmd
        switch spmdIndex
            case 1
                pause(5);
                A1 = magic(1)
                pause(5);
                A2 = magic(2)
                spmdSend(A1,2,1);
                spmdSend(A2,2,2);
            case 2
                B1 = spmdReceive('any',1)
                B2 = spmdReceive('any',2)
      
        end
    end
    toc
    Worker 1: 
      
      A1 =
      
           1
      
      
      A2 =
      
           1     3
           4     2
      
    Worker 2: 
      
      B1 =
      
           1
    
      B2 =
      
           1     3
           4     2
      
    Elapsed time is 10.061523 seconds.

    在某些情况下,您可以通过将一些工作从一个工作进程转移到另一个工作进程来提高代码的性能。将一些工作从索引等于 1 的工作进程移至索引等于 2 的工作进程。当您使用标签时,您可以轻松地将计算从一个工作进程移动到另一个工作进程,而无需更新接收工作进程上的代码。

    tic
    spmd
        switch spmdIndex
            case 1
                pause(5);
                A1 = magic(1)
                spmdSend(A1,2,1);
            case 2
                B2 = spmdReceive('any',2)
                B1 = spmdReceive('any',1)
            case 3
                pause(5);
                A2 = magic(2)
                spmdSend(A2,2,2);
        end
    end
    toc
    Worker 1: 
      
      A1 =
      
           1
      
    Worker 2: 
      
      B2 =
      
           1     3
           4     2
      
      
      B1 =
      
           1
      
    Worker 3: 
      
      A2 =
      
           1     3
           4     2
      
    Elapsed time is 5.117787 seconds.

    输入参数

    全部折叠

    发送数据的工作进程的索引,指定为正整数或 'any'。此输入的值必须小于或等于运行当前 spmd 代码块或通信作业的工作进程数量。

    当您指定此输入时,spmdReceive 将返回从索引等于 source 的工作进程发送的数据。

    当您将此输入指定为 'any' 时,spmdReceive 将返回从任意工作进程发送的数据。

    当您不指定此输入时,spmdReceive 将返回从任何工作进程发送的数据。

    示例: 1

    消息标签,指定为非负整数。当您指定此输入时,spmdReceive 将返回使用 spmdSend 函数发送给当前工作进程的数据。tag 参量等于发送给当前工作进程的 tag

    示例: 314159

    输出参量

    全部折叠

    当前工作进程接收的数据,指定为标量、向量、矩阵、多维数组、表、时间表或任何其他 MATLAB 变量。

    示例: magic(3)

    发送数据的工作进程的索引,以正整数或 'any' 形式返回。该输入的值等于发送接收数据的工作进程的索引。

    当前工作进程接收的数据的消息标签,以非负整数形式返回。

    提示

    标签有很多用途,例如:

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

    • 使用标签创建不依赖于发送工作进程索引的代码。

    扩展功能

    版本历史记录

    在 R2022b 中推出