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

Nexus 9 NVIDIA Tegra K1 64 Denver의 부동소수점 연산속도

(원문 : Nexus 9 NVIDIA Tegra K1 64 Denver の浮動小数点演算速度)

VFP Benchmark의 Android판도 64bit에 대응시켰습니다. 대응되면 arm64(arm64-v8a), x86_64(x64), mips64로 계측합니다. 또한 iOS판은 이미 64bit(arm64)에 대응되어 있습니다.

아래는 Nexus 9 (Tegra K1 64)에서의 결과 비교입니다.

NVIDIA Denver            ST-SP    ST-DP   MT-SP   MT-DP
----------------------------------------------------------------
AArch32 32bit armv7a     17.799   4.423   34.582   8.719  GFLOPS
AArch64 64bit arm64      17.906   8.762   34.888  17.601  GFLOPS

 * ST=Single thread, MT=Multi thread
 * SP=Single precision fp, DP=Double precision fp
 * 단위는 GFLOPS, 수치가 높을수록 고속

AArch64는 배정밀도 NEON 명령을 사용할 수 있기에 DP의 속도가 2배가 됩니다. 보다 자세한 결과는 아래 페이지에 올려놨습니다.

// Tegra K1 Denver arm64
                                  시간(sec)  MFLOPS
---------------------------------------------------
FPU fmul (32bit x1) n8        :    2.049     1952.1
FPU fadd (32bit x1) n8        :    1.000     3998.3
FPU fmadd (32bit x1) n8       :    1.849     4326.0
NEON fmul.2s (32bit x2) n8    :    1.842     4343.8
NEON fadd.2s (32bit x2) n8    :    1.259     6356.0
NEON fmla.2s (32bit x2) n8    :    1.900     8420.3
NEON fmul.4s (32bit x4) n8    :    1.837     8711.7
NEON fadd.4s (32bit x4) n8    :    1.179    13570.5
NEON fmla.4s (32bit x4) n8    :    1.831    17475.0

FPU fmul (64bit x1) n8        :    1.930     2072.7
FPU fadd (64bit x1) n8        :    0.929     4306.0
FPU fmadd (64bit x1) n8       :    1.798     4450.2
NEON fmul.2d (64bit x2) n8    :    1.809     4422.6
NEON fadd.2d (64bit x2) n8    :    1.195     6695.8
NEON fmla.2d (64bit x2) n8    :    1.826     8762.0

fmul.2s, fmul.4s의 속도차이가 없는 것으로 보아, Cortex-A15과 달리 NEON 명령이 128bit 단위로 실행되는 것이라 생각됩니다. 아마도 Nexus 9의 Denver는 2.2GHz 전후로 동작하고, 1 cycle 당 스칼라 곱셈이 1, 덧셈이 2. SIMD에서는 이 비율이 4 mul, 6 add, 4 mad입니다. 표로 정리하면 아래와 같습니다. (수치가 클수록 cycle 당 연산능력이 높음)

                 Scalar SP       Scalar DP
                 mul add mad     mul add mad
----------------------------------------------
Cortex-A9  32      1   1   2     0.5   1   1
Cortex-A15 32      1   1   2       1   1 1.4
Krait 400  32      1   1   2       1   1   2  (Qualcomm)
Swift      32      1   1   1       1   1   1  (Apple A6)
Denver     64      1   2   2       1   2   2  (NVIDIA Tegra) ←
Cyclone    64      2   3   4       2   3   4  (Apple A7/A8)
Silvermont 64      1   1   -     0.5   1   -  (Intel BayTrail Atom)
Jaguar     64      1   1   2     0.5   1   -  (AMD Kabini)
               SIMD2(32x2) SP    SIMD4(32x4) SP    SIMD2(64x2) DP
                mul add mad       mul add mad       mul add mad
------------------------------------------------------------------
Cortex-A9  32     2   2   4         2   2   4         -   -   -
Cortex-A15 32     4   4   8         4   4   8         -   -   -
Krait 400  32     2   2   4         4   4   8         -   -   -
Swift      32     2   2   4         4   4   8         -   -   -
Denver     64     2   3   4         4   6   8         2   3   4  ←
Cyclone    64     4   6   8         8  12  16         4   6   8
Silvermont 64     -   -   -         2   4   6       0.5   1 1.5
Jaguar     64     -   -   -         4   4   8         2   2   4

↑이 표는 명령당 연산개수로, 덧곱셈을 2로 처리했습니다. 더 자세한 표는 아래 페이지에 올려놓았습니다.

  • CPU의 부동소수점 연산능력의 상세

