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

ARM Cortex-A53의 부동소수점 연산속도와 컴파일 시간 비교

(원문 : ARM Cortex-A53 の浮動小数点演算速度とコンパイル時間の比較)

Qualcomm의 DragonBoard 410c를 입수하였기에 vfpbench를 돌려보았습니다.

Snapdargon 410 Cortex-A53 1.2GHz quad core
OSarchSP-STDP-STSP-MTDP-MT
Android 5.1AArch649.3774.73730.81715.063
Android 5.1AArch329.4422.55829.2907.753
  • 단위는 GFLOPS, 수치가 높을수록 고속
  • SP=single fp, DP=double fp, ST=single thread, MT=multi thread

Cortex-A53는 big.LITTE의 LITTLE에 사용되는 코어로, Cortex-A7와 마찬가지로 in-order의 파이프라인을 갖고 있습니다. 하지만 부동소수점 연산의 최고속도는 예상 이상으로 높은 결과를 냈습니다.

위 결과가 사실이라면 Cortex-A7 대비 VFP에서 2배, NEON single에서는 최대 4배 빠르다는 것이 됩니다. 또 동일 클럭 및 최대치만으로 한정하면 big 코어에도 견줄 수 있습니다. 그러나 in-order에 동작 클럭도 낮기 때문에 실제 코드에서는 big 코어와는 상당한 차이가 생길 것이라 생각됩니다. 배정밀도 연산의 병렬성도 떨어지는 것 같습니다.

CPU corearchSP-STDP-STSP-MTDP-MTSoCclock
Cortex-A7armv7a2.3741.1659.4744.653MT81251.2GHz x4
Cortex-A53arm649.3774.73730.81715.063APQ80161.2GHz x4
Cortex-A53armv7a9.4422.55829.2907.753APQ80161.2GHz x4
Cortex-A72arm6415.8647.93431.77115.885MT8173C2.0GHz x2
Cortex-A72armv7a15.8757.94631.75615.882MT8173C2.0GHz x2
Cyclone 2arm6423.56811.75168.59133.968AppleA8X1.5GHz x3
Denverarm6417.9068.76234.88817.601TegraK12.3GHz x2

Linux 상에서 컴파일 속도도 측정해보았습니다. RAM이 적기는 하지만 충분한 속도가 나옵니다. 클럭 차이를 생각해도 데스크탑 CPU와의 차이가 적어지고 있다는 것을 잘 알 수 있습니다.

CPUcoreclockC/TCompilerRAMsec
Core i7-4790KHaswell4.0GHz4C8TClang-3.616GB15
Celeron J1900Silvermont2.0GHz4C4TClang-3.48GB79
Athlon 5350Jaguar2.0GHz4C4TClang-3.68GB88
Celeron 2955UHaswell1.4GHz2C2TClang-3.44GB93
Celeron N3150Airmont1.6GHz4C4TClang-3.616GB108
DragonBoard 410cCortex-A531.2GHz4C4TClang-3.51GB186
Raspberry Pi 2Cortex-A70.9GHz4C4TClang-3.51GB402
Atom Z540Bonnell1.8GHz1C2TClang-3.42GB426
Raspberry PiARM11760.7GHz1C1TClang-3.50.5GB1893
NetwalkerCortex-A80.8GHz1C1TGCC-4.70.5GB1902
* sec = 컴파일 시간(초), 수치가 낮을수록 고속
* Dragonboard 401c = Debian 8.0

RAM이 적은 디바이스는 스토리지 속도의 영향의 크다는 점에 주의하시기 바랍니다. 특히 Raspberry Pi 계열은 SD 카드에 의존하므로 참고만 하시기 바랍니다.

아래 페이지를 갱신했습니다.

관련 글

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

Android 5.0 Nexus Player x86과 대응 ABI

(원문 : Android 5.0 Nexus Player x86 と対応 ABI)

