주요 콘텐츠

이 페이지는 기계 번역을 사용하여 번역되었습니다. 영어 원문을 보려면 여기를 클릭하십시오.

루프 롤링

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.rtw 파일의 이 부분에서 볼 수 있듯이, 블록 및 입력 포트 RollRegion 항목은 단순히 하나의 숫자가 아니라 두 그룹의 숫자로 구성되어 있습니다. 이는 입력 신호에 대해 메모리 내에 두 개의 그룹이 존재함을 의미합니다. 생성된 코드는 다음과 같습니다:

/* 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를 참조하십시오.