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

Raspberry Pi 3의 속도비교, Cortex-A53의 속도

(원문 : Raspberry Pi 3 の速度比較, Cortex-A53 の速度)

Raspberry Pi 3를 입수했기에 간단하게 벤치마크를 해봤습니다.

비슷한 스펙의 DragonBoard 410c (Snapdragon 410)가 작년에 발매되었습니다. CPU는 Cortex-A53 1.2GHz quad로 거의 동등, 둘 다 온보드로 Wi-Fi/BT를 탑재했습니다. RAM은 Pi 3 쪽이 살짝 느리고 내장 스토리지도 없습니다만, 가격은 절반 이하입니다. 조금 아쉬운 건 Pi 3의 OS가 32bit라는 것입니다. DragonBoard 쪽은 64bit로 동작합니다.

평소 하던대로 컴파일 시간을 비교해봤습니다. (Time이 작을수록 고속)

DeviceTime
Raspberry Pi 3175 sec ( 2m55s)10.8x
DragonBaord 410c186 sec ( 3m06s)10.1x
Raspberry Pi 2402 sec ( 6m42s)4.7x
Raspberry Pi1893 sec (31m33s)1.0x

역시 DragonBaord 410c와 비슷한 수치가 나왔습니다. SD Card의 차이도 있기에 딱 잘라 말할수는 없습니다만, 초대와 비교하여 대충 10배, Pi 2과 비교해도 2배 이상 고속입니다.

스펙 포함&보다 많은 기기와 비교하면 다음과 같습니다.

DevicecoreclockC/T64RAMTime
Core i7-4790KHaswell4.0GHz4/8Y16GB15 sec ( 0m15s)
Celeron J1900Silvermont2.0GHz4/4Y8GB88 sec ( 1m28s)
Athlon 5350Jaguar2.0GHz4/4Y8GB88 sec ( 1m28s)
Celeron 2955UHaswell1.4GHz2/2Y4GB93 sec ( 1m33s)
Celeron N3150Airmont1.6GHz4/4Y16GB108 sec ( 1m48s)
Raspberry Pi 3Cortex-A531.2GHz4/4N1GB175 sec ( 2m55s)
DragonBaord 410cCortex-A531.2GHz4/4Y1GB186 sec ( 3m06s)
Raspberry Pi 2Cortex-A70.9GHz4/4N1GB402 sec ( 6m42s)
Atom Z540Bonnell1.8GHz1/2N2GB426 sec ( 7m06s)
Raspberry PiARM11760.7GHz1/1N0.5GB1893 sec (31m33s)
NetwalkerCortex-A80.8GHz1/1N0.5GB1902 sec (31m42s)
・C/T = Core 수/Thread 수

vfp benchmark의 비교는 이쪽 (단위는 GFLOPS, 수치가 클수록 빠름)

DevicearchSP-STDP-STSP-MTDP-MT
DragonBoard 410cARMv8A9.4984.74937.96518.603
Raspberry Pi 3ARMv7A9.4312.47737.4429.994
Raspberry Pi 2ARMv7A1.7910.8777.0873.472
Raspberry PiARMv60.6740.6740.6740.674
・SP=단정밀도, DP=배정밀도, ST=SingleThread, MT=MultiThread

어디까지다 최대치이므로 실제 소프트웨어에서는 이정도로 차이가 나지 않습니다만, 잠재력으로 보자면 Pi 2의 5배 이상의 차이가 납니다. (SIMD에서 4배 x clock 차이) 단정밀도에서는 초대 Pi와 비교하여 55배나 빠릅니다. 장래에 64bit에 대응하면 배정밀도 연산도 DragonBoard와 비슷할 정도의 속도로 상승할 것입니다.

Cortex-A53는 big.LITTLE의 LITTLE로 사용됩니다만, 부동소수점 연산에서는 A7에서 대폭으로 확장되어 big core에 가까운 구성이 되었습니다. 아래 슬라이드 사진에서도 「2 배정밀도 MAC / cycle」「4 단정밀도 MAC / cycle」이라는 것을 알 수 있습니다.

또한 하위 모델인 Cortex-A35가 등장예정이고, 이쪽이 본래 Cortex-A7에 상당하는 64bit 프로세서가 될 것이라 생각됩니다.

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

관련글

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

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 Nexus 6 Adreno 420도 OpenGL ES 3.1 AEP 대응 (Direct3D 11 상당)

(원문 : Android Nexus 6 Adreno 420 も OpenGL ES 3.1 AEP 対応 (Direct3D 11相当))