Android는 5.0부터 64bit CPU에 대응합니다. Android에서의 첫 64bit device는 Nexus 9입니다. 물론 상위호환성이 있어서 종래의 32bit ARM Native code도 실행가능합니다. 32bit ARM에는 2종류의 ABI가 존재하므로 전부 3종류입니다.

ARMv8A AArch64  arm64-v8a
ARMv7A          armeabi-v7a
ARMV5TE         armeabi

Android 4.4까지는 동시에 2종류의 ABI에 대응할 수 있었습니다. Android 5.0 이후는 위에 적은 대로 3개 이상 지정할 수 있게 되었습니다.

동시에 발표된 Nexus Player는 Nexus 첫 Intel CPU (Atom Z35xx) 탑재 단말입니다. OS도 Android 5.0이지만, 아쉽게도 64bit(x86_64)가 아니라 32bit(x86)로 동작하는 것 같습니다.

ro.product.cpu.abi=x86
ro.product.cpu.abi2=armeabi-v7a
ro.product.cpu.abilist=x86,armeabi-v7a,armeabi
ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi
ro.product.cpu.abilist64=

이전에 알아본대로, Android x86 단말은 Binary Translator를 통해 ARM의 Native code를 실행할 수 있습니다. 같은 x86(32bit)이라도 5.0 이후라면 3종류 지정할 수 있으므로, Nexus Player의 경우 armeabi도 포함되어있다는 것을 알 수 있습니다.

Device       Android CPU           ABI
-------------------------------------------------------------------
Nexus 5         5.0  Krait 400                armeabi-v7a  armeabi
Nexus 9         5.0  Denver        arm64-v8a  armeabi-v7a  armeabi
Nexus Player    5.0  Silvermont    x86        armeabi-v7a  armeabi
MeMO Pad ME176  4.4  Silvermont    x86        armeabi-v7a

Android 5.0부터는 지금까지 x86에서 돌지 않던 앱도 돌아가게 될 지도 모릅니다. 장래 x64(x86_64) 단말이 등장하면 x86_64를 포함하여 4종류가 됩니다.

관련글

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

BayTrail vs Kabini (Celeron J1900 vs Athlon 5350)

(원문 : BayTrail vs Kabini (Celeron J1900 vs Athlon 5350))

저소비전력 Desktop PC용 CPU로 Intel에서는 BayTrail-D, AMD에서는 Kabini가 등장했습니다. BayTrail-D Celeron J1900과 Kabini Athlon 5350 모두 4 core CPU + 마더보드로 딱 1만엔. 가격대도 스펙도 많이 닮았기에 비교해봤습니다.

                    BayTrail-D              Kabini
                    Celeron J1900         Athlon 5350
-----------------------------------------------------
CPU core             Silvermont             Jaguar
CPU cores                4                    4
CPU clock            2.0-2.41GHz           2.05GHz
RAM                DDR3-1333 dual         DDR3-1600
MEM BW                21.3GB/s             12.8GB/s
L2                      2MB                  2MB
SSE                    SSE4.2               SSE4.2
AVX                      --                  AVX
AES                      --                 AES-NI
CPU SP              24 fop/clock         32 fop/clock
CPU SP FLOPS        57.81 GFLOPS          65.6 GFLOPS
CPU DP               6 fop/clock         12 fop/clock
CPU DP FLOPS        14.46 GFLOPS          24.6 GFLOPS
GPU core         Intel HD Graphics 3G    RADEON R3 (GCN)
GPU clock            688-854MHz             600MHz
GPU SP              64 fop/clock         256 fop/clock
GPU SP FLOPS         54.7 GFLOPS         153.6 GFLOPS
OpenGL Windows       OpenGL 4.0           OpenGL 4.3
OpenGL Linux         OpenGL 3.3           OpenGL 4.3
TDP                     10W                  25W

부동소수점 연산능력

VFP Benchmark     Celeron J1900    Athlon 5350
-------------------------------------------------
SingleT SP max:   14.477 GFLOPS    15.943 GFLOPS
SingleT DP max:    3.619 GFLOPS     6.127 GFLOPS
MultiT  SP max:   57.902 GFLOPS    63.737 GFLOPS
MultiT  DP max:   14.471 GFLOPS    24.504 GFLOPS

