Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

spmd

병렬 풀의 워커에서 코드를 병렬로 실행

구문

spmd
    statements
end

설명

예제

spmd, statements, end는 한 줄에 spmd 문을 정의합니다. MATLAB®statements로 표시되는 spmd 본문을 여러 MATLAB 워커에서 동시에 실행합니다. 각 워커는 다른 데이터 세트 또는 분산 데이터의 다른 부분에 대해 연산을 수행할 수 있으며, 병렬 연산을 수행하면서 병렬 연산에 참여 중인 다른 워커와 통신할 수 있습니다. spmd 문은 Parallel Computing Toolbox™가 있는 경우에만 사용할 수 있습니다. 명령문을 병렬로 실행하려면 우선 parpool을 사용하여 MATLAB 워커로 구성된 풀을 만들거나 병렬 기본 설정에서 자동 풀 시작을 허용해야 합니다.

spmd 문의 본문 내에서, 각 MATLAB 워커는 고유한 spmdIndex 값을 가지며 spmdSize는 블록을 병렬로 실행하는 총 워커 개수를 나타냅니다. spmd 문의 본문 내에서, 통신 작업용 통신 함수(예: spmdSendspmdReceive)는 워커 간에 데이터를 전송할 수 있습니다.

spmd 문의 본문에서 반환되는 값은 MATLAB 클라이언트에서 Composite 객체로 변환됩니다. Composite 객체는 원격 MATLAB 워커에 저장된 값에 대한 참조를 포함하며 사용자는 셀형 배열 인덱싱을 사용하여 이 값들을 가져올 수 있습니다. Composite 객체가 클라이언트에 있고 병렬 풀이 열려 있는 한 워커의 실제 데이터는 이후 spmd 실행 시 워커에서 계속 사용될 수 있습니다.

기본적으로 MATLAB은 풀의 모든 워커를 사용합니다. 풀이 활성화되어 있지 않은 경우 MATLAB은 풀을 만들고 이 풀에서 모든 워커를 사용합니다. 기본 설정에서 자동 풀 생성을 허용하지 않은 경우 MATLAB은 블록 본문을 로컬에서 실행하고 필요에 따라 Composite 객체를 만듭니다. spmd(0)을 사용하지 않으면 워커가 parfeval 요청을 실행 중인 경우 spmd 블록을 실행할 수 없습니다.

spmd 및 Composite 객체에 대한 자세한 내용은 Distribute Arrays and Run SPMD 항목을 참조하십시오.

참고

clear를 사용하려면 parfor 또는 spmd 대신 parfevalOnAll을 사용하십시오. 이렇게 하면 작업 공간 투명성이 유지됩니다. parfor 루프 또는 spmd 문에서 투명성 확보하기 항목을 참조하십시오.

예제

spmd(n), statements, end는 병렬 풀에서 n개의 워커를 사용할 수 있는 경우, statements를 실행할 MATLAB 워커의 정확한 개수를 n을 사용하여 지정합니다. 사용 가능한 워커 수가 부족한 경우 오류가 발생합니다. n이 0이면 MATLAB은 블록 본문을 로컬에서 실행하고 Composite 객체를 만듭니다. 사용 가능한 풀이 없는 경우에도 마찬가지입니다.

예제

spmd(m,n), statements, end는 최소 m개에서 최대 n개의 워커를 사용하여 statements를 실행합니다. 사용 가능한 워커 수가 부족한 경우 오류가 발생합니다. m이 0일 수 있으며 사용 가능한 워커가 없는 경우 블록이 로컬에서 실행될 수 있습니다.

예제

모두 축소

병렬 풀을 만들고 spmd를 사용하여 간단한 계산을 병렬로 수행합니다. MATLAB은 병렬 풀의 모든 워커에서 spmd 내의 코드를 실행합니다.

parpool(3);
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to the parallel pool (number of workers: 3).
spmd
  q = magic(spmdIndex + 2);
end

결과를 플로팅합니다.

figure
subplot(1,3,1), imagesc(q{1});
subplot(1,3,2), imagesc(q{2});
subplot(1,3,3), imagesc(q{3});

