이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

parfor 루프 또는 spmd 문에서 투명성 확보하기

parfor 루프나 spmd 블록의 본문은 투명해야 합니다. 여기서 투명성이란 변수에 대한 모든 참조는 코드 텍스트에서 확인할 수 있어야 한다는 것을 의미합니다.

다음 예제에서 변수 X는 워커로 전송되지 않습니다. 문자형 벡터 'X'eval로 전달되며 X는 루프 본문이나 블록 본문에 입력 변수로 보여지지 않습니다. 그 결과 MATLAB®은 런타임에 오류를 발생시킵니다.

X = 5;
parfor ii = 1:4
    eval('X');
end
X = 5;
spmd
    eval('X');
end

마찬가지로, parfor 또는 spmd 문 내에서 clear를 실행하여 작업 공간에서 변수를 지울 수 없습니다.

parfor ii = 1:4
    <statements...>
    clear('X')  % cannot clear: transparency violation
    <statements...>
end
spmd; clear('X'); end

대신에 변수가 더 이상 필요하지 않을 경우 변수 값을 빈 값으로 설정하여 사용된 메모리를 확보할 수는 있습니다.

parfor ii = 1:4
    <statements...>
    X = [];
    <statements...>
end

spmd 블록의 경우 Composite 객체를 클라이언트 작업 공간에서 지울 수 있습니다.

지정된 워커에 한 변수의 전체가 없을 수도 있기 때문에 일반적으로 투명성에 대한 요구 사항은 변수에 대한 모든 동적 액세스를 제한합니다. 투명한 작업 공간에서 코드에 변수를 명시적으로 지정하지 않을 경우 이러한 변수를 생성, 삭제, 수정, 액세스 또는 쿼리할 수 없습니다.

parfor 루프에서 투명성을 위반하는 기타 동작이나 함수의 예제는 다음과 같습니다.

  • whowhos

  • workspace 인수가 'caller'로 지정된 evalc, evalinassignin

  • saveload(load의 출력값이 변수에 할당되지 않은 경우)

  • 스크립트에서 상위 작업 공간의 변수를 읽어 들이거나 작성하려고 시도할 경우 이 스크립트를 실행하면 투명성 위반을 야기할 수 있습니다. 이 문제를 방지하려면 스크립트를 함수로 변환하고 필요한 변수를 입력 인수나 출력 인수로 사용하여 함수를 호출하십시오.

참고

투명성은 parfor 또는 spmd 구문의 직접 본문에만 적용되며 구문에서 호출되는 함수에는 적용되지 않습니다. saveload의 우회적 해결 방법은 함수 내에 saveload에 대한 호출을 숨기는 것입니다.

MATLAB은 parfor 본문에서 호출되는 함수에 나타나는 evalevalc 문을 성공적으로 실행합니다.

병렬 Simulink 시뮬레이션

parfor 루프를 사용하는 대신 parsim 명령을 사용하여 Simulink® 모델을 병렬로 실행할 수 있습니다. Simulink의 병렬 사용에 대한 자세한 내용과 예제는 Run Multiple Simulations (Simulink) 항목을 참조하십시오.

  • Simulink 모델에 .mat 파일에 포함된 변수에 대해 액세스할 수 있어야 하는 경우 각 워커의 작업 공간에 이러한 파라미터를 불러와야 합니다. 이 작업은 parfor 루프 전, 그리고 parpool을 연 후에 수행해야 합니다. 이 작업을 수행하려면 예제에 나오는 대로 spmd 또는 parfevalOnAll을 사용하면 됩니다.

    spmd 
        evalin('base', 'load(''path/to/file'')') 
    end
    parfevalOnAll(@evalin, 0, 'base', 'load(''path/to/file'')')

  • 모델에 MATLAB 스크립트의 본문에 정의된 변수도 필요한 경우 모든 parfor 반복에서 assignin 또는 evalin을 사용하여 이 변수를 각 워커의 기본 작업 공간으로 이동해야 합니다.

참고 항목

|

관련 항목