ユーザ用ツール

サイト用ツール


opengl:cpubench

CPU benchmark

CPU single core test

SoC / CPU mobile cc build ISA time (sec) MB/sec MBps/GHz device name
A7 Cyclone 1.3GHz? x2 clang 5.0 ARMv8 AArch64 (arm64) 1.04 104.27 80.21 iPhone 5s
A7 Cyclone 1.3GHz? x2 clang 5.0 ARMv8 AArch32 (armv7s) 1.16 93.04 71.57 iPhone 5s
MSM8974 Krait 400 2.2GHz x4 gcc 4.8 ARMv7A 1.41 76.67 34.85 Kindle HDX 7 2013
Exynos 5D Cortex-A15 1.7GHz x2 gcc 4.6 ARMv7A 1.49 72.61 42.71 Nexus 10
A6X Swift 1.4GHz? x2 clang 4.2 ARMv7A(armv7s) 1.75 61.82 44.16? iPad 4
A6 Swift 1.3GHz? x2 clang 4.2 ARMv7A(armv7s) 1.87 57.96 44.58? iPhone 5
APQ8064 Krait 1.5GHz x4 gcc 4.6 ARMv7A 2.28 47.64 31.82 Optimus G LGL21
APQ8060 Scorpion 1.5GHz x2 gcc 4.4.3 ARMv7A 2.54 42.64 28.43 Galaxy Tab 10.1 LTE SC-01D
Tegra3 Cortex-A9 1.3GHz x4 gcc 4.4.3 ARMv7A 3.00 36.15 25.82 Eee Pad TF201
Exynos4210 Cortex-A9 1.2GHz x2 gcc 4.4.3 ARMv7A 3.24 33.42 27.85 Galaxy S2 SC-02C
OMAP4460 Cortex-A9 1.2GHz x2 gcc 4.4.3 ARMv7A 3.31 32.77 27.31 Galaxy Nexus SC-04D
S5PC110 Cortex-A8 1.0GHz x1 gcc 4.4.3 ARMv7A 3.58 30.27 30.27 Galaxy S SC-02B
Tegra2 Cortex-A9 1.0GHz x2 gcc 4.4.3 ARMv7A 4.32 25.11 25.11 Optimus Pad L-06C
MSM8255 Scorpion 1.0GHz x1 gcc 4.4.3 ARMv7A 4.37 24.82 24.82 Xperia Ray SO-03C
A5X Cortex-A9 1.0GHz x2 clang 3.1 ARMv7A 4.60 23.55 23.55 iPad 3
A5 Cortex-A9 1.0GHz x2 clang 4.2 ARMv7A 4.64 23.34 23.34 iPad mini
MSM8255 Scorpion 1.0GHz x1 gcc 4.4.3 ARMv5TE 5.58 19.44 19.44 Xperia Ray SO-03C
A5 800MHz x1 clang 4.2 ARMv7A 5.78 18.76 23.44 iPod touch 5
TCC8923 Cortex-A5 1.2GHz x1 gcc 4.4.3 ARMv7A 5.88 18.42 15.35 SXZ-PD10
A4 Cortex-A8 1.0GHz x1 clang 3.1 ARMv7A 6.05 17.92 17.92 iPod touch 4
JZ4770 XBurst 1.0GHz x1 gcc 4.4.3 MIPS32-R1 6.61 16.40 16.40 Novo7 Paladin
S5PC100 Cortex-A8 600MHz x1 clang 3.1 ARMv7A 7.85 13.81 23.01 iPhone 3GS
TCC8923 Cortex-A5 1.2GHz x1 gcc 4.4.3 ARMv5TE 8.50 12.74 10.62 SXZ-PD10
MSM7225 ARM11 600MHz x1 gcc 4.4.3 ARMv5TE 15.51 6.99 11.65 IDEOS
SoC / CPU netbook cc ISA time (sec) MB/sec MBps/GHz device name
AMD MV-40 x86 1.6GHz x1 VC 2010 x86 1.89 58.49 36.56 EeePC 1201T
A110 x86 800MHz x1 VC 2010 x86 3.29 32.96 41.20 Loox U50X/V
Atom Z540 x86 1.86GHz x1 HT VC 2010 x86 3.56 30.44 16.37 VAIO Type P VGN-P90S
Atom N270 x86 1.6GHz x1 HT VC 2010 x86 4.21 25.74 16.09 Mebius PC-NJ70A
SoC / CPU desktop cc ISA time (sec) MB/sec MBps/GHz device name
Core i7-3930K 3.2GHz x6 HT VC 2010 x64 0.48 228.05 71.26
Core i7-3930K 3.2GHz x6 HT VC 2010 x86 0.50 216.50 67.66
Core i7-2600S 2.8GHz x4 HT clang 3.1 x64 0.43 250.28 89.38 iMac 2011
Core i7-2600S 2.8GHz x4 HT clang 3.1 x86 0.59 185.23 66.15 iMac 2011
Core i7-2600S 2.8GHz x4 HT VC 2010 x64 0.53 205.13 73.26 iMac 2011
Core i7-2600S 2.8GHz x4 HT VC 2010 x86 0.50 217.96 77.84 iMac 2011
Core i7-620M 2.67GHz x2 HT VC 2010 x64 0.57 191.19 71.60
Core i7-620M 2.67GHz x2 HT VC 2010 x86 0.65 165.50 61.98
Core2 duo x64 2.4GHz x2 VC 2010 x64 0.75 143.56 59.81
Core2 duo x86 2.4GHz x2 VC 2010 x86 0.85 127.99 53.33
SoC / CPU accelerator cc ISA time (sec) MB/sec MBps/GHz device name
Core i7-3930K 3.2GHz x6 HT VC 2010 x64 + AES-NI 0.047 2299.54 718.61
Core i7-3930K 3.2GHz x6 HT VC 2010 x86 + AES-NI 0.064 1682.35 525.74
Core i7-2600S 2.8GHz x4 HT VC 2010 x64 + AES-NI 0.051 2113.03 754.66 iMac 2011
Core i7-2600S 2.8GHz x4 HT VC 2010 x86 + AES-NI 0.064 1683.66 601.31 iMac 2011
Core i7-620M 2.67GHz x2 HT VC 2010 x64 + AES-NI 0.076 1410.61 528.32
Core i7-620M 2.67GHz x2 HT VC 2010 x86 + AES-NI 0.101 1064.09 398.53
Apple A7 CPU 1.3GHz? x2 clang 5.0 ARMv8 + NEON AES 0.129 837.54 644.26 iPhone 5s
  • 簡単な CPU のテスト
    • single thread のみ、Multi core CPU でも 1 core 分の速度だけになります。
    • Multi core CPU 全体の実際の速度はバス転送が間に合えばおよそ core 数倍になります。HT の場合も 1.3~1.5倍程度になる可能性があります。
  • cc = 使用した Cコンパイラ
  • ISA = ビルドした Instruction Set Architecture 、CPU の ISA ではなくコンパイラに与えたオプションを示すので注意
  • time (sec) = 108.4MB のファイルを AES 変換した場合の実行速度。ファイル入出力時間は含まない。on memory
  • MB/sec = 1秒あたりの変換速度に変換したもの。
  • MBps/GHz = MB/sec を CPU 速度 1GHz あたりの速度に変換したもの。
    • Clock 差があっても CPU core そのものの能力を比較することができます。
    • CPU の種類ごとにこの値が一定になるのが理想ですが、実際はバス速度、コンパイラ、動作環境(バックグラウンドプロセス)、等の影響を受けます。

