Main Content

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

여러 데이터 세트에서 단일 프로그램 실행하기

소개

단일 프로그램 다중 데이터(spmd) 언어 구문을 사용하면 직렬 프로그래밍과 병렬 프로그래밍을 매끄럽게 교차 사용할 수 있습니다. spmd 문을 사용하여 여러 워커에서 동시에 실행하는 코드 블록을 정의할 수 있습니다. 워커에서 spmd 문 내에 할당된 변수를 사용하면 Composite 객체를 통해 참조로 클라이언트에서 변수 값에 직접 액세스할 수 있습니다.

이 장에서는 spmd 문과 Composite 객체의 몇 가지 특징에 대해 설명합니다.

spmd를 사용하는 경우

spmd의 "단일 프로그램"이란 동일한 코드가 여러 워커에서 실행되는 것을 의미합니다. MATLAB® 클라이언트에서 하나의 프로그램을 실행하고 spmd 블록으로 레이블이 지정된 부분은 워커에서 실행됩니다. spmd 블록이 완료되면 프로그램은 클라이언트에서 계속 실행됩니다.

"여러 데이터"란 spmd 문이 모든 워커에서 동일한 코드를 실행하더라도 각 워커는 이 코드에 대해 서로 다른 고유한 데이터를 가질 수 있음을 의미합니다. 따라서 여러 데이터 세트는 여러 워커에서 수용될 수 있습니다.

spmd에 적합한 일반적인 응용 프로그램은 워커 간 통신이나 동기화가 필요한 경우 프로그램을 여러 데이터 세트에서 동시에 실행해야 하는 응용 프로그램입니다. 몇 가지 일반적인 경우는 다음과 같습니다.

  • 실행하는 데 오래 걸리는 프로그램 — spmd를 사용하면 여러 워커가 동시에 해를 계산할 수 있습니다.

  • 대규모 데이터 세트에서 동작하는 프로그램 — spmd를 사용하면 데이터를 여러 워커에 분산할 수 있습니다.

자세한 내용은 Choose Between spmd, parfor, and parfeval 항목을 참조하십시오.

spmd 문 정의하기

spmd 문의 일반적인 형식은 다음과 같습니다.

spmd
    <statements>
end

참고

병렬 풀이 실행 중이지 않으면 spmd는 병렬 기본 설정에 지정된 디폴트 클러스터 프로파일을 사용하여 풀을 생성합니다.

<statements>로 표시된 코드 블록이 병렬 풀의 모든 워커에서 동시에 병렬로 실행됩니다. 그중 일부 워커에서만 실행되도록 제한하려면 다음과 같이 실행할 워커 개수를 정확하게 지정합니다.

spmd (n)
    <statements>
end

이 문은 n개의 워커가 spmd 코드를 실행하도록 요청합니다. n은 열려 있는 병렬 풀의 워커 개수보다 작거나 같아야 합니다. 이 문은 풀이 충분히 크더라도 사용 가능한 워커의 개수가 n개가 아니면 사용 가능한 워커가 충분한 개수가 될 때까지 기다립니다. n이 0이면 spmd 문은 현재 실행 중인 풀이 없는 것과 동일한 상태로 취급하여 워커를 사용하지 않고 클라이언트에서 로컬로 실행합니다.

다음과 같이 워커 개수의 범위를 지정할 수 있습니다.

spmd (m,n)
    <statements>
end

이 경우 spmd 문에는 최소 m개의 워커가 필요하며 최대 n개의 워커를 사용합니다.

spmd 문을 실행하는 워커 개수를 제어하는 것이 중요한 경우 클러스터 프로파일이나 spmd 문에서 범위가 아닌 정확한 개수를 설정하십시오.

예를 들어, 3개의 워커에서 확률 행렬을 만들어 보겠습니다.

spmd (3)
    R = rand(4,4);
end

참고

이 장에서 이후 설명하는 예제는 모두 병렬 풀이 열려 있고 일련의 spmd 문 간에 열린 상태를 유지한다고 가정합니다.

parfor 루프와 달리 spmd 문에 사용되는 각 워커는 고유한 spmdIndex 값을 갖습니다. 따라서, 대개 특정 데이터에 액세스할 목적으로 코드를 특정 워커에서만 실행하도록 지정하거나 코드의 실행을 사용자 지정할 수 있습니다.

예를 들어, spmdIndex에 따라 크기가 다른 배열을 만들어 보겠습니다.

spmd (3)
    if spmdIndex==1 
        R = rand(9,9);
      else
        R = rand(4,4);
    end
end

spmdIndex에 따라 각 워커에서 고유한 데이터를 불러오고 각 워커에서 동일한 함수를 사용하여 데이터의 결과를 계산합니다.

spmd (3)
    labdata = load(['datafile_' num2str(spmdIndex) '.ascii'])
    result = MyFunction(labdata)
end

spmd 문을 실행 중인 워커들은 동시에 연산을 수행하며 서로를 인식합니다. 통신 작업과 마찬가지로 워커 간 통신을 직접 제어하고, 워커 간 데이터를 전송하고, 워커 간 공동분산 배열을 사용할 수 있습니다.

예를 들어, spmd 문에서 공동분산 배열을 사용해 보겠습니다.

spmd (3)
    RR = rand(30, codistributor());
end

각 워커는 공동분산 배열 RR을 30×10 크기로 나눈 조각을 갖습니다. 공동분산 배열에 대한 자세한 내용은 Working with Codistributed Arrays 항목을 참조하십시오.

출력값 표시하기