Denver는 CPU core와 비교해도 비교적 얌전한 결과를 보입니다. 부동소수점 연산에 있어서도 딱히 돌출된 특징이 없어, core의 수가 적은만큼 Multi-Thread 시의 최대치가 낮습니다. 아래 표는 32bit 버전 Tegra K1을 탑재한 SHIELD Tablet과의 비교입니다.

Tegra K1 (수치는 GFLOPS)         ST-SP   ST-DP  MT-SP    MT-DP
---------------------------------------------------------------
Denver     AArch32 32bit armv7a  17.799  4.423  34.582   8.719  Nexus 9
Denver     AArch64 64bit arm64   17.906  8.762  34.888  17.601  Nexus 9
Cortex-A15 ARMv7A  32bit armv7a  17.136  3.431  70.174  14.036  SHIELD Tab

이것만 보면 Cortex-A15 버전쪽이 나은 것처럼 보이지만, 어디까지나 부동소수점 연산명령만 본 결과입니다. 실제로는 ARM의 64bit 명령셋을 쓸 수 있다는 큰 메리트가 있어, 응용 프로그램의 동작속도에는 이렇다할 큰 차이가 나지 않을거라 생각됩니다.

↓표는 WebGL (Emscripten) 물리 엔진 벤치마크의 결과비교로, Nexus 9은 상당히 고속으로 실행되고 있습니다.

Nexus 9        Tegra K1  Denver     64  Android 5.0  Firefox 33  13개
iPad Air 2     Apple A8X Cyclone    64  iOS 8.1      Safari      13개
MeMO Pad ME176 Z3740     Silvermont 32  Android 4.4  Firefox 33   9개
Tegra Note 7   Tegra 4   Cortex-A15 32  Android 4.4  Firefox 33   8개
Nexus 5        MSM8974   Krait 400  32  Android 4.4  Firefox 33   8개
Nexus 7        APQ8064   Krait      32  Android 5.0  Firefox 33   5개

자세한 것은 아래 페이지에서. 현재는 Firefox에서도 제대로 표시되게 되었습니다.

Android NDK의 어셈블러 명령

clang과 gcc4.9의 차이일지도 모르지만, 왼쪽의 생략표기를 쓸 수 없기에 오른쪽과 같이 레지스터 명으로 전개하는 것이 필요합니다.

orr.16b  v1, v0, v0      →     orr   v1.16b, v0.16b, v0.16b
fmla.4s  v0, v8, v4      →     fmla  v0.4s,  v8.4s,  v4.4s

관련글

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

iPad Air 2(Apple A8X)의 부동소수점 연산능력

(원문 : iPad Air 2 (Apple A8X) の浮動小数点演算能力)

iPad Air 2(A8X)의 부동소수점 연산능력을 조사해보았습니다. 더 자세한 기록은 다음 페이지에 올려놓았습니다.

// iPad 2 Air (Apple A8X)

ARCH: ARMv8A
VFP: AArch64 NEON
SingleT SP max:  23.568 GFLOPS
SingleT DP max:  11.751 GFLOPS
MultiT  SP max:  68.591 GFLOPS
MultiT  DP max:  33.968 GFLOPS
CPU core: 3
FMA: Yes
NEON: Yes

↑정말로 CPU가 3 core였습니다. 모바일 기기에서는 좀처럼 보기 힘들고 Xbox360이나 Wii U 등 게임기에서 많이보이는 구성입니다.

원래 Cyclone은 Apple A7에서도 부동소수점 연산능력이 돌출된 CPU였는데, A8X에서도 거의 같은 경향을 보입니다. 부동소수점 연산능력은 스칼라와 벡터 모두 2 명령 동시 실행이 가능하고, NEON의 128bit 덧곱셈[각주:1]도 병렬로 실행합니다. 동작 클럭은 낮지만, 3 core가 됨으로써 다른 ARM Core의 4 core에 필적하는 수치를 보여줍니다. (아래 표의 (*1))

	      Apple A8X   Snapdragon 800   Tegra K1    Atom Z3745
               Cyclone      Krait 400     Cortex-A15   Silvermont
	      1.5GHz x3     2.2GHz x4     2.2GHz x4    1.83GHz x4
------------------------------------------------------------------
SingleT SP      23.568       17.128        17.136        8.946
SingleT DP      11.751        4.289         3.431        2.797
MultiT  SP(*1)  68.591       67.539        70.174       35.473
MultiT  DP      33.968       16.874        14.036       11.060

 * 수치는 GFLOPS, 값이 클수록 고속
 * 배정밀도(DP)에서 차가 크게 벌어진 것은 ARMv7A(32bit)에 NEON이 없기 때문
 * 최대치이므로 실제 애플리케이션 동작속도와는 다를 수 있음

