MATLAB中分布式阵列与非分布式阵列的区别

MATLAB中分布式阵列与非分布式阵列的区别,matlab,parallel-processing,parfor,Matlab,Parallel Processing,Parfor,假设我们在MATLAB中有以下代码: parpool('local',2) % Create a parallel pool W = ones(6,6); W = distributed(W); % Distribute to the workers spmd T = W*2; % Calculation performed on workers, in parallel % T and W are both codistributed arrays here end T % V

假设我们在MATLAB中有以下代码:

parpool('local',2) % Create a parallel pool
W = ones(6,6);
W = distributed(W); % Distribute to the workers
spmd
    T = W*2; % Calculation performed on workers, in parallel
    % T and W are both codistributed arrays here
end
T % View results in client.
whos % T and W are both distributed arrays here
delete(gcp) % Stop pool
  • 我在文档中读到,普通阵列和分布式阵列之间的区别在于:当我们使用分布式阵列时,这些阵列直接发送给工作者,而客户端上没有任何阵列。所以我们无法访问客户端中的这些阵列?这是唯一的差异吗

  • 如果我们去掉
    W=distributed(W),代码的结构和输出会有什么不同行?使用分布式阵列的目的是什么

  • 分布式
    协同分布式
    之间有什么区别。正如我在文档中所读到的,我们只能在
    spmd
    块中使用
    coddistributed
    。这是真的吗

  • 当然还有其他一些小差异,但至少索引和操作其元素的方式应该是相同的

    你可以很容易地自己试一试。无论如何,结果是一个,即在执行
    spmd
    块时复制到每个工作程序的正常数组方式,并且多次执行计算并存储每个结果。对于常量输入数据(参数),我将使用“正常”类型;对于用于计算输出(并定义其大小)的变量,我将使用
    分布式

    例如:

    x = distributed(1:100); % variable, output will be calculated on -> distributed
    a = 5; % amplitude (constant parameter -> "normal")
    spmd
      y = a * sin(x);
    end
    y
    
    这也解释了分布式的目的:在矩阵上启用并行计算

    到3.:
    分布式
    意味着其元素分布在工人身上
    Codistributed
    意味着其元素也以同样的方式分布到同样
    分布的事物上(其中包括同等大小)。我猜(但不确定)只要并行池保持打开状态,
    coddistributed
    属性就会保持不变,但是从spmd块外部,它们只能作为
    分布式
    数组访问

    报告说:

    在spmd语句中创建的辅助对象上的共同分配数组 或从任务内部访问通信作业的功能,如下所示: 客户端上的分布式阵列

    当然还有其他一些小差异,但至少索引和操作其元素的方式应该是相同的

    你可以很容易地自己试一试。无论如何,结果是一个,即在执行
    spmd
    块时复制到每个工作程序的正常数组方式,并且多次执行计算并存储每个结果。对于常量输入数据(参数),我将使用“正常”类型;对于用于计算输出(并定义其大小)的变量,我将使用
    分布式

    例如:

    x = distributed(1:100); % variable, output will be calculated on -> distributed
    a = 5; % amplitude (constant parameter -> "normal")
    spmd
      y = a * sin(x);
    end
    y
    
    这也解释了分布式的目的:在矩阵上启用并行计算

    到3.:
    分布式
    意味着其元素分布在工人身上
    Codistributed
    意味着其元素也以同样的方式分布到同样
    分布的事物上(其中包括同等大小)。我猜(但不确定)只要并行池保持打开状态,
    coddistributed
    属性就会保持不变,但是从spmd块外部,它们只能作为
    分布式
    数组访问

    报告说:

    在spmd语句中创建的辅助对象上的共同分配数组 或从任务内部访问通信作业的功能,如下所示: 客户端上的分布式阵列


    分布式阵列存储在worker上,而不是客户机上,对它们的操作是由worker并行执行的,这就是它们的要点

    分布式阵列和协同分布式阵列之间的区别只是一个方面。从客户端的角度来看,它们是分布式阵列;从工作者的角度来看,它们是共同分布的数组

    如图所示,首先启动一个池:

    >> parpool('local',2)
    
    创建一个数组:

    >> W = ones(6,6);
    
    W
    存储在客户端上

    现在从
    W
    创建一个分布式阵列:

    >> V = distributed(W);
    
    V
    存储在worker上,在每个worker上拆分。您仍然可以从客户端访问
    V
    ,但当您这样做时,它将
    V
    从工作人员那里拉回来

    >> V
    V =
         1     1     1     1     1     1
         1     1     1     1     1     1
         1     1     1     1     1     1
         1     1     1     1     1     1
         1     1     1     1     1     1
         1     1     1     1     1     1 
    
    请注意,在工作区浏览器中,
    V
    作为6x6分布式阵列存在,而不是像
    W
    那样的6x6双精度阵列

    现在,虽然从客户端的角度来看,
    V
    是一个分布式数组,但从工作人员的角度来看,
    V
    是一个协同分布式数组

    >> spmd; disp(V); end
    Lab 1: 
              LocalPart: [6x3 double]
          Codistributor: [1x1 codistributor1d]
    
    Lab 2: 
              LocalPart: [6x3 double]
          Codistributor: [1x1 codistributor1d]
    
    您可以看到,
    V
    是协同分布的,每个worker上只存储了其中的一半(6x3)

    当您使用
    V
    执行某些操作时,这将并行地发生在辅助对象上,并且结果将作为分布式/协同分布式数组存储在辅助对象上:

    >> spmd; T = V*2; end
    >> spmd; disp(T); end
    Lab 1: 
              LocalPart: [6x3 double]
          Codistributor: [1x1 codistributor1d]
    
    Lab 2: 
              LocalPart: [6x3 double]
          Codistributor: [1x1 codistributor1d]
    
    您可以从客户端访问
    T
    ,就像您使用
    V
    一样,但要显式地将其带回来,请使用
    collect

    >> S = gather(T);
    

    请注意,
    S
    现在是一个6x6双精度阵列,而不是分布式阵列。

    分布式阵列存储在worker上,而不是客户端,并且由worker并行执行对它们的操作-这就是它们的要点

    >> spmd; disp(V); end
    Lab 1: 
              LocalPart: [6x3 double]
          Codistributor: [1x1 codistributor1d]
    
    Lab 2: 
              LocalPart: [6x3 double]
          Codistributor: [1x1 codistributor1d]
    
    分布式阵列和协同分布式阵列之间的区别只是一个方面。从客户端的角度来看,它们是分布式阵列;从工作者的角度来看,它们是共同分布的数组

    如图所示,首先启动一个池:

    >> parpool('local',2)
    
    创建一个数组:

    >> W = ones(6,6);
    
    W
    存储在客户端上

    现在从
    W
    创建一个分布式阵列:

    >> V = distributed(W);
    
    V
    存储在worker上,在每个worker上拆分。您仍然可以从客户端访问
    V
    ,但当您这样做时,它将
    V
    从工作人员那里拉回来

    >> V
    V =
         1     1     1     1     1     1
         1     1     1     1     1     1
         1     1     1     1     1     1
         1     1     1     1     1     1
         1     1     1     1     1     1
         1     1     1     1     1     1 
    
    请注意,在工作区浏览器中,
    V
    作为6x6分布式阵列存在,而不是像
    W
    那样的6x6双精度阵列。