기술 칼럼

MathWorks 인사이트

Simulink에서의 시뮬레이션 성능 개선


저자:

  • Weiwu Li, MathWorks
  • Reid Spence, MathWorks
  • Guy Rouleau, MathWorks

읽는 시간: 22분

모델의 복잡도와 관계없이 모든 Simulink® 사용자는 시뮬레이션 성능을 개선하고자 합니다. 이 칼럼에서는 시뮬레이션 워크플로에서 최고의 성능을 끌어내는 데 도움이 되는 다양한 실용적인 팁과 기법을 소개합니다. 

시뮬레이션 성능 개선을 위한 첫 단계

먼저 시뮬레이션 워크플로를 살펴보고 모델이 편집, 초기화, 시뮬레이션 단계를 몇 번 실행해야 하는지 파악해야 합니다. 예를 들어, 다음 네 가지 일반적인 워크플로는 서로 특성이 매우 다릅니다. 성능을 위한 최적의 시뮬레이션 모드와 옵션은 이 네 가지 워크플로 중 어떤 것을 사용하는지에 따라 달라집니다.

첫 번째 워크플로는 편집-업데이트-반복입니다. (그림 1) 일반적으로 모델이 제대로 업데이트되는지 확인하기 위해 Ctrl+D를 누르지만 아직 시뮬레이션을 통해 검증할 단계는 아닌 경우 이 워크플로를 사용하며, 모델을 대폭 수정할 때 주로 사용하게 됩니다.

시뮬레이션의 편집-업데이트-반복 워크플로를 보여주는 다이어그램.

그림 1. 편집-업데이트-반복 워크플로.

두 번째 워크플로는 편집-시뮬레이션-반복 워크플로로, 매번 구조를 편집하고 모델을 초기화해야 합니다. (그림 2)

시뮬레이션의 편집-시뮬레이션-반복 워크플로를 보여주는 다이어그램.

그림 2. 편집-시뮬레이션-반복 워크플로

세 번째 워크플로는 조정-시뮬레이션-반복입니다. (그림 3) 이 워크플로에서는 모델 구조를 수정하지 않고, 일부 파라미터를 반복적으로 조정하면서 시뮬레이션을 실행합니다.

시뮬레이션의 조정-시뮬레이션-반복 워크플로를 보여주는 다이어그램.

그림 3. 조정-시뮬레이션-반복 워크플로.

네 번째 워크플로는 다중 시뮬레이션 워크플로입니다. (그림 4) 이 워크플로는 일반적으로 검증된 모델로 많은 시뮬레이션을 수행하며, 이때 실행을 다른 곳으로 분산하면 도움이 됩니다.

시뮬레이션의 다중 시뮬레이션 워크플로를 보여주는 다이어그램.

그림 4. 다중 시뮬레이션 워크플로.

성능 향상 방법을 선택할 때 고려해야 할 또 다른 요소는 시뮬레이션의 어느 단계가 전체 계산 시간에서 가장 큰 비중을 차지하는지입니다. Simulink.SimulationOutput 객체에서 반환되는 SimulationMetadata 객체의 타이밍 정보를 사용하면 전체 시간 중 초기화 또는 실행이 차지하는 비율을 확인할 수 있습니다. 예를 들어 아래 예에서는 이 모델의 전체 시뮬레이션 시간 중 실행 시간이 대부분을 차지하므로, 초기화 시간을 단축하는 방법보다는 모델 실행 속도를 높이는 성능 향상 방법에 중점을 두어야 합니다.

가장 자주 사용하는 워크플로의 모델에 대한 시뮬레이션 메타데이터를 살펴보면 시뮬레이션의 특성을 더 깊이 이해할 수 있습니다. SimulationMetadata 객체에는 모델 정보, 타이밍 정보, 실행 정보 등 시뮬레이션 실행에 대한 정보가 포함되어 있습니다. out.SimulationMetadata.TimingInfo 속성에 액세스하여 타이밍 정보를 가져올 수 있습니다. 시뮬레이션 메타데이터의 타이밍 정보는 다음과 같습니다. 

 WallClockTimestampStart: '2021-12-16 10:57:15'
 WallClockTimestampStop: '2021-12-16 10:58:44'
 InitializationElapsedWallTime: 0.6918
 ExecutionElapsedWallTime: 87.8463
 TerminationElapsedWallTime: 0.4087
 TotalElapsedWallTime: 88.9468
 ProfilerData: 'Profiler is not enabled'

사용 중인 시뮬레이션 워크플로와 모델 특성(초기화 시간과 실행 시간 등)에 따라 아래 표 1을 빠르게 참조하여 적합한 기법을 선택하고 적용해 볼 수 있습니다.

기법 워크플로
편집-업데이트-반복 편집-시뮬레이션-반복 조정-시뮬레이션-반복 다중 시뮬레이션
시뮬레이션 모드   x x x
빠른 재시작     x x
시뮬레이션 캐시 x x x x
모델 참조 -
병렬 빌드
x x    
모델 참조 -
점진적 로딩 및
재빌드
x x    
Simulink 프로파일러 x x x x
솔버 프로파일러   x x x
모델 수정   x x x
병렬 시뮬레이션       x

표 1. 시뮬레이션 성능을 개선하는 일반적인 기법.

올바른 시뮬레이션 모드 선택

Simulink는 표준, 액셀러레이터, 고속 액셀러레이터의 세 가지 시뮬레이션 모드를 제공합니다. (그림 5) 이름에서 알 수 있듯이 일반적으로 액셀러레이터 모드는 표준 모드보다 빠르고, 고속 액셀러레이터 모드는 그보다 더 빠릅니다. 속도가 높아질수록 일반적으로 유연성, 상호작용성 및/또는 진단 기능을 희생해야 합니다. 많은 경우 이러한 기능 중 하나가 적어도 일시적으로라도 필요하지 않다면 시뮬레이션 속도를 높일 수 있습니다.