명령별 로그를 더 자세히 살펴보면, A7에서 왠지 느렸던 배정밀도의 스칼라 덧곱셈 연산이 개선되었음을 알 수 있습니다.

// iPhone 5s (Apple A7)
배정밀도연산
                             실행시간 연산수   연산수
---------------------------------------------------------------
FPU fmul (64bit x1) n8      :  1.642   2436.1   2436.1
FPU fadd (64bit x1) n8      :  1.045   3827.0   3827.0
FPU fmadd (64bit x1) n8     :  3.915   2043.6   2043.6 --- (A-7)
NEON fmul.2d (64bit x2) n8  :  1.567   5105.1   5105.1
NEON fadd.2d (64bit x2) n8  :  1.034   7736.5   7736.5
NEON fmla.2d (64bit x2) n8  :  1.958   8172.1   8172.1 --- (B-7)

↑ Apple A7에서는 FPU fmadd의 덧곱셈(A-7)만 3.915로 이상하게 실행시간이 길었습니다. 같은 덧곱셈이라도 NEON fmla은 그렇게까지 떨어지지 않고, (B-7)을 보면 알 수 있듯 오히려 스칼라보다 고속으로 실행되었습니다.

// iPad Air 2 (Apple A8X)
배정밀도연산
                             실행시간 연산수   연산수
---------------------------------------------------------------
VFP fmul (64bit x1) n8      :  1.442   2773.8   2773.8
VFP fadd (64bit x1) n8      :  0.926   4321.2   4321.2
VFP fmadd (64bit x1) n8     :  1.772   4513.6   4513.6 --- (A-8)
NEON fmul.2d (64bit x2) n8  :  1.408   5681.0   5681.0
NEON fadd.2d (64bit x2) n8  :  0.922   8680.2   8680.2
NEON fmla.2d (64bit x2) n8  :  1.744   9175.5   9175.5 --- (B-8)

↑ Apple A8X에서는 스칼라의 배정밀도 덧곱셈(A-8)도 NEON(B-8)과 같은 속도로 실행되고 있어, Apple A7의 약점이 극복되어있음을 알 수 있습니다.

아래 페이지의 표에 이 연산능력의 차이를 정리했습니다.

관련 글

  1. 실수 두 값을 곱한 후 그 결과를 목표값에 더하는 연산(fd += fn * fm)의 의역 [본문으로]

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

Atom Bay Trail의 부동소수점 연산능력

(원문 : Atom Bay Trail の浮動小数点演算能力)

최근의 Windows Tablet 등에 쓰이는 Bay Trail은 새로운 세대의 Atom CPU core(Silvermont)를 탑재했습니다. HT 없는 2/4 core의 Out-of-Order로, 구 Atom과 비교하여 실행성능이 크게 향상되었습니다.

Bay Trail의 부동소수점 연산능력을 조사해보았습니다. 테스트 환경은 Bay Trail-D (Celeron J1900)으므로 엄밀히 말하자면 Celeron입니다.

그 결과, 단정밀도의 부동소수점 연산능력은 구 Atom과 다르지 않고, 1 core당 6 fop(add 4 + mul 2) / clock이라는 것을 알 수 있었습니다. 구 Atom과 마찬가지로 add, mul의 비대칭적인 interleave에서 좋은 결과가 나왔습니다. 그 대신 배정밀도 연산이 강화되어, 구 Atom의 2배에 상당하는 값이 나왔습니다.

VFP Benchmark의 결과를 통해 구한 cycle 당 연산 (1core 당)

                       Single FP   Double FP
---------------------------------------------------------
Atom Bonnell (구Atom)     6          1.5
Atom Silvermont (신)      6            3 1.5     (Bay Trail)
Core 2 Duo                8            4
Core i7 Sandy Bridge     16            8
Core i7 Ivy Bridge       16            8
Core i7 Haswell          32           16     (미계측, 예상치)

Cortex-A9                 4            1
Cortex-A15                8          1.4
Krait                     8            2     (Snapdragon 800)
Swift                     8            1     (iPhone 5)
Cyclone ARM64            16            8     (iPhone 5s)

연산내용의 내역은 다음과 같습니다.

                       Single FP         Double FP
