본문

OMNeT++ Result Recording and Analysis #2

12.2.2 Warm-up Period

warmup-period 옵션은 초기 warm-up 기간의 길이를 규정한다. 이것이 설정되었을 경우, 처음 x초 범위내에 있는 시뮬레이션 결과들은 출력 벡터에서 기록되지 않을 것이며, 또한 출력 스칼라 상의 계산에 포함되지 않을 것이다. 이 옵션은 steady-state 시뮬레이션에 유용하며, 기본값은 0초(warmup 구간 없음)이다. 시그널 기반의 통계를 사용하는 경우 자동적으로 warm-up 구간 세팅을 따르게 된다.


하지만 recordScalar()등을 사용하여 스칼라 결과를 일일히 계산하는 모듈의 경우, 코드의 수정을 통해 warm-up 기간에 대한 사항을 설정해주어야 한다. warm-up 기간값은 simulation 객체의 getWarmupPeriod() 메소드를 사용하여 얻을 수 있으며, 이를 통해 해당하는 상태 변수를 업데이트하는 c++ 코드는 이를 사용하는 if구문내에 포함되어야 한다. 예를 들어 dropCount++;의 경우 if(simTime() >= simulation.getWarmupPeriod()) dropCount++; 으로 변경할 수 있다는 것이다.


12.2.3 Result File Names

시뮬레이션 결과는 출력 스칼라 파일로 혹은 출력 벡터 파일로 저장될 수 있다. 보통, 스칼라 파일은 .sca로, 벡터 파일은 .vec으로 저장된다. 각 시뮬레이션 수행의 결과로서, 하나의 스칼라 파일과 하나의 벡터 파일이 출력된다. 파일이름은 output-vector-file과 output-scalar-file옵션으로 변경할 수 있다. 이 옵션들은 기본적으로 저장되는 파일이름이 꽤 괜찮기 떄문에 사용될 필요가 거의 없다. 기본 설정은 아래와 같다.

output-vector-file = "${resultdir}/${configname}-${runnumber}.vec"

output-scalar-file = "${resultdir}/${configname}-${runnumber}.sca"


여기에서 ${resultDir}은 result-dir 설정옵션의 값을 나타내며, 기본으로는 results/. 값이 입력된다. 그리고 ${configname}은 ini 파일내의 설정이름과 동일하다(예를 들어 [Config PureAloha]에서 PureAloha) 따라서, 위 코드에 따라 results/PureAloha-0.vec, results/PureAloha-1.vec등의 파일이 생성될 것이다. 단, OMNeT++ 3.x에서 결과 파일은 omnetpp.vec과 omnetpp.sca으로 저장되며, 스칼라 파일은 기존 파일이 있다면 그 뒤에 덧붙여져 저장되지, 4.x버전처럼 덮어쓰기로 동작하지 않는다. 필요하다면, 설정에서 output-scalar-file-append=true를 사용함으로서 예전 방법을 사용할 수도 있다.


12.2.4 Configuring Scalar Results

결과를 스칼라 파일로 저장하는 것은 ini 파일에 "**.scalar-recording = false" 코드를  추가함으로서 비활성화 될 수 있다. 기존의 스칼라 파일은 시뮬레이션이 시작되기 전 삭제될 것이다. 또한 스칼라 파일의 저장여부는 패턴을 사용하여 각각 설정될 수 있다. 설정 옵션의 문법은 <모듈전체경로>.<스칼라이름>.scalar-recording=true/false 이고, 각 <>로 둘러싸인 부분은 *으로 대체될 수 있다. <스칼라이름>은 시그널의 이름 혹은 recordScalar()으로부터 전달된 문자열을 지칭한다. 기본적으로, 스칼라의 기록은 활성화되어있다. 아래의 예는 종단 지연속도에 대한 사항과 TCP 모듈로부터 생성된 결과를 제외한 모든 스칼라 결과값을 저장하지 않는 코드이다.

**.tcp.**.scalar-recording = true

**.endToEndDelay.scalar-recording = true

**.scalar-recording = false


12.2.5 Configuring Output Vectors