시뮬레이션 모드 옵션(표준, 액셀러레이터, 고속 액셀러레이터)의 화면 캡처.

그림 5. Simulink 시뮬레이션 모드.

표준 모드에서는 Simulink가 시뮬레이션을 실행할 때마다 모델을 해석합니다. 모델을 자주 변경하는 경우 일반적으로 이 모드를 사용하는 것이 좋습니다. 액셀러레이터 모드나 고속 액셀러레이터 모드와 달리 별도의 컴파일 단계가 필요하지 않기 때문입니다.

액셀러레이터 모드에서는 Simulink가 모델을 메모리 내 실행 엔진으로 컴파일하여 표준 모드의 인터프리터 시뮬레이션에서 발생하는 블록 간 오버헤드를 없앱니다. 액셀러레이터 모드는 디버거와 프로파일러를 지원하지만 런타임 진단은 일부만 지원합니다. 액셀러레이터 모드는 시뮬레이션 시간이 컴파일 시간보다 훨씬 긴 경우에 자주 사용됩니다.

고속 액셀러레이터 모드에서는 Simulink가 모델에 대한 독립 실행형 실행 파일을 컴파일하며, 이 파일은 별도의 프로세스에서 실행될 수 있습니다. 고속 액셀러레이터 모드는 전체 모델에서 코드를 생성할 수 있는 경우에만 사용할 수 있습니다. 이 모드에서는 시뮬레이션 중에 모델과의 상호작용이 제한됩니다. 예를 들어, 고속 액셀러레이터 모드는 디버깅을 지원하지 않습니다. 액셀러레이터 모드와 마찬가지로 고속 액셀러레이터 모드도 시뮬레이션이 1회성 컴파일보다 훨씬 오래 걸릴 때 사용하는 것이 가장 좋습니다.

워크플로에 맞는 모드가 무엇인지 궁금하실 수 있습니다. 그림 6은 가상 모델 시뮬레이션의 표준, 액셀러레이터, 고속 액셀러레이터 모드에서의 성능을 보여줍니다.

가상 모델에서 표준, 액셀러레이터, 고속 액셀러레이터 시뮬레이션 모드의 성능을 보여주는 그래프.

그림 6. 서로 다른 시뮬레이션 모드에서 시뮬레이션한 가상 모델의 성능.

일반적으로 모델을 자주 수정하고 수정 사이에 다이어그램 업데이트 또는 짧은 시뮬레이션을 실행하는 “개발” 워크플로에서는 표준 모드를 권장합니다. 반대로 블록 추가나 제거와 같이 모델의 구조를 변경하지 않고 여러 시뮬레이션을 실행하려는 경우에는 고속 액셀러레이터 모드를 사용하십시오.

실행 간에 모델이 변경되지 않는다는 것을 알고 있다면 RapidAcceleratorUpToDateCheck를 “off”로 설정하여 Simulink가 고속 액셀러레이터 초기화를 건너뛰도록 할 수 있습니다. 이 경우 조정 불가능한 파라미터의 변경 사항은 무시된다는 점에 유의하십시오. 모델이 고속 액셀러레이터 모드를 사용할 수 없는 제약 사항에 해당하는 경우 대신 액셀러레이터 모드를 사용하십시오.

가속 모드의 작동 방식, 시뮬레이션 모드 선택, 액셀러레이터 모드가 재빌드되는 이유, 성능 비교에 대해 자세히 알아보십시오.

일부 모델에서 액셀러레이터 모드의 효과가 더 큰 경우

일부 모델이 다른 모델보다 액셀러레이터 모드나 고속 액셀러레이터 모드의 이점을 더 많이 얻는다는 것을 알게 될 수도 있습니다. 모델의 성능이 크게 개선되지 않는다면 다음과 같은 상황일 수 있습니다.

Fast Fourier Transform 블록이나 룩업 테이블과 같은 몇 개의 복잡한 블록에 모델의 알고리즘이 주로 포함되어 있을 수 있습니다. 기본 블록은 고도로 최적화되어 있으므로 작은 모델은 액셀러레이터 모드에서 오히려 더 느리게 실행될 수 있습니다. 반면에 기본 블록이 많은 모델은 가속의 이점을 얻을 가능성이 더 높습니다.

모델이 주로 컴파일된 코드로 구성된 경우: 예를 들어 S-Function, Stateflow® 블록, MATLAB® 함수의 코드가 있습니다. 컴파일 단계를 사용해도 모델 속도가 더 빨라지지 않습니다.

시뮬레이션 실행에 초기화 또는 종료 단계가 포함된 경우. 액셀러레이터 모드는 각 실행의 시뮬레이션 단계에서만 작동하므로 초기화나 종료 단계에 시간이 많이 걸리는 경우에는 큰 개선 효과를 얻지 못할 수 있습니다. 자세한 내용은 이 칼럼의 초기화 단계 가속화 섹션을 참조하십시오.

모델에 컴파일할 수 없는 블록이 포함된 경우: 예를 들어 Interpreted MATLAB Function 블록이나 인터프리터 모드의 MATLAB System Object 등이 있습니다.

반복 시뮬레이션을 위한 빠른 재시작 활성화

일반적인 Simulink 시뮬레이션 워크플로에서 실행 버튼을 누르면 Simulink는 먼저 모델을 업데이트하고 컴파일한 다음 시뮬레이션합니다. 이후 실행에서도 이 과정이 반복됩니다. 그러나 반복 시뮬레이션에서 모델 입력이나 조정 가능한 파라미터만 변경하면 되는 경우에는 일반적으로 모델 구조를 편집할 필요가 없습니다. 이러한 워크플로에서는 첫 번째 실행 이후의 초기화 단계가 대개 불필요하며, 수백 또는 수천 번의 시뮬레이션을 실행하면 이 시간이 빠르게 누적됩니다.