SIMD(Vector)           mul  add  mad     mul  add  mad
-------------------------------------------------------
Atom Bonnell (구Atom)   2    4   (6)     0.4  0.5    ?
Atom Silvermont (신)    2    4   (6)       1    2   (3)  0.5  1.0  (1.5)
Core 2 Duo              4    4   (8)       2    2  (3?)
Core i7 Sandy Bridge    8    8  (16)       4    4   (8)
Core i7 Ivy Bridge      8    8  (16)       4    4   (8)

Cortex-A9               2    2    4       --   --   --
Cortex-A15              4    4    8       --   --   --
Krait                   4    4    8       --   --   --
Swift                   4    4    8       --   --   --
Cyclone ARM64           8   12   16        4    6    8

Scalar일 때의 결과 등, 보다 자세하게 정리한 표를 아래에 올려놓았습니다.

아래는 실제 J1900의 VFP Benchmark 결과입니다. 연산명령단위 등 보다 자세한 결과를 보시고 싶은 분은 이쪽에서 보시길 바랍니다. 각종 CPU의 로그를 올려놓았습니다.

Bay Traild-D Celeron J1900 2.0GHz (TB:2.5GHz 2.41GHz)

ARCH: x64
FPU: SSSE3 SSE4.1 SSE4.2
SingleT SP max: 14.477 GFLOPS
SingleT DP max:  3.619 GFLOPS
MultiT  SP max: 57.902 GFLOPS
MultiT  DP max: 14.471 GFLOPS
CPU core: 4
SSE: yes
AVX: no
FMA: no
~

이론치는 2GHz 4core로 48 GFLOPS인데, 계측결과 그보다 높은 수치가 나왔습니다. Turbo Boost가 작동하고 있는 것이 원인으로, 57.902 / 24 = 2.41이므로 Multi Thread 시에 대충 2.4GHz로 동작한다는 것을 알 수 있습니다.

다른 CPU와의 비교

VFP Benchmark 실측값        clock core    Single FP     Double FP
-------------------------------------------------------------------
Bay Trail-D  J1900           2.0GHz x4    57.9 GFLOPS   14.5 GFLOPS
Menlow       Atom Z540       1.9GHz x1    10.9 GFLOPS    1.9 GFLOPS
Core 2 Duo   P7350           2.0GHz x2    31.7 GFLOPS   12.7 GFLOPS
Ivy Birdge   Core i5-3210M   2.5GHz x2    90.2 GFLOPS   45.2 GFLOPS
Sandy Bridge Core i7-2720QM  2.2GHz x4   162.3 GFLOPS   74.0 GFLOPS

Kindle HDX 7 Krait 400       2.2GHz x4    67.5 GFLOPS   16.9 GFLOPS
Tegra Note 7 Cortex-A15      1.8GHz x4    51.3 GFLOPS    9.8 GFLOPS
iPhone 5s    Cyclone         1.3GHz x2    40.9 GFLOPS   20.5 GFLOPS

・최대값 비교. GFLOPS가 높을수록 빠름

↑ Multi Thread 시의 비교이므로, Core수가 많고 Clock이 높은 쪽이 결과가 좋습니다.

현저한 Mobile용 CPU의 성능향상으로, 구 Atom(Bonnell/Saltwell)으로는 하이엔드 Quad core ARM과 맞상대를 할 수가 없었습니다만, 새 Atom Silvermont는 충분한 성능을 갖고 있습니다. 다만 부동소수점 연산은 그렇게 뛰어나지 않은 듯 합니다. 아마 AVX에도 대응되는 Jaguar 쪽이 더 위일 겁니다.

또한 Tablet용 Bay Trail-T는 동작 클럭이 내려가므로, 위의 표보다도 성능이 낮아질 거라 생각됩니다.

또, 어디까지나 부동소수점 연산에 특화된 수치이므로, 실제 애플리케이션의 동작속도와는 차이가 있다는 점에 주의하시기 바랍니다. 당 blog가 부동소수점 연산성능의 데이터를 모으는 것은 게임을 개발할 때의 최적화가 목적입니다.

2014/05/15 정정:

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

MediaTek MT8125/8389 Cortex-A7의 부동소수점 연산속도

(원문 : MediaTek MT8125/8389 Cortex-A7 の浮動小数点演算速度)

ARM Cortex-A7은 big.LITTLE에 사용될 때 저전력 CPU core에 해당합니다. 소비전력이 낮은 대신 고성능 CPU core보다 성능이 떨어집니다. VFP Benchmark의 결과를 보내드립니다.