Test code

今回走らせたコードは全て整数演算 + メモリアクセスです。 浮動少数演算は含まれていません。

最適化が完全ではないかもしれません。 複数ブロックまとめて処理すればおそらくもっと速くできます。

結果から分かる通り、同じ CPU でも ABI やコンパイラの種類によって結果が大きく変わっています。 相性があるようです。

そのため必ずしも公平なテストとなっているわけではありません。 結果については参考程度にお願いします。

ARM

今回テストに使ったコードは clang (LLVM) よりも gcc の方が最適化の相性が良いようです。 そのため同じ CPU core でも Android の方が全体的にスコアが高くなっています。 ただし別のアルゴリズムでは gcc よりも clang の方が高速な結果となりました。 よって、数値を見る場合はコンパイラの違いも注意してください。

Cortex-A9 はどれも 2~4 core と Multi core 化されているため、 デバイス全体の処理能力は数倍高いものになります。 同じように Scorpion も dual core のものが増えています。

MSM7225 ARM11 は ARMv6 の CPU ですが、Android の NDK が対応している ARM アーキテクチャは armeabi-v7a (ARMv7A) か armeabi (ARMv5TE) のどちらかに限られます。 そのため ARMv5TE でコンパイルしたバイナリを使っているので注意してください。

ARMv7A の CPU で armeabi (ARMv5TE) でビルドしたコードを走らせると大きく速度が落ちるようです。