Simulink는 빠른 재시작이라는 유용한 기능을 제공합니다. 이름에서 알 수 있듯이 이 기능을 사용하면 모델을 한 번만 컴파일하여 반복 시뮬레이션을 실행할 수 있습니다. (그림 7)

Simulink의 빠른 재시작 기능 화면 캡처.

그림 7. Simulink에서 빠른 재시작 활성화.

빠른 재시작을 켜면 각 실행 후에 모델이 자동으로 종료되지 않습니다. 대신 저장된 초기화 정보를 사용하여 다시 컴파일하지 않고 다음 시뮬레이션을 위해 모델이 자동으로 다시 초기화됩니다.  

빠른 재시작을 사용하는 동안에는 모델이 잠기므로 모델 구조를 편집할 수 없습니다. 따라서 시뮬레이션이 완료될 때까지 모델의 구조를 변경할 수 없습니다. 그러나 조정 가능한 파라미터나 입력 신호는 계속 변경할 수 있으며, 그 변경이 시뮬레이션에 미치는 영향도 확인할 수 있습니다.

빠른 재시작은 위와 같이 툴스트립에서 켤 수 있으며, sim 및 parsim 함수를 사용하는 프로그래밍 방식의 시뮬레이션에서도 켤 수 있습니다.

시뮬레이션 동작점 사용

엔지니어는 일반적으로 다양한 입력, 경계 조건, 동작 조건에 대해 Simulink 모델을 반복적으로 시뮬레이션합니다. 대부분의 경우 이러한 시뮬레이션에는 모델이 초기 상태에서 다른 상태로 전환되는 공통의 시작 단계가 있습니다. 예를 들어 전기 모터는 다양한 제어 시퀀스를 테스트하기 전에 일정 속도까지 가속될 수 있습니다.

시뮬레이션 동작점을 사용하면 시작 단계가 끝날 때 시뮬레이션 스냅샷을 저장한 다음 이를 복원하여 이후 시뮬레이션의 초기 상태로 사용할 수 있습니다. 이 기법은 시뮬레이션 속도 자체를 향상시키지는 않지만, 시작 단계를 한 번만 시뮬레이션하면 되므로 연속 실행 시 전체 시뮬레이션 시간을 줄일 수 있습니다. (아래 그림 8 참조)

빠른 재시작과 동작점 복원이 전체 시뮬레이션 시간을 줄이는 방법을 보여주는 그림.

그림 8. 빠른 재시작 및 동작점 복원 사용.

동작점 동작에 대해 자세히 알아보십시오.  

여러 시뮬레이션을 병렬로 실행

Simulink와 Parallel Computing Toolbox™를 사용하여 시뮬레이션 작업을 여러 처리 코어에 분산하면 여러 개의 독립적인 시뮬레이션을 실행하는 데 걸리는 전체 시간을 줄일 수 있습니다. 시뮬레이션을 클러스터와 클라우드로 확장할 수 있는 MATLAB Parallel Server™를 사용하면 전체 시뮬레이션 시간을 더욱 줄일 수 있습니다.

시뮬레이션을 병렬로 실행하는 일반적인 활용 사례로는 몬테카를로 분석, 설계 최적화, 테스트 케이스 스윕이 있습니다. 예를 들어, 미리 정해진 범위에서 파라미터 값을 변경하는 몬테카를로 시뮬레이션을 설정할 수 있습니다. 그런 다음 각 파라미터 값에 대한 시뮬레이션을 여러 코어에서 독립적으로 병렬 수행할 수 있습니다.

테스트 데이터로 모델 파라미터 추정, 원하는 응답을 얻기 위한 제어기 이득 조정, 설계 파라미터 최적화, 민감도 분석, 강인성 분석 수행 등 설계 최적화와 관련된 여러 작업을 병렬화할 수 있습니다. 사용하는 프로세서 수가 늘어날수록 전체 시뮬레이션 시간이 줄어듭니다.

일반적으로 병렬 다중 시뮬레이션 실행을 설정하는 방법에는 두 가지가 있습니다. 다중 시뮬레이션 패널을 사용하거나 parsim 함수를 호출하는 스크립트를 사용하는 것입니다. Simulink 편집기의 다중 시뮬레이션 패널에서 시뮬레이션을 직접 설정하고 실행할 수 있습니다. (그림 9 참조) 다중 시뮬레이션 패널에서는 시뮬레이션에 사용할 블록 파라미터와 작업 공간 변수의 값을 지정할 수 있습니다. “병렬 연산” 옵션을 선택하면 시뮬레이션의 병렬 실행을 자동으로 활성화할 수 있습니다.

Simulink 편집기의 다중 시뮬레이션 패널 화면 캡처.

그림 9. 다중 시뮬레이션 패널을 사용하여 병렬 시뮬레이션 시작.

MATLAB 스크립트에서 parsim 구문을 사용하여 병렬 시뮬레이션을 시작할 수도 있습니다. 다중 시뮬레이션 패널을 사용하는 것보다 parsim 스크립트를 사용하면 더 많은 유연성과 고급 옵션을 활용할 수 있습니다.  

다중 시뮬레이션 패널로 시뮬레이션을 구성하고 실행하는 방법에 대해 자세히 알아보십시오.

병렬 시뮬레이션 실행, parsim 명령, 고속 액셀러레이터 시뮬레이션에서 parsim 사용에 대해 자세히 알아보십시오.