결과를 보면, Cortex-A7의 NEON은 32bit 단위로 실행되고 있음을 알 수 있습니다. 연산속도는 NEON이 없는 CPU와 다르지 않습니다만, Cortex-A15와 페어로 기능하게 하기 위해 NEON 명령셋에 대응하는 것이라 생각됩니다.

SIMD (Vector)         SIMD4 single fp (32bit x4)
CPU                   mul    add     mad     fma
------------------------------------------------------
ARM Cortex-A7         1      1       2       2
ARM Cortex-A8         2      2       4       –
ARM Cortex-A9         2      2       4       –
ARM Cortex-A15        4      4       8       8
Qualcomm Scorpion     4      4       8       –
Qualcomm Krait 400    4      4       8       8
Apple A6 Swift        4      4       8       8
Apple A7 Cyclone 32   8      12      16      16
Apple A7 Cyclone 64   8      12      –       16

  * 수치는 1 cycle당 연산수. 클수록 빠름

big.LITTLE에서 사용되는 경우에는 이런 연산을 Cortex-A15가 담당하므로 표면에 나올 일은 아마 없을 것입니다. 단독으로 사용되는 경우, 같은 Quad core CPU라고 쓰지만 성능차가 상당히 벌어지는 것을 고려하는 것이 좋을 듯 합니다. 부동소수점 연산속도만 봐도 최대연산속도에서 Cortex-A9의 절반, Krait/Cortex-A15의 1/4(동일클럭일 때)가 됩니다.

다음은 상세한 내용입니다.

Lenovo YOGA TABLET 8 (3G)
MediaTek MT8389 1.2GHz Cortex-A7 Quad core

SingleT SP max: 2.374 GFLOPS
SingleT DP max: 1.165 GFLOPS
MultiT  SP max: 9.474 GFLOPS
MultiT  DP max: 4.653 GFLOPS

* VFP/NEON (single fp)
VFP fmuls (32bit x1) n8       :    3.634     1100.7     1100.7
VFP fadds (32bit x1) n8       :    3.450     1159.3     1159.3
VFP fmacs (32bit x1) n8       :    3.451     2318.1     2318.1
VFP vfma.f32 (32bit x1) n8    :    3.448     2319.9     2319.9
NEON vmul.f32 (32bit x2) n8   :    6.795     1177.3     1177.3
NEON vadd.f32 (32bit x2) n8   :    6.828     1171.7     1171.7
NEON vmla.f32 (32bit x2) n8   :    6.810     2349.6     2349.6
NEON vfma.f32 (32bit x2) n8   :    6.797     2354.1     2354.1
NEON vmul.f32 (32bit x4) n8   :   13.529     1182.7     1182.7
NEON vadd.f32 (32bit x4) n8   :   13.511     1184.2     1184.2
NEON vmla.f32 (32bit x4) n8   :   13.498     2370.7     2370.7
NEON vfma.f32 (32bit x4) n8   :   13.549     2361.8     2361.8

배정밀도의 경우에는 더욱 차이가 벌어져, 덧은 1 cycle에 실행할 수 있지만 곱셈은 4배 느립니다. 더욱이 fmacd(덧곱셈[각주:1])은 승산과 동등한 속도로 연산되긴 하지만, vfma(FMA)는 병렬화되지 않아 5배(1 add + 4 mul cycle)나 걸리는 것 같습니다.

* VFP/NEON (double fp)
VFP fmuld (64bit x1) n8       :   13.628      293.5      293.5
VFP faddd (64bit x1) n8       :    3.439     1163.0     1163.0
VFP fmacd (64bit x1) n8       :   13.508      592.2      592.2
VFP vfma.f64 (64bit x1) n8    :   16.895      473.5      473.5
VFP fmuld (64bit x1) ns4      :   13.434      297.8      297.8
VFP faddd (64bit x1) ns4      :    3.435     1164.6     1164.6
VFP fmacd (64bit x1) ns4      :   13.430      595.7      595.7
VFP vfma.f64 (64bit x1) ns4   :   16.823      475.5      475.5
VFP fmuld (64bit x1) n1       :   13.439      297.6      297.6
VFP faddd (64bit x1) n1       :    3.447     1160.6     1160.6
VFP fmacd (64bit x1) n1       :   26.856      297.9      297.9
VFP vfma.f64 (64bit x1) n1    :   26.860      297.8      297.8

관련 글

  1. 실수 두 값을 곱한 후 그 결과를 목표값에 더하는 연산(fd += fn * fm)의 의역. fmacd는 배정밀도 실수의 덧곱셈 명령 [본문으로]

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

