Main Content

distributed

분산 배열의 요소를 클라이언트에서 생성 및 액세스

    설명

    클라이언트의 분산 배열은 병렬 풀의 워커 간에 분할된 배열을 나타냅니다. 사용자는 전체 배열을 단일 개체로 보고 연산을 수행하지만, 워커는 배열의 일부에 대해서만 연산을 수행하고 필요한 경우 워커 간에 자동으로 데이터를 전송합니다. 분산 배열은 요소를 인덱싱하고 조작한다는 측면에서 일반 MATLAB® 배열과 유사하지만 클라이언트에는 요소가 존재하지 않습니다. spmd 문 내에서 만드는 공동분산 배열은 클라이언트에서 분산 배열로 액세스할 수 있습니다.

    생성

    distributed 함수를 사용하거나 ones 또는 zeros와 같은 배열 생성 함수의 "distributed" 옵션을 사용합니다. 워커에서 직접 분산 배열을 만드는 배열 생성 함수의 목록은 대체 기능 항목을 참조하십시오.

    설명

    D = distributed(ds)datastore ds로부터 분산 배열을 만듭니다. D는 열려 있는 병렬 풀의 워커에 부분적으로 저장되는 분산 배열입니다.

    풀의 분산 배열 요소를 MATLAB 작업 공간의 배열로 다시 가져오려면 gather 함수를 사용합니다.

    예제

    D = distributed(X)는 배열 X에서 분산 배열을 만듭니다.

    MATLAB 클라이언트가 X 모두를 메모리에 저장할 수 있는 경우, 이 구문을 사용하여 로컬 데이터로부터 분산 배열을 만듭니다. 크기가 큰 분산 배열을 만들려면 이전 구문을 사용하여 데이터저장소로부터 분산 배열을 만들거나, oneszeros와 같은 배열 생성 함수 또는 대체 기능에 나열된 다른 생성 함수의 "distributed" 옵션을 사용하여 분산 배열을 만듭니다.

    입력 인수가 이미 분산 배열이면 결과는 해당 입력과 동일합니다.

    예제

    D = distributed(C,dim)Composite 객체 C의 요소를 차원 dim에 따라 결합하고 분산하여 C로부터 분산 배열을 만듭니다. dim을 생략하면 첫 번째 차원은 분포 차원입니다.

    Composite 객체의 모든 요소는 클래스가 동일해야 합니다. 분포 차원 이외의 차원은 동일해야 합니다.

    예제

    D = distributed(tX)는 tall형 배열 tX를 첫 번째 차원을 따라 분산된 분산 배열로 변환합니다. tX는 분산 배열을 실행할 수 있는 병렬 환경에 정의되어야 합니다. (R2023b 이후)

    예제

    입력 인수

    모두 확장

    데이터저장소로, 다음 객체 중 하나로 지정됩니다.

    객체유형
    TabularTextDatastore 객체텍스트 파일
    ImageDatastore 객체이미지 파일
    SpreadsheetDatastore 객체스프레드시트 파일
    KeyValueDatastore 객체MAT 파일 및 시퀀스 파일(mapreduce를 사용하여 생성)
    FileDatastore 객체사용자 지정 형식 파일
    TallDatastore 객체MAT 파일 및 시퀀스 파일(tall 데이터형의 write 함수로 생성)
    ParquetDatastore 객체Parquet 파일
    DatabaseDatastore (Database Toolbox) 객체데이터베이스

    분산시킬 배열로, 배열로 지정됩니다.

    분산시킬 Composite 객체로, Composite 객체로 지정됩니다.

    분포 차원으로, 정수 스칼라로 지정됩니다. 분포 차원은 Composite 객체를 분산시킬 차원을 지정합니다.

    R2023b 이후

    분산 배열로 변환할 tall형 배열로, tall형 배열로 지정됩니다. tall형 배열은 분산 배열을 지원하는 병렬 환경에 정의되어야 합니다.

    출력 인수

    모두 확장

    열려 있는 병렬 풀의 워커에 부분적으로 저장된 분산 배열로, 분산 배열로 반환됩니다.

    객체 함수

    gather로컬 작업 공간으로 분산 배열, Composite 객체 또는 gpuArray 객체 전송
    writeWrite distributed data to an output location

    일부 MATLAB 툴박스에는 분산 배열을 지원하는 함수가 포함되어 있습니다. 분산 배열을 지원하는 모든 MathWorks® 제품의 함수 목록은 모든 함수 목록(분산 배열)을 참조하십시오.

    몇몇 객체 함수를 사용하면 분산 배열의 특성을 검토할 수 있습니다. 대부분 같은 이름의 MATLAB 함수와 비슷하게 동작합니다.

    isdistributedTrue for distributed array
    isreal배열에 복소수가 저장되어 있는지 확인
    isUnderlyingTypeDetermine whether input has specified underlying data type
    lengthLength of largest array dimension
    ndims배열의 차원 수
    sizeArray size
    underlyingTypeType of underlying data determining array behavior

    예제

    모두 축소

    이 예제에서는 datastore를 사용하여 분산 배열을 만들고 불러오는 방법을 보여줍니다.

    먼저, 예제 데이터 세트를 사용하여 데이터저장소를 만듭니다. 이 데이터 세트는 너무 작아서 워커에 걸쳐 데이터의 균등 분할을 표시할 수 없습니다. 대규모 데이터 세트를 시뮬레이션하기 위해 repmat를 사용하여 데이터저장소의 크기를 인위적으로 늘립니다.

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

    예제 변수를 선택합니다.

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

    데이터저장소를 병렬로 읽어와서 분산 테이블을 만듭니다. 워커당 하나의 파티션으로 데이터저장소를 분할합니다. 그러면 각 워커는 그에 대응하는 파티션의 모든 데이터를 읽어옵니다. 파일은 워커에서 액세스할 수 있는 공유 위치에 있어야 합니다.

    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 함수를 사용합니다. 이 예제에서는 두 번째 차원을 따라 요소를 분산시킵니다.

    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형 테이블을 만듭니다. 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형 테이블을 분산 테이블로 변환합니다. MATLAB은 첫 번째 차원을 따라 tall형 테이블의 데이터를 분할하고 이를 워커에 분산시킵니다.

    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에 개발됨

    모두 확장