Nexus 6의 GPU Adreno 420는 OpenGL ES 3.1 AEP(Android Extension Pack)에 대응한다는 것을 알게 되었습니다.

OpenGL ES 3.1은 ComputeShader에 대응합니다. 거기에 더해 OpenGL ES 3.1 AEP에서는 Tessellator (HullShader/DomainShader,TCS/TES)나 GeometryShader 등 Direct3D 11 상당하는 기능이 추가욉니다.

지금까지 판명된 OpenGL ES 3.0 이상에 대응하는 GPU

                SoC               GPU           OpenGL
------------------------------------------------------------------
Kindle Fire HD6 MediaTek MT8135   PowerVR G6430 OpenGL ES 3.0
iPhone/iPad     Apple A7/A8       PowerVR G6430 OpenGL ES 3.0
MeMO Pad ME176  BayTrail-T Z3745  HD Graphics   OpenGL ES 3.0
LG G Watch W100 Snapdragon 400    Adreno 305    OpenGL ES 3.0
Nexus 7(2013)   Snapdragon S4 Pro Adreno 320    OpenGL ES 3.0
Nexus 5         Snapdragon 800    Adreno 330    OpenGL ES 3.0

Nexus 10        Exynos 5 Dual     Mali-T604     OpenGL ES 3.1

Nexus 6         Snapdragon 805    Adreno 420    OpenGL ES 3.1 AEP
Nexus 9         NVIDIA Tegra K1   Kepler(192)   OpenGL ES 3.1 AEP

Nexus 9의 Tegra K1에 이어, 신형 Nexus는 둘다 AEP에 대응하게 되었습니다.

이하 Nexus 6 Snapdargon 805 APQ8084의 GL Extension

Extension:
GL_EXT_debug_marker
GL_OES_EGL_image
GL_OES_EGL_image_external
GL_OES_EGL_sync
GL_OES_vertex_half_float
GL_OES_framebuffer_object
GL_OES_rgb8_rgba8
GL_OES_compressed_ETC1_RGB8_texture
GL_AMD_compressed_ATC_texture
GL_KHR_texture_compression_astc_ldr
GL_OES_texture_npot
GL_EXT_texture_filter_anisotropic
GL_EXT_texture_format_BGRA8888
GL_OES_texture_3D
GL_EXT_color_buffer_float
GL_EXT_color_buffer_half_float
GL_QCOM_alpha_test
GL_OES_depth24
GL_OES_packed_depth_stencil
GL_OES_depth_texture
GL_OES_depth_texture_cube_map
GL_EXT_sRGB
GL_OES_texture_float
GL_OES_texture_float_linear
GL_OES_texture_half_float
GL_OES_texture_half_float_linear
GL_EXT_texture_type_2_10_10_10_REV
GL_EXT_texture_sRGB_decode
GL_OES_element_index_uint
GL_EXT_copy_image
GL_EXT_geometry_shader
GL_EXT_tessellation_shader
GL_OES_texture_stencil8
GL_EXT_shader_io_blocks
GL_OES_shader_image_atomic
GL_OES_sample_variables
GL_EXT_texture_border_clamp
GL_EXT_multisampled_render_to_texture
GL_OES_shader_multisample_interpolation
GL_EXT_draw_buffers_indexed
GL_EXT_gpu_shader5
GL_EXT_robustness
GL_EXT_texture_buffer
GL_OES_texture_storage_multisample_2d_array
GL_OES_sample_shading
GL_OES_get_program_binary
GL_EXT_debug_label
GL_KHR_blend_equation_advanced
GL_KHR_blend_equation_advanced_coherent
GL_QCOM_tiled_rendering
GL_ANDROID_extension_pack_es31a
GL_EXT_primitive_bounding_box
GL_OES_standard_derivatives
GL_OES_vertex_array_object
GL_KHR_debug

관련 글

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

Android Wear Sony SmartWatch 3 SWR50는 빠르다

(원문 : Android Wear Sony SmartWatch 3 SWR50 は速い)

Sony SmartWatch3의 vfpbench 스코어를 보내주신 분이 계십니다. LG G Watch (LG-W100)보다 빠르며, 실제로 1.2GHz로 작동하는 것으로 판단됩니다. 아직 제대로 확인하지는 않았습니다만 2 core가 살아있을 가능성도 있습니다.

// SmartWatch 3 SWR50
// MSM8226 Cortex-A7 1.2GHz x4 (1.2GHz x2?)