VFP Benchmark v1.1 부동소수점 연산 명령의 속도 (NEON/SSE/AVX)

(원문 : VFP Benchmark v1.1 浮動小数点演算命令の速度 (NEON/SSE/AVX))

x86의 SSE/AVX 명령에 대응했습니다. ARM CPU와 마찬가지로 SSE/AVX의 명령속도를 계측할 수 있습니다.

위는 Android입니다만, iOS판에서는 ARMv8A (arm64)에 대응합니다. 다음은 갖고 있는 디바이스에서의 결과입니다.

Device           CPU                             sp GFLOPS  dp GFLOPS
---------------------------------------------------------------------
MacBookRetina13  Core i5-3210M Ivy    2.5GHz x2       90.2       45.2
Kindle HDX 7     MSN8974  Krait 400   2.2GHz x4       67.5       16.9
Tegra Note 7     Tegra4   Cortex-A15  1.8GHz x4       51.3        9.8
Nexus 7 (2013)   AQP8064  Krait       1.5GHz x4       47.8       11.8
iPhone 5s        A7 arm64 Cyclone     1.3GHz x2       40.9       20.5
iPhone 5s        A7 arm7s Cyclone     1.3GHz x2       40.9        8.0
Mac mini 2009    Core2 Duo P7350      2.0GHz x2       31.7       12.7
Nexus 10         Exynos5D Cortex-A15  1.7GHz x2       26.7        5.3
iPad 4           A6X      Swift       1.4GHz x2       21.5        3.6
iPhone 5         A6       Swift       1.3GHz x2       20.1        3.4
Nexus 7 (2012)   Tegra3   Cortex-A9   1.3GHz x4       18.9        4.7
EVO 3D ISW12HT   MSM8660  Scorpion    1.2GHz x2       16.6        1.3
VAIO Type P      Atom Z540 Bonnell    1.8GHz x1       10.9        1.9
Desire X06HT     QSD8250  Scorpion    1.0GHz x1        7.1        0.9
iPad 2           A5       Cortex-A9   1.0GHz x2        7.8        2.0
iPod touch 4     A4       Cortex-A8   0.8GHz x1        3.1        0.1
Raspberry Pi     BCM2835  ARM1176JZFS 0.7GHz x1        0.7        0.7

 * 수치가 클수록 빠름
 * sp= 단정밀도, dp= 배정밀도

최대치를 측정한 것이므로 실제 애플리케이션 속도와는 차이가 있습니다. 자세한 것은 이곳을 참조하시기 바랍니다. 다음 페이지의 이론치 거의 그대로 나오는 경향을 보입니다.

배정밀도 테스트는 아직 개량의 여지가 있습니다. 스칼라에서 mul+add의 페어링을 측정하지 않으므로, 일부 CPU에서 점수가 좀 더 늘어나리라 생각됩니다.

Core i5 Ivy Bridge는 예상한 것 보다 높은 수치가 나왔는데, TurboBoost 효과로 더 높은 클럭으로 동작하는 것 같습니다. single-thread 시에는 3.0GHz, multi-thread 시에는 2.85GHz에 상당하는 결과가 나왔습니다.

실제 측정결과는 명령단위의 수치를 나타내므로, CPU 동작을 보다 자세하게 조사할 수 있습니다.

SSE2/AVX1에는 덧곱셈명령[각주:1]이 없습니다만, Intel CPU는 가산과 승산명령을 병렬로 실행할 수 있는 듯합니다. ↓를 보면 실제로 addps/mulps의 Interleave는 절반 시간으로 실행합니다.

Ivy Bridge Core i5-3210M
* SSE/AVX (single fp)                sec     MFLOPS     MFLOPS
AVX vmulps (32bit x8) n8      :    1.322    24205.7    24205.7
AVX vaddps (32bit x8) n8      :    1.319    24256.0    24256.0
AVX vmul+addps (32bit x8) n8  :    0.658    48604.4    48604.4

↓ Atom (Bonnell)의 경우는 조금 특수합니다. SSE 명령의 승산이 가산보다 2배의 시간이 걸립니다. 동작 클럭을 생각하면 SSE의 add가 128bit이고 mul를 64bit 폭으로 연산하고 있다고 생각됩니다.

Atom Z540 (Bonnell)
* SSE/AVX (single fp)                sec     MFLOPS     MFLOPS
SSE mulps (32bit x4) n8       :    4.307     3715.2     3715.2
SSE addps (32bit x4) n8       :    2.207     7248.1     7248.1
SSE mul+addps (32bit x4) n8   :    2.155     7424.2     7424.2