모델 참조를 사용하면 Model 블록을 사용하여 한 모델을 다른 모델에 포함할 수 있습니다. 이러한 각 인스턴스를 모델 참조라고 합니다. 서브시스템과 마찬가지로 모델 참조를 사용하면 대규모 모델 계층 구조를 구성할 수 있습니다. (그림 10) 

모델 참조 재빌드 옵션 화면 캡처.

그림 10. 모델 참조 재빌드 옵션. 

모델 참조를 사용하면 성능 면에서 다음과 같은 다양한 이점이 있습니다.

  • 점진적 로딩. 참조 모델은 필요할 때만 로드됩니다.
  • 가속 시뮬레이션. 모델 참조를 사용하면 시뮬레이션의 여러 부분을 서로 다른 모델 파일에 저장할 수 있습니다. 시뮬레이션의 많은 부분이 변경되지 않는다면 그 부분을 액셀러레이터 모드의 참조 모델 안에 배치할 수 있습니다. 이 부분은 처음에 한 번만 컴파일되며, 이후 실행에서는 더 빠르게 초기화되고 시뮬레이션됩니다.
  • 증분 재빌드. 모델 참조 재빌드 옵션을 “알려진 종속성의 변경 사항이 감지된 경우”로 선택하면 이러한 참조 모델을 구현하는 시뮬레이션 타겟은 시뮬레이션을 실행할 때마다 생성되지 않고, 참조 모델이나 해당 모델의 종속성 또는 인터페이스가 변경된 경우에만 다시 생성됩니다. 이 옵션은 모델 체크섬을 계산하는 단계를 건너뛰므로 “변경 사항이 감지된 경우” 옵션을 선택했을 때보다 빠릅니다. 시뮬레이션 중에 모델 구조가 변경되지 않는다는 것이 확실하다면 재빌드 옵션을 “안 함”으로 설정하여 프로세스를 더욱 가속화할 수 있습니다.
  • 병렬 빌드. 대규모 모델 참조 계층 구조가 포함된 모델의 경우 참조 모델을 병렬로 빌드하여 코드 생성 및 컴파일 시간을 줄일 수 있습니다. Parallel Computing Toolbox 또는 MATLAB Parallel Server를 사용하면 코드 생성 및 컴파일 작업을 구성에 포함된 여러 MATLAB 워커에 분산할 수 있습니다.

모델 참조는 일반적으로 팀 환경에서 사용되며, 이 경우 다른 사람이 빌드한 컴포넌트를 기반으로 시뮬레이션을 실행할 수 있습니다. Simulink는 이러한 빌드 아티팩트를 계층 구조의 각 모델에 대해 .SLXC 확장자를 가진 단일 Simulink 캐시 파일로 패키징할 수 있습니다. (그림 11)

Simulink .slxc 캐시 파일이 강조 표시된 화면 캡처.

그림 11. Simulink 캐시 파일.

Simulink 캐시 파일을 사용하면 Rebuild 구성 파라미터가 “변경 사항이 감지된 경우 (디폴트)” 또는 “알려진 종속성의 변경 사항이 감지된 경우”로 설정되어 있는 한 Simulink는 최신 상태가 아닌 파일만 빌드합니다. 사용자와 팀원은 이러한 SLXC 파일과 해당 Simulink 모델 파일을 서로 공유할 수 있습니다.

사용자의 컴퓨터에서 시뮬레이션을 실행하면 Simulink가 각 모델의 SLXC 파일에서 필요한 파생 파일을 추출합니다. 그 결과 Simulink는 불필요한 재빌드를 수행하지 않고 시뮬레이션을 더 빠르게 완료합니다.

또한 Simulink 캐시 파일은 모델 참조 시뮬레이션 타겟이 아닐 수도 있는 여러 유형의 빌드 아티팩트(예: 고속 액셀러레이터 타겟)에도 적용됩니다. 이러한 Simulink 캐시 파일을 공유하면 팀 기반 워크플로에서 재빌드 비용을 크게 줄일 수 있습니다.

모델 참조에 대해 자세히 알아보십시오.

Simulink 캐시 파일에 대해 자세히 알아보십시오.

모델의 시뮬레이션 병목 지점 분석

Simulink에는 모델을 체계적으로 이해하고, 시뮬레이션 성능의 병목 지점을 파악하고, 시뮬레이션 속도를 개선하는 데 도움이 되는 기본 제공 기능이 있습니다.

성능 어드바이저

성능 어드바이저는 디버그 탭에서 Simulink 프로파일러 및 솔버 프로파일러와 함께 시작할 수 있습니다. (그림 12)

성능 어드바이저 옵션이 강조 표시된 Simulink 디버그 탭 화면 캡처.

그림 12. 성능 어드바이저 시작.

성능 어드바이저는 모델을 분석하고, 비효율적인 시뮬레이션 성능을 유발할 수 있는 조건과 구성 설정에 대해 다양한 검사를 실행합니다. 성능 어드바이저는 더 나은 모델 구성 설정을 권장하며, 문제를 자동 또는 수동으로 해결하는 방법도 제공합니다.

권장 변경 사항을 모델에 적용하면 성능 어드바이저를 통해 성능이 얼마나 개선되었는지 확인할 수 있습니다. (그림 13) 

Simulink 성능 어드바이저 설정 화면 캡처.

그림 13. Simulink 성능 어드바이저.

성능 어드바이저에 대해 자세히 알아보십시오.

Simulink 프로파일러

Simulink에서는 두 가지 유형의 프로파일러를 사용하여 시뮬레이션이 느린 모델을 프로파일링할 수 있습니다. 어떤 프로파일러를 사용해야 할지 확실하지 않다면 그림 14를 참조하여 빠르게 시작해 보십시오. Simulink 프로파일러는 어떤 블록이 시뮬레이션 시간을 가장 많이 차지하는지 파악하는 데 사용되며, 솔버 프로파일러는 가변 스텝 솔버가 특정 스텝을 사용하는 이유를 분석합니다.

