9/06/2016

TI-Sitara (AM437x) Benchmark Program (참조용)

TI에서 아래와 같이 ARM의 기본성능 TEST 할수 있는 방법제공을 해주어서,
본인도 새로 알게되었으며, 각각의 SOC의 성능을 측정을 할수 있는 App을 간단히 소개한다.

만약 존재하지 않는다면, 아래에 같이 Github에서 Download에서 다운로드에서 사용을해보자.

   https://en.wikipedia.org/wiki/NBench

1. Benchmark Test

1.1 CPU 기본성능 TEST

  • proc/cpuinfo : 가장기본적인 정보 
  • Dhrystone : CPU의 성능을 측정하는 방법으로, 별도의 프로그램이 필요.  
  • Whetstone : 유사하지만, 둘 사이의 차이점은 아직 발견을 못하겠음.
  • Linkpack: FPU 성능측정을 위해서 사용하면 되겠다.

Proc에서 제공해주는 기본적인 BogoMIPS가 있다.

# cat /proc/cpuinfo 
processor : 0
model name : ARMv7 Processor rev 10 (v7l)
BogoMIPS : 598.17
Features : half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpd32 
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x2
CPU part : 0xc09
CPU revision : 10

Hardware : Generic AM43 (Flattened Device Tree)
Revision : 0000
Serial  : 0000000000000000 
CPU를 기본적으로 측정하는 프로그램으로, MIPS로 나오며,

1.2 Dhrystone

사용법은 Benchmark할 횟수를 적어줘야한다.
단위는 DMIPS (Dhrystone MIPS) 이며, RISC와 CISC에 따라 알고리즘이 약간식 다르게 동작이 되는 것 같다.


# /usr/bin/dhrystone

Dhrystone Benchmark, Version 2.1 (Language: C)

Program compiled without 'register' attribute

Please give the number of runs through the benchmark: 40000000  // 이 값이 너무 작으면 측정이 제대로 안됨 

Execution starts, 40000000 runs through Dhrystone
Execution ends

Final values of the variables used in the benchmark:

Int_Glob:            5
        should be:   5
Bool_Glob:           1
        should be:   1
Ch_1_Glob:           A
        should be:   A
Ch_2_Glob:           B
        should be:   B
Arr_1_Glob[8]:       7
        should be:   7
Arr_2_Glob[8][7]:    40000010
        should be:   Number_Of_Runs + 10
Ptr_Glob->
  Ptr_Comp:          151560
        should be:   (implementation-dependent)
  Discr:             0
        should be:   0
  Enum_Comp:         2
        should be:   2
  Int_Comp:          17
        should be:   17
  Str_Comp:          DHRYSTONE PROGRAM, SOME STRING
        should be:   DHRYSTONE PROGRAM, SOME STRING
Next_Ptr_Glob->
  Ptr_Comp:          151560
        should be:   (implementation-dependent), same as above
  Discr:             0
        should be:   0
  Enum_Comp:         1
        should be:   1
  Int_Comp:          18
        should be:   18
  Str_Comp:          DHRYSTONE PROGRAM, SOME STRING
        should be:   DHRYSTONE PROGRAM, SOME STRING
Int_1_Loc:           5
        should be:   5
Int_2_Loc:           13
        should be:   13
Int_3_Loc:           7
        should be:   7
Enum_Loc:            1
        should be:   1
Str_1_Loc:           DHRYSTONE PROGRAM, 1'ST STRING
        should be:   DHRYSTONE PROGRAM, 1'ST STRING
Str_2_Loc:           DHRYSTONE PROGRAM, 2'ND STRING
        should be:   DHRYSTONE PROGRAM, 2'ND STRING

Microseconds for one run through Dhrystone:    0.2 
Dhrystones per Second:                      5000000.0 


위의 나온 결과로 아래와 같이 본인이 계산을 해야한다.

5000000.0 / 1757  = 2845.7598178713716562322140011383   // 1757로 나눈다.
2845.7598178713716562322140011383  / 1000MHz (CPU CLOCK) = 2.84 