・값이 클수록 고속

전전회에 예상했던대로 부동소수점 연산능력은 Jaguar (Kabini/Athlon) 쪽이 높게 나타나고 있습니다. J1900 (BayTrail)은 높은 동작 클럭으로 보충하는 모습입니다.

연산능력/clock    Single FP   Double FP
-----------------------------------------------
Celeron J1900         6          1.5
Athlon 5350           8            3

재측정한 후에 깨달았습니다만, 예전 글에서 J1900의 배정밀도 연산의 성능평가가 잘못되어 있었습니다. 아래 글은 정정했습니다. 죄송합니다.

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

전회의 컴파일 속도비교를 Kabini에서도 해봤습니다. 놀랄정도로 팽팽합니다.

flatlib3 Linux       clock  core  RAM   OS   arch compiler    time sec
-------------------------------------------------------------------------
Kabini Athlon 5350  2.05GHz  x4   8GB  14.04  x64  clang-3.5    54.8
BayTrail-D J1900    2.41GHz  x4   8GB  14.04  x64  clang-3.5    54.6

・time이 작을수록 고속

테스트한 환경은 다음과 같습니다.

Test 환경
Celeron J1900 (Q1900B-ITX DDR3-1333 dual   8GB  21.3GB/s)
Athlon 5350   (AM1l       DDR3-1333 single 8GB  10.7GB/s)

Kabini는 DDR3-1600를 사용할 수 있습니다만, 테스트 환경에서는 갖고 있던 DDR3-1333를 사용했습니다. 본래 능력보다도 스코어가 낮아질 것이 예상되므로 미리 양해바랍니다.

AES 변환 테스트

AES CTR 599MByte  Celeron J1900    Athlon 5350
-------------------------------------------------
Table1               18.708          18.964
Table2               15.409          14.600
Table3               14.902          12.374
AES-NI                   --           4.238

・단위는 초, 값이 적은 쪽이 고속, Single Thread

AES-NI를 쓸 수 있는 Jaguar (Athlon/Kabini) 쪽이 고속입니다. 같은 알고리즘을 사용하는 경우에도 미세하게 Jaguar 쪽이 빠른 것 같습니다. 메모리 속도, CPU 동작 클럭 모두 J1900 (BayTrail)가 높으므로 Jaguar (Athlon/Kabini)의 Core 성능 자체가 높음을 알 수 있습니다.

단순한 신의 렌더링 속도 비교

Ubuntu 14.04   GPU                    API            fps
----------------------------------------------------------
Celeron J1900  Intel HD Graphics 3G   OpenGL 3.3     17fps
Athlon 5350    RADEON R3              OpenGL 4.3     89fps

・fps가 높은 쪽이 빠름

비교할 것도 없이 내장 GPU의 성능에서는 압도적인 차이가 납니다. RADEON은 OpenGL에서 신 API를 쓸 수 있다는 점에서도 높은 점수를 받을 수 있습니다. J1900의 GPU는 사용하고 있으면 다소 성능부족이 느껴집니다.

CPU core의 기본성능은 Jaguar (Athlon/Kabini) 쪽이 위. 메모리 속도나 동작 클럭을 가미하면 양쪽이 상당히 비슷한 성능이 됩니다.

GPU는 당연히 RADEON (Athlon/Kabini) 쪽이 빠르고, 성능차에는 몇배의 간격이 있습니다.

● BayTrail-D (Celeron J1900/Silvermont)
  • 소비전력이 낮고 팬리스
  • 메모리 대역이 넓음
  • ● Kabini (Athlon 5350/Jaguar)
    • 부동소수점 연산능력이 높음
    • AVX/AES 명령에 대응
    • GPU 성능이 매우 높음

    관련글

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

    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. 積和의 의역. 두 수를 곱한 후 다른 수에 더하는 명령 [본문으로]

    + Recent posts