主要内容

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

spmdBarrier

同步 spmd 代码块中的工作单元

自 R2022b 起

    说明

    spmdBarrier 停止当前 spmd 代码块或通信作业中的所有工作单元执行代码,直到每个工作单元都调用 spmdBarrier

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

    使用 spmdBarrier 来同步工作单元,例如当工作单元使用共享资源(如文件句柄)时。

    如果当前 spmd 代码块上只有一个工作单元在运行,则执行将立即继续。要确定运行当前 spmd 代码块的工作单元数量,请使用 spmdSize 函数。spmdSize 函数在 1 代码块或通信作业之外返回 spmd 的值。

    示例

    示例

    全部折叠

    此示例显示如何使用 spmdBarrier 同步 spmd 代码块中的工作单元。

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

    parpool(4);

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

    创建一个 spmd 代码块。随机暂停每个工作单元一段时间来仿真一些计算量巨大的工作。使用 tictoc 来计时每个工作单元的执行。

    spmd
        tic
        pause(5*rand);
        toc
    end
    Worker 2: 
      Elapsed time is 0.702969 seconds.
    Worker 3: 
      Elapsed time is 1.807292 seconds.
    Worker 1: 
      Elapsed time is 4.651690 seconds.
    Worker 4: 
      Elapsed time is 4.694443 seconds.

    为了在每个工作单元运行 pause 之后同步工作单元,使用 spmdBarrier。所有工作单元都等待最慢的工作单元完成其计算。除微小的数值噪声外,每个工作单元所花的时间现在是相同的。

    spmd
        tic
        pause(5*rand);
        spmdBarrier;
        toc
    end
    Worker 1: 
      Elapsed time is 4.758529 seconds.
    Worker 2: 
      Elapsed time is 4.758529 seconds.
    Worker 3: 
      Elapsed time is 4.743785 seconds.
    Worker 4: 
      Elapsed time is 4.743739 seconds.

    扩展功能

    全部展开

    版本历史记录

    在 R2022b 中推出