Simulink 프로파일러 또는 솔버 프로파일러를 사용하여 느린 시뮬레이션을 평가하기 위한 결정 트리.

그림 14. Simulink 프로파일러 및 솔버 프로파일러 사용.

Simulink 프로파일러를 사용하면 시뮬레이션의 각 단계에 걸리는 시간과 각 블록을 시뮬레이션하는 데 걸리는 시간을 정량화할 수 있습니다. Simulink 프로파일러는 각 블록의 시간 비용을 검토할 수 있도록 설계 단계에서 표준 모드와 함께 사용되는 경우가 많습니다. Simulink 프로파일러를 사용하면 매우 많은 데이터가 생성될 수 있습니다. 검토해야 할 데이터의 양을 최소화하려면 시간이 가장 많이 걸리는 메서드와 가장 자주 호출되는 메서드에 집중하십시오.

Simulink 프로파일러는 시뮬레이션 속도 저하의 원인을 찾아내므로 시뮬레이션 실행 시간의 성능을 직접 평가할 수 있습니다. 또한 계산량이 가장 많은 블록을 가벼운 블록으로 교체하여 시뮬레이션을 가속화할 수도 있습니다. (그림 15)

자동 변속기 시스템 모델에 Simulink 프로파일러를 적용한 화면 캡처.

그림 15. Simulink 프로파일러.

Simulink 프로파일러에 대해 자세히 알아보십시오.

솔버 프로파일러

가변 스텝 솔버를 사용하는 모델의 시뮬레이션이 느려지거나, 너무 많은 작은 스텝을 사용하거나, 응답하지 않는 경우 솔버 프로파일러를 사용하면 솔버의 동작을 이해하고 시뮬레이션에 영향을 미치는 요인을 파악할 수 있습니다.

여러 요인이 솔버 동작에 영향을 미치고 시뮬레이션 속도를 제한할 수 있습니다. 솔버 프로파일러는 모델을 시뮬레이션할 때 발생하는 모든 주요 이벤트를 기록하고 보고합니다.

  • 영점교차 이벤트
  • 솔버 예외 이벤트
  • 솔버 재설정 이벤트
  • 야코비 행렬 계산 이벤트

모델에 Simscape™ 블록이 포함된 경우 Simscape 결과 탐색기를 사용하여 이러한 블록의 다양한 물리량도 살펴볼 수 있습니다.

솔버 프로파일러는 시뮬레이션, 솔버 설정, 이벤트, 오류에 대한 그래픽 정보와 통계 정보를 제공합니다. 이 데이터를 사용하여 시뮬레이션 병목을 유발한 모델의 위치를 파악하고, 시뮬레이션 성능 향상을 위해 시스템의 강성을 업데이트하는 등의 조치를 취할 수 있습니다.  

솔버 프로파일러는 일반적으로 가변 스텝 솔버와 함께 사용되며, 시뮬레이션이 너무 많은 스텝을 사용하는 이유나 스텝이 매우 작은 이유를 설명하는 데 도움이 됩니다. 반면에 각 시뮬레이션 스텝을 완료하는 데 너무 오래 걸리는 이유에 초점을 맞추거나 고정 스텝 솔버를 사용하는 경우에는 앞 섹션에서 설명한 Simulink 프로파일러가 적합한 도구입니다. (그림 16)

시뮬레이션에 대한 그래픽 정보와 통계 정보를 보여주는 솔버 프로파일러 화면 캡처.

그림 16. 솔버 프로파일러.

솔버 프로파일러, 영점교차 검출, 솔버 재설정에 대해 자세히 알아보십시오.

모델 수정 및 단순화

지금까지 설명한 기법은 대부분 모델 자체를 거의 또는 전혀 변경할 필요가 없습니다. 모델 수정이 수반되는 기법을 적용하면 성능을 추가로 개선할 수 있습니다.

초기화 단계 가속화

모델을 업데이트하거나 열면 Simulink는 마스크 초기화 코드를 실행합니다. set_param을 여러 번 호출하는 복잡한 마스크 초기화 명령이 있다면 연속된 set_param() 호출을 여러 인수 쌍을 사용하는 단일 호출로 통합하는 것을 고려해 보십시오. 이렇게 하면 이러한 호출에 따르는 오버헤드를 줄일 수 있습니다.

마스크 코드 실행에 대해 자세히 알아보십시오.

MATLAB 스크립트를 사용하여 데이터를 로드하고 초기화하는 경우, 대신 MAT 파일을 로드하면 성능이 향상되는 경우가 많습니다. 단점은 MAT 파일의 데이터는 사람이 읽을 수 있는 형식이 아니므로 스크립트보다 다루기 어려울 수 있다는 것입니다. 그러나 로드 방식은 일반적으로 동등한 스크립트보다 데이터를 훨씬 빠르게 초기화합니다.

MAT 파일의 데이터를 작업 공간으로 로드하는 방법에 대해 자세히 알아보십시오.

모델 복잡도 줄이기

충실도를 희생하지 않고 모델을 단순화하는 것은 시뮬레이션 성능을 개선하는 효과적인 방법입니다. 다음은 모델 복잡도를 줄이는 세 가지 방법입니다.

서브시스템을 충실도가 낮은 대안으로 교체. 대부분의 경우 복잡한 서브시스템 모델을 다음 중 하나로 교체하여 모델을 단순화할 수 있습니다.

  • System Identification Toolbox™를 사용하여 측정된 입출력 데이터로 만든 선형 또는 비선형 동적 모델
  • Model-Based Calibration Toolbox™를 사용하여 만든 충실도 높은 비선형 통계 모델
  • Simulink Control Design™을 사용하여 만든 선형 모델
  • 룩업 테이블

