Main Content

distributed

クライアントからの分散配列の要素の作成およびアクセス

    説明

    クライアント上の分散配列は、並列プール内のワーカー間で分割されている配列を表します。配列全体が単一のエンティティとして操作されますが、ワーカーは配列の担当部分のみを処理し、必要に応じて自動的にワーカー間でデータを転送します。分散配列は、要素にインデックスを付けて操作する方法において通常の MATLAB® 配列に似ていますが、その要素はいずれもクライアントに存在していません。spmd ステートメント内で作成された対話型分散配列には、クライアントからの分散配列としてアクセスできます。

    作成

    関数 distributed を使用するか、oneszeros などの配列作成関数の "distributed" オプションを使用します。直接ワーカー上に分散配列を作成する配列作成関数の一覧については、代替機能を参照してください。

    説明

    D = distributed(ds)datastore ds から分散配列を作成します。D は分散配列であり、開いている並列プールの複数のワーカーに各部分が格納されます。

    分散配列の要素をプールから取得し、MATLAB ワークスペースの配列に戻すには、関数 gather を使用します。

    D = distributed(X) は、配列 X から分散配列を作成します。

    MATLAB クライアントがメモリに X 全体を格納できる場合にのみ、この構文を使用してローカル データから分散配列を作成します。大規模な分散配列を作成するには、前述の構文を使用してデータストアから分散配列を作成するか、oneszeros などの配列作成関数の "distributed" オプション、または代替機能にリストされているその他の作成関数を使用します。

    入力引数が既に分散配列になっている場合、結果は入力と同じになります。

    D = distributed(C,dim) は、Composite オブジェクト C から分散配列を作成します。C のエントリが連結され、次元 dim に沿って分散されます。dim を省略すると、最初の次元が分散次元となります。

    Composite オブジェクトのすべてのエントリで、クラスが同じである必要があります。分散次元以外の次元が同じである必要があります。

    D = distributed(tX) は、tall 配列 tX を最初の次元に沿って分散される分散配列に変換します。tX は、分散配列を実行できる並列環境で定義する必要があります。 (R2023b 以降)

    入力引数

    すべて展開する

    データストア。次のオブジェクトのいずれかとして指定します。

    オブジェクトタイプ
    TabularTextDatastore オブジェクトテキスト ファイル
    ImageDatastore オブジェクトイメージ ファイル
    SpreadsheetDatastore オブジェクトスプレッドシート ファイル
    KeyValueDatastore オブジェクトMAT ファイル、および mapreduce を使用して生成したシーケンス ファイル
    FileDatastore オブジェクトカスタム形式ファイル
    TallDatastore オブジェクトMAT ファイル、および関数 write で生成された tall データ型のシーケンス ファイル
    ParquetDatastore オブジェクトParquet ファイル
    DatabaseDatastore (Database Toolbox) オブジェクトデータベース

    分散する配列。配列として指定します。

    分散する Composite オブジェクト。Composite オブジェクトとして指定します。

    分散次元。スカラー整数として指定します。分散次元は、Composite オブジェクトを分散する次元を指定します。

    R2023b 以降

    分散配列に変換する tall 配列。tall 配列として指定します。tall 配列は、分散配列をサポートする並列環境で定義する必要があります。

    出力引数

    すべて展開する

    開いている並列プールの複数のワーカーに各部分が格納されている分散配列。分散配列として返されます。

    オブジェクト関数

    gather分散配列、Composite オブジェクト、または gpuArray オブジェクトをローカル ワークスペースに転送する
    write出力場所への分散データの書き込み

    複数の MATLAB ツールボックスに、分散配列をサポートする関数が含まれています。分散配列をサポートするすべての MathWorks® 製品の関数のリストについては、すべての関数のリスト (分散配列) を参照してください。

    いくつかのオブジェクト関数で、分散配列の特性を調べることができます。そのほとんどは同名の MATLAB 関数と同様に動作します。

    isdistributed分散配列に対し true を返す
    isreal配列で複素数ストレージを使用するかどうかを判別
    isUnderlyingType入力に基となるデータ型が指定されているかどうかを判別
    lengthLength of largest array dimension
    ndims配列の次元数
    sizeArray size
    underlyingType配列の動作を決定する基となるデータの型

    すべて折りたたむ

    この例では、datastore を使用して分散配列を作成し、読み込む方法を説明します。

    まず、例のデータ セットを使用してデータストアを作成します。このデータセットは小さすぎるため、ワーカー間でデータが均等に分割されません。大規模なデータセットをシミュレートするため、repmat を使用してデータ ストアのサイズを人為的に増加します。

    files = repmat("airlinesmall.csv",10,1);
    ds = tabularTextDatastore(files);
    

    例の変数を選択します。

    ds.SelectedVariableNames = ["DepTime", "DepDelay"];
    ds.TreatAsMissing = "NA";
    

    データ ストアを並列で読み取ることにより分散テーブルを作成します。ワーカーごとに 1 パーティションとなるように、データ ストアを分割します。これにより、各ワーカーは対応するパーティションからすべてのデータを読み取ります。ファイルは、ワーカーからアクセス可能な共有場所になければなりません。

    dt = distributed(ds);
    Starting parallel pool (parpool) using the 'Processes' profile ... connected to 4 workers.

    最後に、分散テーブルに関する概要情報を表示します。

    summary(dt) 
    Variables:
    
        DepTime: 1,235,230×1 double
            Values:
    
                min          1
                max       2505
                NaNs    23,510
    
        DepDelay: 1,235,230×1 double
            Values:
    
                min      -1036
                max       1438
                NaNs    23,510
    

    次の例では、分散配列を作成して取得する方法を説明します。

    小さな配列を作成し、分散配列に変換します。

    Nsmall = 50;
    D1 = distributed(magic(Nsmall));
    Starting parallel pool (parpool) using the 'Processes' profile ...
    Connected to parallel pool with 4 workers.
    

    ビルド関数を使用して、ワーカー上に直接、大規模な分散配列を作成します。

    Nlarge = 1000;
    D2 = rand(Nlarge,"distributed");

    分散配列の要素を取得してローカル ワークスペースに戻します。whos を使用すると、変数 Class を調べてワークスペース内のデータの場所を特定することができます。

    D3 = gather(D2);
    whos
      Name           Size                Bytes  Class          Attributes
    
      D1            50x50                20000  distributed              
      D2          1000x1000            8000000  distributed              
      D3          1000x1000            8000000  double                   
      Nlarge         1x1                     8  double                   
      Nsmall         1x1                     8  double                   
    

    ワーカーの並列プールを起動し、spmd を使用して Composite オブジェクトを作成します。

    p = parpool("Processes",4);
    Starting parallel pool (parpool) using the 'Processes' profile ...
    Connected to parallel pool with 4 workers.
    
    spmd
        C = rand(3,spmdIndex-1);
    end
    C
     
    C =
     
       Worker 1: class = double, size = [3  0]
       Worker 2: class = double, size = [3  1]
       Worker 3: class = double, size = [3  2]
       Worker 4: class = double, size = [3  3]
     
    

    Composite オブジェクトから分散配列を作成するには、関数 distributed を使用します。この例では、エントリを 2 番目の次元に沿って分散します。

    d = distributed(C,2)
    d =
    
        0.6383    0.9730    0.2934    0.3241    0.9401    0.1897
        0.5195    0.7104    0.1558    0.0078    0.3231    0.3685
        0.1398    0.3614    0.3421    0.9383    0.3569    0.5250
    

    複数のワーカーにデータがどのように分散しているかを調べます。

    spmd
        d
    end
    Worker 1: 
      This worker does not store any elements of d.
    Worker 2: 
      This worker stores d(:,1).
              LocalPart: [3x1 double]
          Codistributor: [1x1 codistributor1d]
    Worker 3: 
      This worker stores d(:,2:3).
              LocalPart: [3x2 double]
          Codistributor: [1x1 codistributor1d]
    Worker 4: 
      This worker stores d(:,4:6).
              LocalPart: [3x3 double]
          Codistributor: [1x1 codistributor1d]
    

    計算が完了したら、並列プールを削除します。

    delete(p);
    Parallel pool using the 'Processes' profile is shutting down.
    

    R2023b 以降

    この例では、tall 配列を分散配列に変換する方法を説明します。

    例のデータ セットを使用して tall table を作成します。Parallel Computing Toolbox™ がインストールされている場合、関数tallを使用すると、既定の並列プールの基本設定をオフにしていない限り、MATLAB によりワーカーの並列プールが自動的に起動されます。既定のクラスターは、マシン上のローカル プロセス ワーカーを使用します。

    size = 2000000;
    tt = tall(table((1:size)',randn(size,1),randn(size,1),randn(size,1), ...
        'VariableNames',["Exp","Rep1","Rep2","Rep3"]))
    Starting parallel pool (parpool) using the 'Processes' profile ...
    Connected to parallel pool with 4 workers.
    
    tt =
    
      2,000,000×4 tall table
    
        Exp      Rep1        Rep2         Rep3  
        ___    ________    _________    ________
    
         1      -1.6003      -1.2403     -1.6124
         2      0.76827      0.33907     0.77811
         3       1.4637      0.74255    -0.91635
         4      -1.2478      0.10478    -0.10097
         5        0.619      -1.2974     0.93445
         6       1.8375       0.2142     -1.1036
         7     -0.44354      -1.1438    -0.89011
         8      -1.3351    -0.036768     0.65196
         :        :            :           :
         :        :            :           :
    

    tall table を分散テーブルに変換します。MATLAB は最初の次元に沿って tall table のデータを分割し、ワーカーにデータを分散します。

    dt = distributed(tt);

    分散テーブルに関する概要情報を表示します。

    summary(dt)
    Variables:
    
        Exp: 2,000,000×1 double
            Values:
    
                Min         1  
                Max     2e+06  
    
        Rep1: 2,000,000×1 double
            Values:
    
                Min    -5.1402 
                Max     4.8763 
    
        Rep2: 2,000,000×1 double
            Values:
    
                Min    -4.7961 
                Max     4.9875 
    
        Rep3: 2,000,000×1 double
            Values:
    
                Min    -4.8369 
                Max     5.1454 
    

    最後に、各ワーカーに格納されたデータ量を調べます。データはワーカーに均等に分割されています。

    spmd
        dt
    end
    Worker 1: 
      
      This worker stores dt(1:500000,:).
      
              LocalPart: [500000x4 table]
          Codistributor: [1x1 codistributor1d]
      
    Worker 2: 
      
      This worker stores dt(500001:1000000,:).
      
              LocalPart: [500000x4 table]
          Codistributor: [1x1 codistributor1d]
      
    Worker 3: 
      
      This worker stores dt(1000001:1500000,:).
      
              LocalPart: [500000x4 table]
          Codistributor: [1x1 codistributor1d]
      
    Worker 4: 
      
      This worker stores dt(1500001:2000000,:).
      
              LocalPart: [500000x4 table]
          Codistributor: [1x1 codistributor1d]
      
    

    ヒント

    • 分散配列は既存の並列プールのワーカーで作成されます。プールがない場合、並列基本設定でプールの自動起動が無効になっていなければ、distributed によって新しい並列プールが起動されます。並列プールがなく、distributed による起動もできない場合、MATLAB は結果を非分散配列としてクライアント ワークスペースに返します。

    代替機能

    次の表は、distributed 配列をワーカー上に直接作成できる MATLAB 関数の一覧です。詳細については、関数リファレンス ページの「拡張機能」節を参照してください。

    バージョン履歴

    R2008a で導入

    すべて展開する