ARCH: ARMv7A
CPU core: 4
VFP: VFPv4-D32 NEON
FMA: Yes
NEON: Yes
Result
  SingleT SP max:  2.257 GFLOPS
  SingleT DP max:  1.144 GFLOPS
  MultiT  SP max:  4.946 GFLOPS
  MultiT  DP max:  2.278 GFLOPS

Motorola Moto 360이외에는 전부 같은 Snapdragon 400 (MSM8226)의 나열이었습니다만, 예상외로 차이가 있는 것 같습니다.

device                SoC             CPU       SoC의 spec  실질
----------------------------------------------------------------------
LG G Watch   LG-W100  Snapdragon 400  Cortex-A7 1.2GHz x4   0.8GHz x1
LG G Watch R LG-W110  Snapdragon 400  Cortex-A7 1.2GHz x4   ?
Galaxy Gear Live      Snapdragon 400  Cortex-A7 1.2GHz x4   ?
ASUS ZenWatch WI500Q  Snapdragon 400  Cortex-A7 1.2GHz x4   ?
SmartWatch 3 SWR50    Snapdragon 400  Cortex-A7 1.2GHz x4   1.2GHz x2?
Motolora Moto 360     TI OMAP3630     Cortex-A8 1.0GHz x1   1.0GHz x1

마찬가지로 Motorola Moto 360의 결과도 받았기에 아래에 정리합니다. 스코어로 보아 이쪽은 Cortex-A8의 1.0GHz로 움직이는 물건이라 보여집니다.

device (4.4W.2)       SP-ST   DP-ST   SP-MT   DP-MT
-----------------------------------------------------------
LG G Watch LG-W100    1.419   0.742   1.367   0.676  GFLOPS
SmartWatch 3 SWR50    2.257   1.144   4.946   2.278  GFLOPS
Motolora Moto 360     3.739   0.126   3.376   0.125  GFLOPS

  * SP=단정밀도, DP=배정밀도, ST=SingleThread, MT=MultiThread

언뜻 Moto 360가 가장 빠른 것처럼 보일지도 모릅니다. 최대값이 돌출되어있는 것은 Cortex-A8가 64bit 폭의 NEON ALU를 갖고 있기 때문입니다. (Cortex-A7는 32bit폭)

실제로는 세대가 오래된 SoC를 채용하고 있으며 Moto360의 CPU Core도 몇세대 전의 물건입니다. 배정밀도(DP)의 결과를 보면 알 수 있듯, VFP 연산에서는 다른 CPU의 1/5 이하의 속도입니다. 부동소수점 연산을 많이 사용하는 일반적인 애플리케이션(NEON 미사용)에서는 아마 Moto 360 쪽이 느릴겁니다. 이에 관한 것은 VFP Bencmark에서 명령별 수치를 비교해보면 잘 알 수 있습니다.

자세한 로그를 다음 페이지에 추가했습니다.

만약 다른 장치의 로그를 갖고 있는 분이 계시다면 꼭 보내주시기 바랍니다.

관련 글

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

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

관련글

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

(Kindle) Fire HD 6는 OpenGL ES 3.0에 대응하는 비대칭 4 core CPU

(원문 : (Kindle) Fire HD 6 は OpenGL ES 3.0 対応で非対称 4 core CPU)

Amazon의 새 Tablet인 Fire HD 6는 Android 4.4 기반의 Fire OS 4.1을 탑재했습니다. Android 4.4, API Level 19이 됨으로써 GPU가 대응하면 OpenGL ES 3.0를 쓸 수 있게 되었습니다.

아래는 Fire HD 6의 결과입니다.

GL_VERSION: OpenGL ES 3.0 build 1.3@2876724
GL_RENDERER: PowerVR Rogue Han
GL_VENDOR: Imagination Technologies
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.00 build 1.3@2876724

SoC는 MediaTek MT8135으로, 비대칭의 4 core CPU에 PowerVR G6200를 탑재합니다. Extension과 대응하는 압축 텍스처는 다음과 같습니다.