라이브러리에서 서브시스템의 두 가지 표현을 모두 유지하고, Variant 서브시스템을 사용하여 이를 관리할 수 있습니다.

구성 가능한 서브시스템 블록 사용에 대해 자세히 알아보십시오.

룩업 테이블 사용, 룩업 테이블의 절점 간격 최적화, 룩업 테이블 블록용 생성 코드 최적화에 대해 자세히 알아보십시오.

차수 축소 모델링에 대해 자세히 알아보십시오.

블록 수 줄이기. 모델의 블록 수를 줄이면 시뮬레이션 중에 업데이트해야 하는 블록이 줄어들어 시뮬레이션 실행 속도가 빨라집니다. 벡터화는 블록 수를 줄이는 한 가지 방법입니다. 예를 들어, 비슷한 계산 과정을 거치는 병렬 신호가 여러 개 있다면 이를 하나의 벡터로 결합하여 한 번에 계산해 보십시오. 또 다른 방법은 구성 파라미터의 최적화 > 일반 섹션에서 블록 축소 최적화를 활성화하는 것입니다.

프레임 기반 처리 사용. 프레임 기반 처리에서는 샘플을 한 번에 하나씩 처리하는 대신 일괄 처리합니다. 예를 들어 모델에 아날로그-디지털 컨버터가 포함된 경우 출력 샘플을 버퍼에 수집한 다음 고속 푸리에 변환과 같은 단일 연산으로 버퍼를 처리할 수 있습니다. 이와 같이 데이터를 청크 단위로 처리하면 모델의 블록을 호출해야 하는 횟수가 줄어듭니다. 일반적으로 프레임 크기가 커질수록 스케줄링 오버헤드가 줄어듭니다. 그러나 프레임이 클수록 더 많은 메모리를 사용하며, 메모리 제한은 복잡한 모델의 성능에 부정적인 영향을 줄 수 있습니다. 다양한 프레임 크기로 실험하여 메모리 문제를 일으키지 않으면서 프레임 기반 처리의 성능 이점을 극대화하는 크기를 찾아보십시오.

상호작용성 줄이기

일반적으로 모델의 상호작용성이 높을수록 시뮬레이션에 시간이 더 오래 걸립니다. 이 섹션의 팁은 상호작용성을 일부 포기하여 성능을 개선하는 방법을 보여줍니다.

디버깅 진단 비활성화. 일부 진단 기능을 활성화하면 시뮬레이션이 눈에 띄게 느려집니다. 구성 파라미터 대화 상자의 진단 창에서 이러한 기능을 비활성화할 수 있습니다.

참고: 배열 경계를 초과함 및 솔버 데이터 불일치 진단을 실행하면 모델의 런타임 성능이 눈에 띄게 저하될 수 있습니다.

시뮬레이션 애니메이션 비활성화. 기본적으로 Stateflow 차트는 모델이 실행되는 동안 현재 활성 상태를 강조 표시하고 발생하는 상태 전환을 애니메이션으로 보여줍니다. 이 기능은 디버깅에 유용하지만 시뮬레이션 속도를 떨어뜨립니다. 시뮬레이션을 가속화하려면 Stateflow 차트를 모두 닫거나 애니메이션을 비활성화하십시오. 마찬가지로 Simulink 3D Animation™, SimMechanics™ 시각화, FlightGear 또는 기타 3D 애니메이션 패키지를 사용하는 경우, 애니메이션을 비활성화하거나 장면 충실도를 낮추어 성능을 개선하는 것을 고려해 보십시오.

Stateflow에서 시뮬레이션 속도를 높이는 방법에 대해 자세히 알아보십시오.

뷰어별 파라미터를 조정하고 Enabled Subsystem을 통해 뷰어 관리. 모델에 많은 수의 데이터 점을 표시하는 스코프 뷰어가 있고 스코프를 제거할 수 없다면 뷰어 파라미터를 조정하여 충실도를 낮추고 렌더링 속도를 높여 보십시오. 그러나 데시메이션을 사용하여 플로팅되는 데이터 점의 수를 줄이면 더 많은 데이터 점에서는 분명하게 드러날 짧은 과도 현상이나 기타 현상을 놓칠 위험이 있다는 점에 유의하십시오. Enabled Subsystem에 뷰어를 배치하면 어떤 시각화를 언제 활성화할지 더 정밀하게 제어할 수 있습니다.

스코프 신호 뷰어 파라미터 설정이 성능에 미치는 영향에 대해 자세히 알아보십시오.

Interpreted MATLAB Function 블록 대신 MATLAB 함수 사용

Simulink 모델 내에서 MATLAB 함수를 호출하려면 Interpreted MATLAB Function 블록이나 MATLAB S-function 대신 MATLAB Function 블록을 사용하십시오. MATLAB Function 블록이 더 빠른 대안입니다. 이 블록은 임베디드 가능한 C 코드 생성을 지원합니다. MATLAB Function 블록이 모든 MATLAB 함수를 지원하는 것은 아니지만, 지원하는 MATLAB 언어의 하위 집합은 광범위합니다.

모델의 Interpreted MATLAB Function 블록을 모두 빠르게 찾으려면 성능 어드바이저를 사용하십시오.

MATLAB Function 블록 사용에 대해 자세히 알아보십시오.

