parfor 루프 또는 spmd 문에서 투명성 확보하기
R2026bparfor 루프나 spmd 블록의 본문은 투명해야 합니다. 여기서 투명성이란 변수에 대한 모든 참조를 코드 텍스트에서 확인할 수 있어야 한다는 것을 의미합니다. 이 페이지를 통해 parfor 루프 또는 spmd 블록의 본문이 투명하게 유지되도록 하면서 오류를 방지하는 방법을 알아볼 수 있습니다.
팁
MATLAB® 코드 분석기에서 parfor 루프 요구 사항, 지침 또는 제한 사항과 관련된 경고나 오류가 발생하는 경우 MATLAB Copilot 동작을 사용하면 문제를 진단하는 데 도움이 될 수 있습니다. 코드 분석기 메시지에서
버튼을 클릭하여, 코드가 위반한 특정 요구 사항이나 제한 사항을 설명하고 루프를 병렬 실행에 적합하게 만들 수 있는 코드 변경 사항을 제안하도록 Copilot에 요청하십시오. 예제 워크플로는 Resolve Issues in parfor-loops Using MATLAB Copilot 항목을 참조하십시오.
다음 예제에서 변수 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 루프에서 투명성을 위반하는 기타 동작이나 함수의 예제는 다음과 같습니다.
참고
투명성은 parfor 또는 spmd 구문의 직접적인 본문에만 적용되며, 그 본문에서 호출되는 함수에는 적용되지 않습니다. save와 load의 한 가지 우회적 해결 방법은 함수 내에 save와 load에 대한 호출을 숨기는 것입니다. 다른 우회적 해결 방법은 "-fromstruct" 옵션을 사용하여 save를 호출하는 것입니다. 자세한 내용은 parfor 루프에서 변수 저장하기 항목을 참조하십시오.
MATLAB은 parfor 본문에서 호출되는 함수에 나타나는 eval 및 evalc 문을 성공적으로 실행합니다.
병렬 Simulink 시뮬레이션
parfor 루프를 사용하는 대신 parsim 명령을 사용하여 Simulink® 모델을 병렬로 실행할 수 있습니다. Simulink의 병렬 사용에 대한 자세한 내용과 예제는 Running Multiple Simulations in Simulink (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을 사용하여 해당 변수를 각 워커의 기본 작업 공간으로 이동해야 합니다.