Extension:
GL_OES_rgb8_rgba8
GL_OES_depth24
GL_OES_vertex_half_float
GL_OES_texture_float
GL_OES_texture_half_float
GL_OES_element_index_uint
GL_OES_mapbuffer
GL_OES_fragment_precision_high
GL_OES_compressed_ETC1_RGB8_texture
GL_OES_EGL_image
GL_OES_EGL_image_external
GL_OES_EGL_sync
GL_OES_required_internalformat
GL_OES_depth_texture
GL_OES_get_program_binary
GL_OES_packed_depth_stencil
GL_OES_standard_derivatives
GL_OES_vertex_array_object
GL_OES_texture_npot
GL_OES_surfaceless_context
GL_EXT_discard_framebuffer
GL_EXT_multi_draw_arrays
GL_EXT_multisampled_render_to_texture
GL_EXT_shader_texture_lod
GL_EXT_texture_filter_anisotropic
GL_EXT_texture_format_BGRA8888
GL_EXT_blend_minmax
GL_EXT_texture_rg
GL_EXT_occlusion_query_boolean
GL_EXT_color_buffer_float
GL_EXT_shader_framebuffer_fetch
GL_EXT_separate_shader_objects
GL_EXT_robustness
GL_EXT_draw_buffers
GL_IMG_shader_binary
GL_IMG_texture_compression_pvrtc
GL_IMG_texture_compression_pvrtc2
GL_IMG_texture_npot
GL_IMG_texture_format_BGRA8888
GL_IMG_read_format
GL_IMG_program_binary
GL_IMG_multisampled_render_to_texture
GL_KHR_debug

TextureFormat 17
00=8c01  GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG
01=8c03  GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG
02=8c00  GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG
03=8c02  GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG
04=9137  GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG
05=9138  GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG
06=8d64  GL_ETC1_RGB8_OES
07=9274  GL_COMPRESSED_RGB8_ETC2
08=9275  GL_COMPRESSED_SRGB8_ETC2
09=9278  GL_COMPRESSED_RGBA8_ETC2_EAC
10=9279  GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
11=9276  GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
12=9277  GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
13=9271  GL_COMPRESSED_SIGNED_R11_EAC
14=9270  GL_COMPRESSED_R11_EAC
15=9273  GL_COMPRESSED_SIGNED_RG11_EAC
16=9272  GL_COMPRESSED_RG11_EAC

ETC2/EAC만이 아니라 PVRTC2(PVRTCv2)에도 대응하고 있음을 알 수 있습니다. 같은 Series 6이라도 iOS에서는 PVRTCv2에 대응하지 않았습니다. PVRTCv2는 ETC2와 마찬가지로, 상위호환성을 가지면서 모드 분기에 따른 화질향상을 이룬 2세대 압축 포맷입니다.

1세대     2세대
-------------------
ETC1      ETC2/EAC
PVRTCv1   PVRTCv2
                          PVRTCv1  PVRTCv2  ETC1  ETC2/EAC
----------------------------------------------------------
Android PowerVR Series 5    Y        -       Y       -
Android PowerVR Series 6    Y        Y       Y       Y
iOS PowerVR Series 5        Y        -       -       -
iOS PowerVR Series 6        Y        -       Y*1     Y

 *1 ETC2 は ETC1 の上位互換性があるため ETC1 の読み込みも可能

CPU는 Cortex-A15 x2와 Cortex-A7 x2의 big.LITTLE 구성입니다. 실제로 테스트해보니 HMP가 유효화된듯 앱에서 4 core로 인식됨을 알 수 있습니다. 부하를 건 상태는 다음과 같습니다. 4 core 모두 활성화되어있습니다.

$ cat /sys/devices/system/cpu/online
0-3

$ cat /proc/cpuinfo
Processor	: ARMv7 Processor rev 3 (v7l)
processor	: 0
BogoMIPS	: 31.81
Features	: swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x0
CPU part	: 0xc07
CPU revision	: 3

Processor	: ARMv7 Processor rev 3 (v7l)
processor	: 1
BogoMIPS	: 31.81
Features	: swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x0
CPU part	: 0xc07
CPU revision	: 3

Processor	: ARMv7 Processor rev 2 (v7l)
processor	: 2
BogoMIPS	: 35.06
Features	: swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x3
CPU part	: 0xc0f
CPU revision	: 2

Processor	: ARMv7 Processor rev 2 (v7l)
processor	: 3
BogoMIPS	: 26.00
Features	: swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x3
CPU part	: 0xc0f
CPU revision	: 2

Hardware	: MT8135
Revision	: 000f 000a
Serial		: 0000000000000000

미들클래스에서도 Cortex-A7 Quad의 구성이 늘어나고 있는 가운데, 1만엔 전후의 가격대이면서 Cortex-A15를 탑재하고 있다는 점이 커다란 특징이라 할 수 있겠습니다. Cortex-A15와 Cortex-A7는 수배의 성능차가 있는만큼 HMP(GTS)에서 스케줄러가 어떻게 작업을 분배하는지가 흥미로운 부분입니다.

다음 페이지를 갱신했습니다.

관련글

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

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 정정:

+ Recent posts