CPU Clock     =  1000MHz
DMIPS / MHz =  2.84 DMIPS

   아래에서 Dhryston 관련사이트에서 확인 반드시 확인.
   https://en.wikipedia.org/wiki/Dhrystone

   ARM 관련 Chip들 DMIPS 정보를 보고 비교해보자.
   https://en.wikipedia.org/wiki/List_of_ARM_microarchitectures

   DMIPS 계산방법
   http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0273a/ar01s05.html


1.3 Whetstone

사용법은 Loop 횟수를 적어줘야한다.
나온결과는 Millions of Whetstone Instructions Per Second (MWIPS)


/usr/bin/whetstone 100000   // loop count를 입력해야한다. 

Loops: 100000, Iterations: 1, Duration: 6 sec.
C Converted Double Precision Whetstones: 1666.7 MIPS



   Whetstone 관련내용
   https://en.wikipedia.org/wiki/Whetstone_(benchmark)

1.4 Linpack

Floating Point Operation을 TEST하기 위한 Benchmark Program이라고 하며, output은 KFLOPS


# /usr/bin/linpack
Unrolled Single Precision Linpack

Unrolled Single Precision Linpack

     norm. resid      resid           machep         x[0]-1        x[n-1]-1
       1.6        3.80277634e-05  1.19209290e-07 -1.38282776e-05 -7.51018524e-06
    times are reported for matrices of order   100
      dgefa      dgesl      total       kflops     unit      ratio
 times for array with leading dimension of  201
       0.02       0.00       0.02      34333       0.06       0.36
       0.02       0.00       0.02      34333       0.06       0.36
       0.01       0.00       0.01      68667       0.03       0.18
       0.01       0.00       0.01      68667       0.03       0.18
 times for array with leading dimension of 200
       0.00       0.00       0.00        inf       0.00       0.00
       0.02       0.00       0.02      34333       0.06       0.36
       0.00       0.00       0.00        inf       0.00       0.00
       0.01       0.00       0.01     114444       0.02       0.11
Unrolled Single  Precision 68667 Kflops ; 10 Reps 

Linpack에 관련내용
   https://en.wikipedia.org/wiki/LINPACK_benchmarks


1.5 lmbench로 Memory 성능측정

lmbench의 한 bin 파일로 기본 사용법 lmbench package를 넣어 TEST 해보자.

//AM487x EVM TEST 

# bw_mem 1M rd
1.00 359.91

# bw_mem 1M wr
1.00 305.75

# bw_mem 1M rdwr
1.00 281.14

# bw_mem 1M cp
1.00 181.46

# bw_mem 1M fwr
1.00 676.59

# bw_mem 1M frd
1.00 269.40

# bw_mem 1M fcp
1.00 214.76

# bw_mem 1M bzero
1.00 675.68

# bw_mem 1M bcopy
1.00 252.87

  http://lmbench.sourceforge.net/cgi-bin/man?section=8&keyword=bw_mem



  • 시스템 관련 성능 측정

위에서 언급한 lmbench package이며, 다양한 TEST가 가능하다.
  1. RAM 관련 TEST 
  2. File 관련 TEST
  3. Network TEST
  4. TLB 및 Cache TEST
  5. UNIX Function Memory Map TEST 

각각의 지연시간(Latency)를 확인이 가능하며, 성능개선을 위해 알아 둬야 할 것 같다.
더불어 Hardware or Software 적으로 최적화를 진행을 하고 TEST를 해보면 추후
좋을 것 같다.

  http://lmbench.sourceforge.net/cgi-bin/man?keyword=lmbench&section=8


  • lmbench 소스와 관련사용법 TI에서 제공

아래의 사이트에서 자세한 기본사용법과 소스를 다운받아 사용해보자.

   http://processors.wiki.ti.com/index.php/Lmbench
   https://sourceforge.net/projects/lmbench/


2. BenchMark 관련소스 및 Bin Download

상위 CPU 관련 성능 측정관련 Source 및 Bin 파일

   https://github.com/tonyho/ARM_BenchMark