※ 이 글은 오가사와라 히로유키(小笠原博之) 씨가 블로그에 적은 글을 번역한 것입니다. 사정에 따라 예고없이 삭제될 수 있으므로 양해부탁드립니다.

ARM CPU의 VFP Benchmark앱 부동소수점 연산속도 계측

(원문 : ARM CPU の VFP Benchmark アプリ 浮動小数点演算速度の計測)

지금까지 ARM CPU의 부동소수점 연산속도에 관해서 조사해왔는데, 그 계측 프로그램을 앱으로 만들어보았습니다.

지금까지의 계측결과를 정리한 결과는 아래와 같습니다.

VFP Benchmark 앱의 표시결과는 위의 표와 호환성이 있습니다. 거기에 FLOPS 표시, 배정밀도 부동소수점 연산의 계측, 멀티스레드 실행에 대응했습니다. 아래는 몇가지 단말의 결과(일부)입니다.

MSN8974 Krait 400 2.2GHz x4 quad
---------------------------------------
SingleT SP max : 16.619 GFLOPS
MultiT  SP max : 67.185 GFLOPS (이론치: 70.4 GFLOPS)
                               = 2(mad) x 4(simd) x 4(core) x 2.2(clock)


Tegra4 Cortex-A15 1.8GHz x4 quad
---------------------------------------
SingleT SP max: 13.371 GFLOPS
MultiT  SP max: 51.345 GFLOPS  (이론치: 57.6 GFLOPS)
                        = 2(mad) x 2(simd) x 2(unit) x 4(core) x 1.8(clock)


APQ8064 Krait 1.5GHz x4 quad
---------------------------------------
SingleT SP max: 11.947 GFLOPS
MultiT  SP max: 47.808 GFLOPS  (이론치: 48.0 GFLOPS)
                               = 2(mad) x 4(simd) x 4(core) x 1.5(clock)

Exynos5D Cortex-A15 1.7GHz x2 dual
---------------------------------------
SingleT SP max: 13.483 GFLOPS
MultiT  SP max: 26.724 GFLOPS  (이론치: 27.2 GFLOPS)
                        = 2(mad) x 2(simd) x 2(unit) x 2(core) x 1.7(clock)


Tegra3 Cortex-A9 1.2GHz x4 quad (TB1.3GHz)
---------------------------------------
SingleT SP max:  4.783 GFLOPS  (이론치:  5.2 GFLOPS
MultiT  SP max: 18.905 GFLOPS  (이론치: 19.2 GFLOPS)
                               = 2(mad) x 2(simd) x 4(core) x 1.2(clock)

K3V2 Cortex-A9 1.2GHz x4 quad
---------------------------------------
SingleT SP max:  4.694 GFLOPS
MultiT  SP max: 18.662 GFLOPS  (이론치: 19.2 GFLOPS)
                               = 2(mad) x 2(simd) x 4(core) x 1.2(clock)


MSN8260 Scorpion 1.2GHz x2 dual
---------------------------------------
SingleT SP max:  8.898 GFLOPS
MultiT  SP max: 16.560 GFLOPS  (이론치: 19.2 GFLOPS)
                               = 2(mad) x 4(simd) x 2(core) x 1.2(clock)


QSD8250 Scorpion 1.0GHz x1
---------------------------------------
SingleT SP max:  7.098 GFLOPS  (이론치:  8.0 GFLOPS)
                               = 2(mad) x 4(simd) x 1.0(clock)

Tegra 2 Cortex-A9 1.0GHz x2 dual
---------------------------------------
SingleT SP max:  1.973 GFLOPS
MultiT  SP max:  3.913 GFLOPS  (이론치:  4.0 GFLOPS)
                               = 2(mad) x 2(core) x 1.0(clock)

비교적 이론치에 가까운 수치를 내고 있습니다. 각 CPU의 이론치는 아래에 정리했습니다.

이 출력결과는 어디까지나 최대치에 의한 비교이므로, 실제 애플리케이션 실행속도와는 차이가 있습니다.

예를 들어 스칼라 VFP 연산에서 n8과 n1의 결과를 비교하면 Cortex-A9에서는 명령순에 따라 속도가 5배나 떨어지는 경우가 있습니다. 같은 조건에서 Krait/Cortex-A15은 거의 속도가 떨어지지 않으므로, 파이프라인의 실행효율이 향상되었다는 것을 알 수 있습니다.

따라서 실제 애플리케이션에서는 Cortex-A9과 Krait/Cortex-A15은 최대치보다도 훨씬 차이가 날 것이라는 것을 예상할 수 있습니다.

multi-thread는 같은 테스트를 CPU core의 수만큼 돌립니다. Tegra 3처럼 single thread 시에 동작 클럭이 올라가는 것도 있으므로, single-thread의 값을 core 수만큼 곱해도 바른 값이 나오지는 않기 때문입니다.

앱의 출력결과를 보면 Cortex-A15는 VFP의 스칼라 연산보다도 NEON의 64bit (float x2) 쪽이 2배 빠르게 실행된다는 것을 알 수 있습니다.

// Exynos 5 Dual Cortex-A15 1.7GHz dual (Nexus 10)

* VFP/NEON (single fp)         sec    MFLOPS    최대
----------------------------------------------------
VFP fmuls     (32bit x1) n8 :  2.675  1495.4  1555.9
VFP fadds     (32bit x1) n8 :  2.392  1672.1  1672.1
VFP fmacs     (32bit x1) n8 :  3.171  2523.2  2523.2
VFP vfma.f32  (32bit x1) n8 :  2.985  2679.9  2679.9
NEON vmul.f32 (32bit x2) n8 :  1.187  6740.5  6740.5  **
NEON vadd.f32 (32bit x2) n8 :  1.187  6740.7  6740.7  **
NEON vmla.f32 (32bit x2) n8 :  1.187 13480.8 13480.8  **
NEON vfma.f32 (32bit x2) n8 :  1.187 13480.3 13480.3  **
NEON vmul.f32 (32bit x4) n8 :  2.373  6741.8  6741.8
NEON vadd.f32 (32bit x4) n8 :  2.374  6740.7  6740.7
NEON vmla.f32 (32bit x4) n8 :  2.373 13482.7 13482.7
NEON vfma.f32 (32bit x4) n8 :  2.373 13482.3 13482.3

이전에 예상했듯이 아마도 NEON의 연산 unit은 64bit의 2pipe이지만, VFP는 1명령밖에 실행하지 못할 가능성이 있습니다. Cortex-A8에서 그랬듯이 VFP 명령을 NEON 연산으로 바꾸면 Cortex-A15에 최적화될지도 모릅니다.

관련글

+ Recent posts