이 페이지는 기계 번역을 사용하여 번역되었습니다. 영어 원문을 보려면 여기를 클릭하십시오.
루프 롤링
Target Language Compiler의 최적화 기능 중 하나는 루프 롤링에 대한 내장 지원입니다. 지정된 임계값에 따라, 반복 연산에 대한 코드 생성은 언롤(unroll)되거나 루프 형태로 유지(롤(roll))될 수 있습니다.
루프 롤링과 함께 고려해야 할 개념이 바로 비연속 신호입니다. 다음 모델을 살펴보겠습니다:

timestwo S-Function의 입력은 서로 다른 두 메모리 위치에 있는 두 개의 배열에서 제공되며, 하나는 source1의 출력용이고 다른 하나는 source2 블록의 출력용입니다. 이는 Mux 블록을 가상으로 만드는 최적화 때문인데, 이는 Mux 블록에 대한 코드가 명시적으로 생성되지 않으므로 이를 평가하는 데 프로세서 사이클이 소모되지 않음을 의미합니다(즉, 블록 다이어그램상 순전히 시각적인 편의성을 위한 요소가 됩니다). 따라서 이 경우 파일에서는 다음과 같이 표현됩니다.model.rtw
Block {
Type "S-Function"
MaskType "S-function: timestwo"
BlockIdx [0, 0, 2]
SL_BlockIdx 2
GrSrc [0, 1]
ExprCommentInfo {
SysIdxList []
BlkIdxList []
PortIdxList []
}
ExprCommentSrcIdx {
SysIdx -1
BlkIdx -1
PortIdx -1
}
Name "<Root>/timestwo C-MEX S-Function"
SLName "<Root>/timestwo \nC-MEX S-Function"
Identifier timestwoCMEXSFunction
TID 0
RollRegions [0:19, 20:49]
NumDataInputPorts 1
DataInputPort {
SignalSrc [b0@20, b1@30]
SignalOffset [0:19, 0:29]
Width 50
RollRegions [0:19, 20:49]
}
NumDataOutputPorts 1
DataOutputPort {
SignalSrc [b2@50]
SignalOffset [0:49]
Width 50
}
Connections {
InputPortContiguous [no]
InputPortConnected [yes]
OutputPortConnected [yes]
OutputPortBeingMerged [no]
DirectSrcConn [no]
DirectDstConn [yes]
DataOutputPort {
NumConnPoints 1
ConnPoint {
SrcSignal [0, 50]
DstBlockAndPortEl [0, 4, 0, 0]
}
}
}
.
.
. 파일의 이 부분에서 볼 수 있듯이, 블록 및 입력 포트 model.rtwRollRegion 항목은 단순히 하나의 숫자가 아니라 두 그룹의 숫자로 구성되어 있습니다. 이는 입력 신호에 대해 메모리 내에 두 개의 그룹이 존재함을 의미합니다. 생성된 코드는 다음과 같습니다:
/* S-Function Block: <Root>/timestwo C-MEX S-Function */
/* Multiply input by two */
{
int_T i1;
const real_T *u0 = &contig_sample_B.u[0];
real_T *y0 = contig_sample_B.timestwoCMEXSFunction_m;
for (i1=0; i1 < 20; i1++) {
y0[i1] = u0[i1] * 2.0;
}
u0 = &contig_sample_B.u_o[0];
y0 = &contig_sample_B.timestwoCMEXSFunction_m[20];
for (i1=0; i1 < 30; i1++) {
y0[i1] = u0[i1] * 2.0;
}
}두 개의 루프가 생성되며, 이 두 루프 사이에서 입력 신호가 첫 번째 기본 주소인 &contig_sample_B.u[0]에서 신호의 두 번째 기본 주소인 &contig_sample_B.u_o[0]로 재지정된다는 점에 유의하십시오. S-Function이나 생성된 코드에서 이 기능을 지원하지 않으려면 다음을 사용할 수 있습니다.
ssSetInputPortRequiredContiguous(S, 1);
mdlInitializeSizes 함수 내에서 Simulink®가 버퍼링 작업을 수행하는 코드를 암시적으로 생성하도록 합니다. 이 옵션은 실행 시 추가 메모리와 CPU 사이클을 모두 소모하지만, 알고리즘의 성능이 버퍼링으로 인한 오버헤드를 상쇄할 만큼 충분히 향상된다면 그만한 가치가 있을 수 있습니다.
루프를 생성하려면 %roll 지시문을 사용하십시오. %roll에 대한 참조 항목은 %roll를, %roll의 동작에 대한 논의는 Input Signal Functions를 참조하십시오.