今回のテストにおいては MBps/GHz で比べると Cortex-A8/A9 の差は思ったほどありませんでした。 また Scorpion との大きな差も見られませんでした。

ARM64

ARMv8 の Apple A7 は低クロックながら desktop CPU に匹敵するスコアを出しているようです。

また x86/x64 と同様に、32bit よりも 64bit の方が高速であることがわかります。

MIPS

JZ4770 の XBurst は MIPS32-R2 対応 CPU core ですが MIPS32-R1 でビルドしています。 Android NDK は r7bm から MIPS32-R1 だけがサポートされるようになりました。 MIPS32-R2/MIPS32-R2-SF 除外されたようです。

JZ4770 の XBurst1 は下記ページから Single issue であることがわかります。

x86/x64

同じ CPU でも x86 より x64 でビルドした方が速いことがよくわかります。 また ARM と違い、clang の最適化と相性が良いようです。 同じ PC でも VC よりも clang の方が高速でした。 OS も違うので ABI の違いもあるのかもしれません。

Atom N270 は非常に低速でこのテストを見る限りは ARM に負けていることがわかります。 同一クロックで比べるとさらに差が開きます。 Atom の性能が低く見えるのは、高クロック動作 + HT が前提の CPU であるため。 2 thread 使った時が本来の Atom の性能なので、単一 core でも 1.5倍程度の性能があると思ったほうが良いでしょう。

逆に低クロックかつ HT 無しの single core Atom は、 ARM と比べても非常に遅いことが予想されます。

Core2 以上は速度が一桁違います。MBps/GHz で比べても、core そのものの実行効率が非常に高いことがわかります。 もちろん Multi core / Multi thread なので、thread 化すればさらに差は大きく開きます。

コンパイラの相性もあるのでその辺りも考慮した方が良いでしょう。

AES-NI

AES-NI は、AVX と同じように Sandy Bridge 以降の CPU で搭載されている専用命令です。 SSE レジスタを使って直接 AES 変換をします。 ハードウエア実行なので非常に高速です。

なお Core i7-620M は Sandy Bridge ではありませんが AES-NI を搭載しています。

ちなみに ARM でも ARMv8 以降は AES-NI と同様に、専用の CPU 命令が搭載される予定です。

FPU

Linpack

  • Linpack for Android v1.2.8
Single Multi OS CPU device
MFLOPS MFLOPS CPU core Soc
18.091 A2.3 Cortex-A8 1.0GHz S5PC110 Galaxy S SC-02B
18.684 A4.0 MIPS XBurst1 1.0GHz JZ4770 Novo7 Paladin
25.732 A4.0 Cortex-A5 1.2GHz TCC8923 SXZ-PD10
35.628 A2.2 Scorpion 1.0GHz QSD8250 Desire X06HT
31.142 57.331 A3.1 Cortex-A9 x2 1.0GHz Tegra2 OptimusPad L-06C
46.164 74.664 A2.3 Scorpion x2 1.2GHz MSM8660 EVO 3D ISW12HT
56.076 89.860 A3.2 Scorpion x2 1.5GHz APQ8060 Galaxy Tab SC-01D
57.342 92.981 A2.3 Cortex-A9 x2 1.2GHz Exynos4210 Galaxy S2 SC-02C
47.071 140.908 A3.2 Cortex-A9 x4 1.3GHz Tegra3 EeePad TF201
  • MFLOPS の数値が大きい方が高速。
  • Single = Single-Thread
  • Multi = Multi-Thread (Multi core CPU のみ実行)