대규모 데이터셋을 기록하는 경우. 대량의 데이터를 기록하는 경우(예: To Workspace, To File 또는 Scope 블록이 포함된 모델), 데시메이션을 사용하거나 기록되는 출력을 시뮬레이션의 마지막 부분으로 제한하십시오. 중복 데이터(예: 시간은 한 번만 기록)와 불필요한 데이터(예: 가능하면 double형 대신 정수 값 기록)를 기록하지 마십시오. 기록 재정의를 사용하면 액셀러레이터 모드의 시뮬레이션 타겟을 다시 빌드하지 않고도 기록할 신호를 제어할 수 있습니다.

시뮬레이션 데이터 내보내기에 대해 자세히 알아보십시오.

기타 유용한 기법

다음 기법은 일부 특정 모델에 적용됩니다. 모델이 아래에 설명된 패턴에 해당한다면 이 기법을 사용하여 시뮬레이션 속도를 높일 수 있습니다.

하드웨어 가속 최적화

SIMD(단일 명령 복수 데이터)는 여러 데이터 점에 대해 동일한 연산을 동시에 수행하는 데이터 수준의 병렬 처리 기법입니다. 최신 CPU 중 상당수는 여러 개의 덧셈이나 곱셈을 한 번에 수행하는 등의 SIMD 명령을 갖추고 있습니다. 지원되는 블록에서 계산량이 많은 연산을 수행할 때 SIMD 내장 함수를 사용하면 시뮬레이션 성능을 개선할 수 있습니다.

Simulink는 코드 생성 기술을 사용하는 모든 시뮬레이션 모드(예: 액셀러레이터 모드 또는 고속 액셀러레이터 모드)에서 하드웨어 가속을 위해 SIMD를 지원합니다.

Simulink는 Simulation Target 패널에서 SIMD 유형을 제어하는 configset 파라미터를 제공합니다. 하드웨어 가속 옵션의 경우 기본 선택 항목(“범용 하드웨어 활용”)은 모든 X86 CPU에서 사용할 수 있으며 재빌드가 필요하지 않습니다. 다른 선택 항목(“네이티브 하드웨어 활용”)은 CPU에 따라 달라집니다. CPU가 SSE2/AVX2/AVX512와 같은 최신 SIMD 명령어 세트를 지원한다면 이 옵션을 선택하여 시뮬레이션 속도를 더욱 높일 수 있습니다. (그림 17)

Simulink의 하드웨어 가속 옵션 화면 캡처.

그림 17. 하드웨어 가속 옵션 구성. 

시뮬레이션 타겟을 사용할 때 SIMD를 사용할 수 있는지, 또는 SIMD가 시뮬레이션 속도를 개선할 수 있는지는 여러 요인에 따라 결정됩니다. 앞서 설명한 성능 어드바이저를 사용하여 시뮬레이션 타겟 아래의 “하드웨어 가속 설정 검사”를 실행하면 SIMD가 특정 모델에 도움이 되는지 확인할 수 있습니다.  

하드웨어 가속에 대해 자세히 알아보십시오.

멀티코어 시뮬레이션 활용

Simulink에는 모델의 일부를 멀티코어에서 실행하도록 분배하여 단일 시뮬레이션을 가속화하는 여러 가지 기법이 있습니다. 이러한 기법은 모든 모델에 적용되지는 않지만 특정 활용 사례에서는 유용할 수 있습니다.

데이터 흐름 도메인의 멀티코어 시뮬레이션. Simulink에서 계산량이 많은 신호 처리 시스템이나 멀티레이트 신호 처리 시스템을 모델링하고 시뮬레이션하는 경우 데이터 흐름 도메인을 사용하면 성능이 향상됩니다. 데이터 흐름 도메인은 동기 데이터 흐름 계산 모델을 사용하여 시뮬레이션하는 새로운 실행 도메인입니다. 데이터 흐름 실행 도메인은 데이터 기반으로 작동하며 여러 코어를 사용하여 시뮬레이션할 수 있습니다.

속성 인스펙터에서 Domain 파라미터를 Dataflow로 설정하면 서브시스템의 실행 도메인을 데이터 흐름으로 지정할 수 있습니다. 데이터 흐름 도메인은 모델을 자동으로 분할하고 여러 스레드를 사용하여 시스템을 시뮬레이션하므로 시뮬레이션 성능이 향상됩니다. (그림 18)

속성 인스펙터에서 데이터 흐름을 실행 도메인으로 지정하는 화면 캡처.

그림 18. 데이터 흐름 실행 도메인.

멀티코어 탭의 분석 실행 버튼을 사용하여 시뮬레이션 성능을 위해 데이터 흐름 도메인을 분석할 수 있습니다. 이 분석은 모델을 프로파일링하고, 각 블록의 실행 시간을 계산하고, 모델에 존재하는 병렬성을 찾아 여러 스레드로 분할할 수 있습니다. 또한 블록 실행을 파이프라인 처리하여 시뮬레이션 처리량을 더욱 높일 수 있도록 지연 시간 값을 제안할 수 있습니다. 아래 그림 19의 분석 결과는 최상의 성능을 위해 지연 시간을 0에서 2 사이로 설정해야 한다고 제안합니다. 

시뮬레이션 성능을 위한 데이터 흐름 도메인 분석 화면 캡처.

그림 19. 시뮬레이션 성능을 위한 데이터 흐름 도메인 분석.

데이터 흐름 도메인에 대해 자세히 알아보십시오.

