Main Content

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

spmdSend

将数据发送到 spmd 代码块中的另一个工作进程

自 R2022b 起

    说明

    示例

    spmdSend(A,destination)spmd 代码块或通信作业中的当前工作进程数据 A 发送给 destination 指定的工作进程。

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

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

    示例

    spmdSend(___,tag) 发送带有标签 tag 的数据。当您使用 spmdSend 在工作进程之间发送数据时,可能有多个数据项等待被收集。当您向一个工作进程发送多个数据项时,请为每个数据项添加一个标签以区分这些数据项。

    示例

    全部折叠

    此示例显示了如何在 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.

    输入参数

    全部折叠

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

    示例: magic(3)

    接收数据的工作进程的索引,指定为正整数或正整数向量。索引必须小于或等于运行当前 spmd 代码块或通信作业的工作进程数量。

    示例: [2 3 4]

    消息标签,指定为非负整数。当您指定此输入时,spmdSend 将使用此标签发送数据。如果您使用 spmdReceive 在另一个工作进程上接收数据,则该函数将在其 tagOut 输出中返回标签。

    示例: 314159

    提示

    1. 标签有很多用途,例如:

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

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

    2. 使用 spmdSend 发送数据的工作进程可能会在接收工作进程收到数据之前完成执行。当您需要在 spmd 代码块或通信作业中使用同步工作进程时,比如当您关闭共享资源时,在调用 spmdSendspmdReceive 之后使用 spmdBarrier

    扩展功能

    版本历史记录

    在 R2022b 中推出