Main Content

codistributor1d

対話型分散配列に対して 1 次元対話型分散オブジェクトを作成する

構文

codist = codistributor1d()
codist = codistributor1d(dim)
codist = codistributor1d(dim,part)
codist = codistributor1d(dim,part,gsize)

説明

この 1 次元対話型分散では、単一の特定次元に沿って非巡回的に配列を分割し、分散します。

codist = codistributor1d() では、既定の次元と分割を使用して codistributor1d オブジェクトが形成されます。既定の次元は、対話型分散配列の大きさが 1 でない最後の次元です。既定の分割では、既定の次元に沿ってできるだけ均等に配列を分散します。

codist = codistributor1d(dim) では、指定された次元に沿って分散するための 1 次元の対話型分散オブジェクトが形成されます。1 を指定した場合は行によって分散し、2 では列によって分散します。

codist = codistributor1d(dim,part) では、分割ベクトル part による分散のための 1 次元の対話型分散オブジェクトが形成されます。たとえば、C1 = codistributor1d(1,[1,2,3,4]) は、10 行からなる配列を最初の次元 (行) によって 4 つのワーカーに対話型で分散するスキームを記述しています。1 行を最初のワーカーに、2 行を 2 番目のワーカーに、というように分散します。

上記の構文で形成される対話型分散オブジェクトは、いずれもグローバル サイズが指定されていないため、完全なものではありません。このような方法で作成された対話型分散オブジェクトは、対話型分散配列の作成時にテンプレート対話型分散として他の関数の引数の形で使用することができます。

codist = codistributor1d(dim,part,gsize) では、分散次元 dim、分散分割 part および対話型分散配列のグローバル サイズ gsize を使用して、対話型分散オブジェクトが形成されます。形成される対話型分散オブジェクトは完全であり、そのローカル部分を codistributed.build で使用して対話型分散配列を作成できます。既定の次元を使用するには、その引数として codistributor1d.unsetDimension を指定します。この分散次元は gsize から導出され、大きさが 1 でない最後の次元に設定されます。同様に、既定の分割を使用するには、その引数として codistributor1d.unsetPartition を指定します。この分割はグローバル サイズの既定値と分散次元とから導出されます。

このような対話型分散を使用する対話型分散配列のワーカー labidx のローカル部分は、すべての次元でサイズが gsize になりますが、dim だけはサイズが part(labidx) になります。ローカル部分のクラスおよび属性は対話型分散配列全体と同じです。概念的には、次元 dim に沿ってさまざまなローカル部分を連結することによりグローバル配列全体を復元することができます。

codistributor1d オブジェクトを使用して、行によって分散される、1 の値からなる NN 列の行列を作成します。

N = 1000;
spmd
    codistr = codistributor1d(1); % 1st dimension (rows)
    C = ones(N,codistr);
end

完全指定の codistributor1d オブジェクトを使用して、自明な NN 列の対話型分散行列をそのローカル部分から作成します。その上で、どの要素がワーカー 2 に格納されているかを可視化します。

N = 1000;
spmd
    codistr = codistributor1d( ...
                    codistributor1d.unsetDimension, ...
                    codistributor1d.unsetPartition, ...
                    [N,N]);
    myLocalSize = [N,N]; % start with full size on each lab
    % then set myLocalSize to default part of whole array:
    myLocalSize(codistr.Dimension) = codistr.Partition(labindex);
    myLocalPart = labindex*ones(myLocalSize); % arbitrary values
    D = codistributed.build(myLocalPart,codistr);
end
spy(D==2);