연동 시뮬레이션 컴포넌트를 사용한 멀티코어 시뮬레이션. 시뮬레이션 모델에 연동 시뮬레이션 컴포넌트가 포함되어 있을 수 있습니다. 연동 시뮬레이션 컴포넌트는 Simulink와 타사 도구 또는 사용자 지정 코드 사이의 연동 시뮬레이션 게이트웨이로 구현된 S-Function 블록일 수 있습니다. 또한 Simulink로 가져온 연동 시뮬레이션 모드의 FMU 또는 액셀러레이터 모드의 Model 블록일 수도 있습니다. 이러한 연동 시뮬레이션 컴포넌트가 스레드로부터 안전하다면 여러 스레드에서 실행될 수 있습니다. 스레드로부터 안전하다는 것은 여러 스레드가 공유 데이터, 리소스, 객체에 액세스하더라도 블록이 충돌 없이 작동할 수 있다는 의미입니다.

모든 모델에 여러 스레드에서 실행할 수 있는 연동 시뮬레이션 컴포넌트가 있는 것은 아닙니다. 또한 멀티스레드 연동 시뮬레이션은 표준 시뮬레이션 모드만 지원합니다. 기본적으로 Simulink는 적격한 모든 모델과 블록을 멀티스레드 실행이 가능하도록 구성합니다. 성능을 개선할 수 있는 경우 Simulink는 모든 모델을 자동으로 여러 스레드에서 실행합니다.

멀티코어 연동 시뮬레이션에 대해 자세히 알아보십시오.

For Each 서브시스템에서 멀티코어 시뮬레이션 사용. For Each 서브시스템은 시뮬레이션 스텝 동안 입력 신호 또는 마스크 파라미터 배열에 있는 하위 배열의 각 요소에 대해 알고리즘 실행을 반복하는 Simulink의 서브시스템입니다. 모델에 계산량이 많은 For Each 서브시스템이 포함되어 있다면 For Each 서브시스템의 반복을 여러 스레드에서 실행하여 시뮬레이션 속도를 높일 수 있습니다.

For Each 서브시스템 멀티코어 시뮬레이션은 고속 액셀러레이터 시뮬레이션 모드만 지원합니다. 기본적으로 For Each 서브시스템에 대한 멀티스레드 시뮬레이션 지원은 활성화되어 있습니다. Simulink는 시뮬레이션을 실행하는 동안 자동으로 프로파일링합니다. 병렬 실행은 성능상 이점이 감지된 경우에만 활성화됩니다. 모델 파라미터 'MultithreadedSim'을 사용하여 멀티스레드 시뮬레이션의 사용 여부를 직접 선택할 수 있습니다.

For Each 서브시스템 사용에 대해 자세히 알아보십시오.

기법 적용 및 결과 측정

실제 프로젝트에서 이러한 기법이 얼마나 효과적인지 보여주기 위해, 자동 변속기 시스템 모델에 위에서 제안한 변경 사항 중 일부를 적용하여 시뮬레이션 시간 성능이 얼마나 개선되는지 측정했습니다. (그림 20)

자동 변속기 시스템의 Simulink 모델 화면 캡처.

그림 20. 자동 변속기 시스템의 Simulink 모델.

성능을 개선하기 위해 먼저 성능 어드바이저로 검사를 실행하고 다음과 같이 권장 변경 사항을 적용했습니다.

  • 솔버 데이터 불일치, 특이 행렬로 나누기, Inf 또는 NaN 블록 출력, 시뮬레이션 범위 검사, 배열 범위 초과를 검사하는 비용이 높은 진단 비활성화
  • Interpreted MATLAB Function 블록을 MATLAB 함수로 교체(이 변경이 단일 변경으로는 가장 큰 효과를 보였습니다.)
  • Block Reduction 최적화 활성화
  • 스코프를 닫고 주석 처리

이러한 변경으로 시뮬레이션 시간이 평균 57초에서 3.3초로 단축되었습니다. 최적화된 모델을 사용하여 이제 고속 가속과 병렬 시뮬레이션을 적용하고 이러한 기법의 성능을 비교할 수 있습니다. (표 2)

원래 모델, 표준 모드, 직렬 실행, 빠른 재시작 끔 5731초
개선된 모델, 표준 모드, 직렬 실행, 빠른 재시작 끔 328초
개선된 모델, 표준 모드, 직렬 실행, 빠른 재시작 켬 307초
개선된 모델, 고속 액셀러레이터 모드, 직렬 실행, RapidAcceleratorUpToDateCheck 끔  236초
개선된 모델, 표준 모드, 병렬 시뮬레이션, 빠른 재시작 켬 (로컬 워커 4개) 198초
개선된 모델, 고속 액셀러레이터 모드, 병렬 시뮬레이션, RapidAcceleratorUpToDateCheck 끔 (로컬 워커 4개) 85초

표 2. 시뮬레이션 시간 2000초에 대해 각 모델을 100회 반복하는 데 걸린 시간. 사용된 시스템: Lenovo T490s, Intel® Core™ i7-8665U CPU(1.9GHz, 2112MHz, 4코어), 32GB DDR4 2400MHz PC4-19200 SODIMM, 드라이브: 1TB SSD, Windows 10 Enterprise, MATLAB R2022a.

2022년 기고


저자 정보

Weiwu Li

Weiwu Li is a product manager responsible for simulation capabilities of Simulink and Simulink Compiler. Prior to joining MathWorks in 2016, he had many years of experience in the automotive industry as a system controls engineer. Weiwu has a Ph.D. in controls engineering from Zhejiang University, an M.S.M.E. from The Ohio State University, and an M.B.A. from Purdue University.

Guy Rouleau

Guy Rouleau is a consulting advanced support engineer at MathWorks and has been supporting Simulink users since 2007. In his role, Guy works closely with customers on technical challenges, bringing his expertise in engineering systems and applied modeling to support advanced MATLAB and Simulink workflows. Guy is the author of the “Guy on Simulink” blog, where he shares tips and tricks he’s learned while supporting Simulink users. He holds a master’s degree in mechanical engineering from McGill University, in collaboration with the Canadian Space Agency.

심화 주제 탐색