spmd 문을 병렬 풀에서 실행하면 워커에서 생성되는 모든 명령줄 출력값은 클라이언트 명령 창에 표시됩니다. 워커는 디스플레이가 없는 MATLAB 세션이므로 풀의 그래픽 출력(예: Figure 창)이 전혀 표시되지 않습니다.

MATLAB 경로

spmd 문을 실행하는 모든 워커는 MATLAB 검색 경로가 클라이언트와 동일해야 합니다. 그래야 워커들이 공유하고 있는 코드 블록에서 어떤 함수가 호출되든 실행할 수 있습니다. 따라서 클라이언트에서 cd, addpath 또는 rmpath를 실행할 때마다 가능한 경우 모든 워커에서도 실행됩니다. 자세한 내용은 parpool 함수 도움말 페이지를 참조하십시오. 워커가 클라이언트와 다른 플랫폼에서 실행 중인 경우 함수 pctRunOnAll을 사용하여 모든 워커에 대한 MATLAB 경로를 적절하게 설정합니다.

오류 처리

spmd 문을 실행하는 동안 워커에 오류가 발생하면 클라이언트로 오류가 보고됩니다. 클라이언트는 모든 워커에서 실행 중단을 시도하고 사용자에게 오류를 표시합니다.

워커에서 발생한 오류 및 경고는 MATLAB 클라이언트에 수신된 순서대로 명령 창에 해당 워커 ID(spmdIndex)와 함께 표시됩니다.

spmd 본문 내에서 lastwarn이 사용된 경우 해당 동작은 이 명령문이 끝나면 효력을 상실합니다.

spmd 제한 사항

중첩 함수

함수 내에서 spmd 문의 본문은 중첩 함수를 참조할 수 없습니다. 그러나 중첩 함수에 대한 함수 핸들로 정의된 변수를 사용하여 중첩 함수를 호출할 수 있습니다.

spmd 본문은 워커에서 실행되므로 spmd 문 내에서 호출되는 중첩 함수에 의해 업데이트되는 변수는 바깥쪽 함수의 작업 공간에서 업데이트되지 않습니다.

중첩 spmd

spmd 문의 본문은 다른 spmd를 직접 포함할 수 없습니다. 그러나 다른 spmd 문이 포함된 함수를 호출할 수는 있습니다. 내부 spmd 문은 또다른 병렬 풀에서 병렬로 실행되지 않고, 이 문에 포함된 함수를 실행하고 있는 워커에서 단일 스레드로 직렬 실행됩니다.

중첩 parfor 루프

spmd 문에는 parfor 루프가 포함될 수 없으며 parfor 루프의 본문에는 spmd 문이 포함될 수 없습니다. 그 이유는 워커가 추가적으로 다른 병렬 풀을 시작하거나 액세스할 수 없기 때문입니다.

break, continuereturn

spmd 문의 본문에는 break, continue 또는 return 문이 포함될 수 없습니다. parfeval이나 parfevalOnAll에는 cancel을 사용할 수 있으므로 spmd 대신 이 두 함수를 고려하십시오.

전역 변수 및 영속 변수

spmd 문의 본문에는 global 변수 선언이나 persistent 변수 선언을 포함할 수 없습니다. 그 이유는 이러한 변수가 워커 간에 동기화되지 않기 때문입니다. 함수 내에 global 변수나 persistent 변수를 사용할 수 있지만 변수 값은 함수를 생성하는 워커에만 표시됩니다. 값을 공유하려면 global 변수 대신 함수 인수를 사용하는 것이 좋습니다.

익명 함수

spmd 문의 본문에는 익명 함수를 정의할 수 없습니다. 그러나 함수 핸들을 사용하여 익명 함수를 참조할 수 있습니다.

inputname 함수

spmd 내에서는 inputname을 사용하여 인수 번호에 해당하는 작업 공간 변수 이름을 반환하는 것이 지원되지 않습니다. 그 이유는 spmd 워커는 MATLAB 데스크탑의 작업 공간에 액세스할 수 없기 때문입니다. 이 문제를 해결하려면 다음 예제에 보이는 대로 spmd 전에 inputname을 호출하십시오.

a = 'a';
myFunction(a)

function X = myFunction(a)
name = inputname(1);
spmd
    X.(name) = spmdIndex;
end
X = [X{:}];
end
    

load 함수

출력 구조체에 대입되지 않는 load 명령문은 spmd 문 내에서 지원되지 않습니다. spmd 내에서는 항상 load의 출력값을 구조체에 대입하십시오.

nargin 함수 또는 nargout 함수

다음과 같이 사용하는 경우는 spmd 문 내에서 지원되지 않습니다.

  • 함수 인수 없이 nargin 또는 nargout 사용

  • 현재 실행 중인 함수에 대한 호출의 입력 인수 개수 또는 출력 인수 개수를 확인하기 위해 narginchk 또는 nargoutchk 사용

그 이유는 워커가 MATLAB 데스크탑의 작업 공간에 액세스할 수 없기 때문입니다. 이 문제를 해결하려면 spmd 앞에 다음 함수를 호출하십시오.

myFunction('a','b')

function myFunction(a,b)
nin = nargin;
spmd
    X = spmdIndex*nin;
end
end
    

P 코드 스크립트

spmd 문 내에서 P 코드 스크립트를 호출할 수 있지만 P 코드 스크립트에는 spmd 문을 포함할 수 없습니다. 이 문제를 해결하려면 P 코드 스크립트 대신 P 코드 함수를 사용하십시오.

ans 변수

spmd 문 외부에 정의된 ans 변수에 대한 참조는 spmd 문 내에서는 지원되지 않습니다. spmd 문의 본문 내에서 ans 변수를 사용하기 전에 먼저 할당해야 합니다.

참고 항목

| | | | |

관련 항목