ARM NEON의 경우, 같은 SIMD라도 64bit 명령이 있습니다. 예를 들어 「vadd.f32 d0,d1,d2」는 단정밀도 32bit x2의 64bit 가산을 처리하므로, Cortex-A8/A9처럼 64bit 폭이라도 1cycle로 실행합니다. 128bit 명령 「vadd.f32 q0,q1,q1」의 경우에는 2cycle 걸립니다.

SSE는 항상 4요소 = 128bit 단위이므로 Pentium 3 등 64bit 폭의 SIMD Unit에서는 최소 2cycle이 걸리게 됩니다. 마찬가지로 Atom의 승산도 최소치는 2cycle입니다. 다만 mulps + addps의 Interleave라도 addps만 쓸 때와 같은 시간에 완료되므로, 가산과 승산은 비대칭이면서도 Overlap될 수 있는 듯 합니다.

Atom에는 HT가 있어 Multi-thread 시에 불필요한 빈틈을 메울 수 있습니다. 메인스레드에서 mulps + addps의 페어를 실행하고, 서브스레드에서 addps만 돌리면 아마도 128bit + 64bit의 비대칭 파이프라인이 메워질 것입니다.

mulps + addps + addps 조합을 2스레드 돌린 결과가 아래로, 점수가 늘어났음을 알 수 있습니다.

Atom Z540 (Bonnell)
* SSE/AVX (single fp) multi-thread   sec     MFLOPS     MFLOPS
SSE ml+ad+addps (32bit x4) n6 :    3.075    10926.6    10926.6

이 측정 결과를 통해 CPU의 개별 연산능력을 정리한 것이 아래의 표입니다. 배정밀도 값은 좀 더 변동될 가능성이 있습니다.

스칼라

                  단정밀도                    배정밀도
CPU               mul    add    mad   fma     mul    add    mad    fma
-----------------------------------------    -------------------------
ARM1176JZF-S      0.5    0.5      1    --     0.5    0.5      1     --
Cortex-A8        0.14   0.14   0.18    --     0.1    0.1    0.1     --
Cortex-A9           1      1      2    --     0.5      1      1     --
Cortex-A15          1      1    1.4     2       1      1    1.4    1.4
Scorpion            1      1      2    --     0.5      1      1     --
Krait 400           1      1      2     2       1      1    1.6      2
A6 Swift            1      1      1     1       1      1      1      1
A7 Cyclone arm7s    1      1      2     2       2      3      3      3
A7 Cyclone arm64    2      3     --     4       2      3     --    1.6
Atom Bonnell        1      1     --    --     0.5      1     --     --
Core2 Penryn        1      1     --    --       1      1     --     --
Core i5 Ivy Bridge  1      1     --    --       1      1     --     --

 * 수치는 1 cycle에 실행가능한 연산수
 * 값이 클수록 고속

ARM11의 mul은 0.5연산/cycle입니다. 다시 말해 단정밀도의 가산이나 승산은 2cycle 걸립니다.

mad/fma는 명령당 2연산이므로, 이 란이 2의 경우에는 1cycle로 실행할 수 있음을 의미합니다.

Cortex-A8의 최대 FLOPS는 NEON 덕분에 ARM11 보다 높지만, 위에 적은 대로 VFP의 스칼라 연산에서는 ARM11에 집니다.

A7 Cyclone (ARMv8A)은 AArch32 (32bit mode)와 AArch64 (64bit mode)에 상당한 차이가 있습니다. 단정밀도 연산은 64bit mode 쪽이 수배 빠르게 실행되는 것 같습니다. 아마도 VFP가 요구하는 사양이 NEON과 다르기 때문이라 생각됩니다. AArch64는 NEON으로 통일되었기에, NEON과 동등한 속도로 동작되는 것 같습니다. VFP가 발을 붙잡는 것처럼 보이는 경향은 Cortex-A15등 다른 ARMv7A CPU에서도 보입니다.

SIMD 단정밀도

                   SIMD2 (32bit x 2)         SIMD4 (32bit x4)
CPU                mul   add   mad   fma     mul   add   mad   fma  
----------------------------------------    ----------------------
ARM1176JZF-S        --    --    --    --      --    --    --    --
Cortex-A8            2     2     4    --       2     2     4    --
Cortex-A9            2     2     4    --       2     2     4    --
Cortex-A15           4     4     8     8       4     4     8     8 
Scorpion             2     2     4    --       4     4     8    -- 
Krait 400            2     2     4     4       4     4     8     8 
A6 Swift             2     2     4     4       4     4     8     8 
A7 Cyclone arm7s     4     6     8     8       8    12    16    16 
A7 Cyclone arm64     4     6    --     8       8    12    --    16
Atom Bonnell        --    --    --    --       2     4    (6)   --
Core2 Penryn        --    --    --    --       4     4    (8)   --
Core i5 Ivy Bridge  --    --    --    --       4     4    (8)   --