계산이 완료되면 현재 병렬 풀을 삭제할 수 있습니다.

delete(gcp);

여러 개의 GPU에 액세스할 수 있는 경우에는 병렬 풀을 사용하여 여러 개의 GPU에서 병렬로 계산을 수행할 수 있습니다.

MATLAB에서 사용 가능한 GPU 개수를 확인하려면 gpuDeviceCount 함수를 사용하십시오.

availableGPUs = gpuDeviceCount("available")
availableGPUs = 3

사용 가능한 GPU와 같은 수의 워커를 사용하여 병렬 풀을 시작합니다. MATLAB은 최적의 성능을 위해 기본적으로 각 워커에 다른 GPU를 할당합니다.

parpool('Processes',availableGPUs);
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to the parallel pool (number of workers: 3).

각 워커가 사용하는 GPU를 식별하려면 spmd 블록 내에서 gpuDevice를 호출하십시오. spmd 블록은 모든 워커에서 gpuDevice를 실행합니다.

spmd
    gpuDevice
end

parfor 또는 parfeval과 같은 병렬 언어 기능을 사용하여 계산을 병렬 풀의 워커로 분산합니다. 계산에 gpuArray 지원 함수를 사용하는 경우 이러한 함수는 워커의 GPU에서 실행됩니다. 자세한 내용은 GPU에서 MATLAB 함수 실행하기 항목을 참조하십시오. 예제는 Run MATLAB Functions on Multiple GPUs 항목을 참조하십시오.

계산이 완료되면 병렬 풀을 종료합니다. gcp 함수를 사용하여 현재 병렬 풀을 가져올 수 있습니다.

delete(gcp('nocreate'));

다른 GPU를 선택하려면 gpuDevice를 사용하여 GPU 장치 인덱스를 통해 각 워커에서 특정 GPU를 선택할 수 있습니다. gpuDeviceCount 함수를 사용하여 시스템에 있는 각 GPU 장치의 인덱스를 가져올 수 있습니다.

시스템에 3개의 GPU가 있지만 2개만 계산에 사용하려 한다고 가정하겠습니다. 장치의 인덱스를 가져옵니다.

[availableGPUs,gpuIndx] = gpuDeviceCount("available")
availableGPUs = 3
gpuIndx = 1×3

     1     2     3

사용할 장치의 인덱스를 정의합니다.

useGPUs = [1 3];

병렬 풀을 시작합니다. spmd 블록과 gpuDevice를 사용하여 장치 인덱스를 통해 각 워커를 사용하려는 GPU 중 하나와 연결합니다. spmdIndex 함수는 각 워커의 인덱스를 식별합니다.

parpool('Processes',numel(useGPUs));
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to the parallel pool (number of workers: 2).
spmd
    gpuDevice(useGPUs(spmdIndex));
end

최상의 성능을 구현하려면 각 워커에 다른 GPU를 할당하는 것이 좋습니다.

계산이 완료되면 병렬 풀을 종료합니다.

delete(gcp('nocreate'));

  • spmd 블록은 현재 존재하는 병렬 풀의 워커에서 실행됩니다. 풀이 없는 경우, 병렬 기본 설정에서 자동 풀 시작이 비활성화되어 있지 않는 한 spmd는 새 병렬 풀을 시작합니다. 병렬 풀이 없고 spmd가 병렬 풀을 시작할 수 없는 경우 코드는 클라이언트 세션에서 직렬로 실행됩니다.

  • 병렬 풀에 대한 클러스터 프로파일의 AutoAttachFiles 속성이 true로 설정된 경우 MATLAB은 spmd 블록에 대한 분석을 수행하여 실행에 필요한 코드 파일을 결정한 다음 자동으로 이 파일을 병렬 풀 작업에 연결하여 코드가 워커에 사용될 수 있도록 합니다.

  • spmd 사용 시의 제한 사항에 대한 자세한 내용은 여러 데이터 세트에서 단일 프로그램 실행하기 항목을 참조하십시오.

  • spmd의 성능과 기타 병렬 프로그래밍 구문에 대한 내용은 Choose Between spmd, parfor, and parfeval 항목을 참조하십시오.

버전 내역

R2008b에 개발됨