출력 벡터를 기록하는 것은 ini파일내에 "**.vector-recording = false"를 삽입하여 가능하다. 기존에 있던 벡터파일은 시뮬레이션이 시작되기 전에 삭제될 것이다. 출력벡터파일의 크기는 금새 몇백 메가바이트에 이를 수 있지만, 사실 분석과정에서는 그중 일부만이 필요한 경우가 많다. 따라서, OMNeT++에서는 어떤 벡터를 기록할것인가에 대해 제어할 수 있게 해주며, 또한 기록 범위를 조절할 수 있도록 해준다.


출력 벡터에 대한 사항은 vector-recording과 vector-recording-intervals를 사용하여 조정될 수 있다. 설정 옵션의 문법은 <모듈전체경로>.<백터이름>.vector-recording=true/false이며, 여기서 <>로 묶여진 부분은 *으로 대체될 수 있다. 이는 위의 스칼라에서의 사항과 동일하다.

vector-recording-intervals 옵션에서, <시작시간>....<정지시간>으로 표현하며, 각각은 ,으로 나열된다. <시작시간>과 <정지시간>은 측정단위와 함께 기입되어야 하며, 한쪽에 대해 기입하지 않는 형태도 가능하다. 아래의 예는 시뮬레이션동안 계속 기록될, dropCoun t벡터를 제외한 모든 벡터에 대해 세개의 구간으로 기록 범위를 한정한다. 


**.dropCount.vector-recording-intervals = 0..

**.vector-recording-intervals = 0..1000s, 5000s..6000s, 9000s..


벡터단위의 설정중 세번째 옵션으로, vector-record-eventnumbers가 있으며, 이는 이벤트 숫자값을 출력벡터에 포함할것인지의 여부를 결정한다. 단, 시뮬레이션 시간과 값은 항상 기록되고, 이벤트 숫자는 순차 차트 툴(sequence chart tool) 등 에서 필요하다. 이벤트 숫자는 기본적으로 기록되지만, 파일 크기를 축소하기 위해서는 **.vector-record-eventnumbers = false를 사용하여 기록하지 않게 할 수 있다. 만약 cIndexedFileOutputVectorManager클래스가 출력 벡터를 기록하는데에 사용된다면, 이것의 자원 사용을 세부적으로 조절하기 위해 또다른 두개의 옵션을 사용할 수 있다. output-vectors-memory-limit와 vector-max-buffered-values가 있다.


12.2.6 Saving Parameters as Scalars

서로 다른 인자를 사용하여 각기 다른 시뮬레이션을 수행할 경우, 결과 분석시에 인자값을 활용하고자 하는 경우가 발생할 수 있다. 예를 들어, 부하 대비 처리량을 출력하고자 할때, 평균 처리량은 출력 스칼라 파일로 저장되는데, 이때, 입력 인자값을 포함하면 더욱 유용하다. 편의를 위해, OMNeT++에서는 만약 수치(numeric)값을 갖는경우, iteration 변수를 출력스칼라에 저장함으로서, 결과 분석시에 사용될 수 있도록 해준다. 이에 비해 만약 iteration 변수가 비수치적(non-numeric)값을 가진다면, 결과로 기록되지 않아 결국 분석과정에서 사용될 수 없다. 이것은 iteration 변수 리스트상에 단위(unit)을 적어놓았을 경우에도 동일하다. 

**.param = exponential( ${mean=0.2s, 0.4s, 0.6s} ) #WRONG!

**.param = exponential( ${mean=0.2, 0.4, 0.6}s ) #OK


모듈 매개변수(parameter)또한 저장될 수 있지만, 이것은 사용자가 param-record-as-scala=true를 기입하여 이를 저장하겠다고 할 경우에만 해당한다. 설정 키는 매개변수를 구분하는 경로와 .param-record-as-scalar를 결합한 형태로 사용된다. "**.host[*]networkLoad.param-record-as-scalar = true" 단 이를 사용할 때에는 비수치적, 너무 많은 대상을 가지는(too many matching), 랜덤값을 갖는 volatile 매개변수들에 대해 생각해야 한다.