Cortex-A8/A9는 64bit 폭이라 SIMD2에서는 Scorpion/Krait/Swift와 차이가 없습니다. SIMD4에서는 128bit의 Scorpion/Krait/Swift의 절반이라는 것을 알 수 있습니다.

특이한 것은 Cortex-A15로, SIMD4에서는 같은 128bit인 Scorpion/Krait/Swift와 동등합니다만 SIMD2에서는 2배의 수치를 나타냅니다. Cortex-A15는 64bit폭 2pipe라서 2명령 동시실행이 가능하기 때문입니다. 스칼라에서는 단정밀도도 1명령/cycle이기 때문에, 절반밖에 쓰지 못한다고 해도 NEON 쪽이 빠릅니다.

Ivy Bridge는 AVX에 대응하므로, 위의 표에서는 생략되어 있지만 SIMD8이 있습니다. 아래 페이지에 SIMD8과 배정밀도 SIMD를 포함한 표를 정리했습니다.

제일 위쪽에 있는 GFLOPS 리스트에서는 Quad core 및 동작 클럭이 높은 Snapdragon 800 (MSM8974)가 상위였습니다. CPU의 cycle 단위 명령수를 내보면, 유일한 ARMv8 CPU이기도 한 A7 Cyclone이 발군의 고성능임을 알 수 있습니다.

계측결과를 보면 mul, mad/fma는 2명령, add는 3명령을 동시에 실행할 수 있는 듯 합니다. NEON의 경우에는 AArch32와 AArch64에 딱히 차이는 없었습니다.

A7 Cyclone의 설계는 DEC Alpha나 StrongARM 출신의 엔지니어가 관련되어있다고 합니다. (Wikipedia P.A.Semi)

Benchmark는 어디까지나 부동소수점 연산능력의 최대치를 실측하는 것이 목적이므로, 반드시 종합적인 우세와 일치하지 않음을 미리 양해바랍니다.

관련 글

  1. 積和의 의역. 두 수를 곱한 후 다른 수에 더하는 명령 [본문으로]

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

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에 최적화될지도 모릅니다.

관련글

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

Nexus 10 CPU Cortex-A15의 속도

(원문 : Nexus 10 CPU Cortex-A15 の速度)

지난회에는 부동소수점에 대해서만 다뤘습니다만, Cortex-A15로 다른 테스트도 해봤습니다.

지난회의 부동소수점 연산에서는 Cortex-A15가 가장 좋은 결과를 냈습니다. 코어 단독의 피크 성능은 Swift/Krait와 동일하지만, 64비트 2파이프 덕분에 연산효율이 높게 나왔다는 인상이었습니다.

                                  time(sec)  MB/sec  MBPS/GHz
-------------------------------------------------------------
Exynos 5D  Cortex-A15 1.7GHz  x2   1.49      72.61    42.71
A6X        Swift      1.4GHz? x2   1.75      61.82    44.16?
APQ8064    Krait      1.5GHz  x4   2.28      47.64    31.82

싱글 스레드 코어 1개에서의 비교입니다.

이번 테스트에는 NEON이나 부동소수점이 포함되어 있지 않습니다. 이 경우 동일 클럭에서의 실행 성능은 대체로 Swift과 비슷한 듯 합니다. A6X보다 Exynos 5 Dual 쪽이 동작클럭이 높은만큼, 리스트 안에서는 Nexus 10이 가장 좋은 성적을 냈습니다.

Krait는 유일한 4코어라 절대적인 속도는 빼어나지만 단독으로는 그다지 성능이 나오지 않았습니다. 부동소수점 연산 성능은 좋았지만, 이쪽 테스트에서는 다른 CPU와 차이가 벌어지는 형태가 되었습니다.

머지않아 Tegra4/Exynos 5 Octa 등 Cortex-A15의 쿼드코어가 나오므로 시스템 전체의 퍼포먼스는 상당히 좋은 성적을 낼 듯 합니다. Atom으로는 비교가 되지 않으므로, Core i는 둘째치더라도 다른 CPU와 비교하고 싶어지는 기분을 알 것 같습니다.

+ Recent posts