RenderScript / VFP / NEON

SoC CPU core OS RenderScript Java NDK C++ NDK VFP ASM NDK NEON C++ NDK NEON ASM
RS1 RS2 RS3 inline matrix func inline1 inline2 basic MT2 Intrinsic basic MT2 MT4 ASM IL2 ASM IL4
(1) JZ4770 XBurst1 1.0GHz A4.0 289 312 310 479 11736 158 262 241 - - - - - - - -
(2) TCC8923 Cortex-A5 1.2GHz A4.0 67 105 66 295 6798 57 52 51 35 38 30 23 26 25 20 20
(3) S5PC110 Cortex-A8 1.0GHz A2.3 - - - 698 1012 166 288 289 139 139 26 20 22 - - -
(4) Tegra 2 Cortex-A9 1.0GHz x2 A3.1 50 67 50 243 1219 75 64 64 46 26 - - - - - -
(5) Tegra 3 Cortex-A9 1.3GHz x4 A4.0 38 46 38 172 3634 42 40 40 35 27 36 34 27 27 31 33
(6) APQ8060 Scorpion 1.5GHz x2 A3.2 - - - 279 1758 43 33 35 26 27 25 26 19 18 17 26
  • 数値は実行時間 (ms) 値が小さいほうが高速。
  • (1) JZ4770 = Novo7 Paladin
  • (2) TCC8923 = SXZ-PD10
  • (3) S5PC110 = Galaxy S SC-02B
  • (4) Tegra 2 = Optimus Pad L-06C
  • (5) Tegra 3 = EeePad TF201
  • (6) APQ8060 = Galaxy Tab 10.1 LTE SC-01D
  • RS1 = rsMatrixMultiply
  • RS2 = 乗算 inline 展開1
  • RS3 = 乗算 inline 展開2
  • Java inline = Java で乗算展開
  • Java matrix = android.opengl.Matrix 呼び出し
  • NDK C++ func = 関数呼び出し
  • NDK C++ inline1 = inline 展開1
  • NDK C++ inline2 = inline 展開2
  • NDK VFP ASM basic = inline asm fmacs
  • NDK VFP ASM MT2 = inline asm fmacs を pthread で 2 thread 実行
  • NDK NEON C++ Intrinsic = Intrinsic (built-in) 命令使用
  • NDK NEON ASM basic = inline asm NEON (single thread)
  • NDK NEON ASM MT2 = inline asm NEON を pthread で 2 thread 実行
  • NDK NEON ASM MT4 = inline asm NEON を pthread で 4 thread 実行
  • NDK NEON ASM IL2 = inline asm NEON を interleave x2 (single thread)
  • NDK NEON ASM IL4 = inline asm NEON を interleave x4 (single thread)

ARM

Cortex-A5 は vfpv4 搭載ですが Android/NDK は vfpv3 とみなして実行しています。

Cortex-A5 は整数演算では Cortex-A9/A8 に大きく劣りますが、 vfpv4 + NEON が搭載されており、浮動小数点演算は非常に 高速であることがわかります。

特に vfp 速度は一桁遅い Cortex-A8 と比べて Cortex-A9 に 匹敵する速度となっています。

実行時間が短すぎるため Multi Thread 化はあまり効果が出ていません。 Thread の起動と終了同期の時間が含まれているためです。

opengl/cpubench.txt · 最終更新: 2013/12/24 21:52 by oga