우선, 스칼라 파일에는 수치적 결과값만이 기록되므로, 비수치적 매개변수는 기록되지 않을것이며, 이때에는 런타임 오류가 발생된다. 그리고 만약 *를 사용하는데에 대상이 너무 많이 선택되는 경우, 스칼라 파일의 크기가 불필요하게 증가되게 된다. 예를 들어, 만약 아래의 예제에서 host[] 모듈 벡터의 크기가 1000이라면, 3이라는 동일한 값이 각 호스트마다 한번씩, 총 1000번 저장될 것이다. 

**.host[*].startTime = 3

**.host[*].startTime.param-record-as-scalar = true # saves "3" once for each host


또한, 랜덤값을 갖는 volatile 매개변수에 대해서는, 분포상의 랜덤값이 저장될 것이다.(1번째 줄) 이를 사용하는 경우는 흔치 않지만, 만약 사용하게 된다면 시뮬레이션 커널에서는 경고를 출력할 것이다. 위에서 나열한 사항들은 실제 사용할때 자주 발생하는 것들이며, 따라서 결과 분석을 위해서 iteration 변수에 의존하는것이 좋다. 즉, 1번째 줄의 예는 2번째줄과 같이 바꿔 쓸 수 있으며, 결과 분석과정에서 interarrivalTime 모듈 매개변수대신 $mean iteration 변수에 접근하게 하는것이다. param-record-as-scalar=true는 필요하지 않는데, 이유는 iteration 변수는 자동으로 결과 파일내에 저장되기 떄문이다.

#**.interarrivalTime = exponential(1s) 

**.interarrivalTime = exponential( ${mean=1}s )

**.interarrivalTime.param-record-as-scalar = true # wrong: saves random values!


12.2.7 Recording Precision

출력 스칼라와 출력 벡터 파일은 텍스트 파일이며, 부동 소숫점 값(double)은 fprintf()의 %g 를 사용하여 저장된다. output-scalar-precision과 output-vector-precision의 설정을 통해 유효숫자의 개수를 결정할 수 있다. 유효숫자는 기본으로 12개로 설정되어 있으며, 아래의 설명을 참고하여 변경할 수 있다.


IEEE-754 double은 64비트의 수이다. 가수(mantissa)는 52비트이며, 이는 16개의 소숫점 자리를 표현할 수 있다(52*log(2)/log(10)). 하지만 반올림 과정에서의 오류로 인해 대개 12~14자리가 정확하다 할 수 있으며, 이 나머지는 무시해야할 랜덤한 쓰레기 값으로 생각할 수 있다. 하지만 결과 처리과정에서 double으로 변환하는 과정에서 추가적인 오류가 발생하는데, 이는 0.1, 0.01등이 이진형식으로는 정확하게 표현할 수 없기 떄문이다. 대신, 정확도를 높이기 위해 16개 이상의 소숫점자리를 사용하는 방식을 사용할 수 있다(그래도 역시 마지막 자리는 쓸모없는 값이라는것을 기억해야 한다). 실질적으로는 17자리 이상의 설정은 fprintf()의 한계로 인해 차이를 발생하지 않는다.


숫자 변환과정에서 발생하는 오류들은 double을 native 이진형태로 저장하는 '출력 벡터/출력 스칼라 매니저 클래스'를 사용함으로서 제거될 수 있다. 가능한 설정으로 outputvectormanager-class, outputvectormanager-class 이며(outputvectormanager-class = "cMySQLOutputVectorManager"), 예를 들어, samples/database에서 제공되는 cMySQLOutputScalarManager, cMySQLOut-putScalarManager은 이러한 사항을 만족한다. 반올림 혹은 변환 오류에 걱정하기 전에, 실질적인 출력결과의 정확도에 생각해볼 필요가 있다.(즉, real-world상의 결과를 측정하는 과정 자체에서도 이미 이보다 더 큰 오류가 발생-예를 들어 자리수의 한정이라든가-할 수 있다는 것이다)



출처 : OMNeT++ User Manual, 12.2 Configuring Result Collection

댓글

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.