D3D Shader/OpenGL」カテゴリーアーカイブ

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 が小さい方が高速)

Device Time
Raspberry Pi 3 175 sec ( 2m55s) 10.8x
DragonBaord 410c 186 sec ( 3m06s) 10.1x
Raspberry Pi 2 402 sec ( 6m42s) 4.7x
Raspberry Pi 1893 sec (31m33s) 1.0x

やはり DragonBaord 410c と近い数値になっています。SD Card の差もあるので一概には言えませんが、初代と比べておよそ 10倍、Pi 2 と比べても 2倍以上高速です。

スペック込み&より多くのデバイスとの比較は下記の通りです。

Device core clock C/T 64 RAM Time
Core i7-4790K Haswell 4.0GHz 4/8 Y 16GB 15 sec ( 0m15s)
Celeron J1900 Silvermont 2.0GHz 4/4 Y 8GB 88 sec ( 1m28s)
Athlon 5350 Jaguar 2.0GHz 4/4 Y 8GB 88 sec ( 1m28s)
Celeron 2955U Haswell 1.4GHz 2/2 Y 4GB 93 sec ( 1m33s)
Celeron N3150 Airmont 1.6GHz 4/4 Y 16GB 108 sec ( 1m48s)
Raspberry Pi 3 Cortex-A53 1.2GHz 4/4 N 1GB 175 sec ( 2m55s)
DragonBaord 410c Cortex-A53 1.2GHz 4/4 Y 1GB 186 sec ( 3m06s)
Raspberry Pi 2 Cortex-A7 0.9GHz 4/4 N 1GB 402 sec ( 6m42s)
Atom Z540 Bonnell 1.8GHz 1/2 N 2GB 426 sec ( 7m06s)
Raspberry Pi ARM1176 0.7GHz 1/1 N 0.5GB 1893 sec (31m33s)
Netwalker Cortex-A8 0.8GHz 1/1 N 0.5GB 1902 sec (31m42s)

・C/T = Core数/Thread数

vfp benchmark の比較はこちら (単位は GFLOPS、値が大きい方が速い)

Device arch SP-ST DP-ST SP-MT DP-MT
DragonBoard 410c ARMv8A 9.498 4.749 37.965 18.603
Raspberry Pi 3 ARMv7A 9.431 2.477 37.442 9.994
Raspberry Pi 2 ARMv7A 1.791 0.877 7.087 3.472
Raspberry Pi ARMv6 0.674 0.674 0.674 0.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」であることがわかります。

マイナビニュース ARM TechCon 2012 – 64bitプロセッサ「Cortex-A50」シリーズの概要が公開される/Cortex-A53編

さらに下位の Cortex-A35 が登場予定となっており、こちらが本来の Cortex-A7 相当の 64bit プロセッサになるものと思われます。

下記ページを更新しました。

VFP Benchmark Log 計測結果まとめ
CPU の浮動小数点演算能力の詳細

関連エントリ
ARM Cortex-A53 の浮動小数点演算速度とコンパイル時間の比較
2955U vs N3150/J1900/Athlon5350 (コンパイル時間の比較)
Raspberry Pi 2 で速くなったコンパイル時間の比較

Android NDK r11b

早くも NDK r11b がリリースされています。

Android NDK Downloads

Android N の Java API は OpenGL ES 3.2 に対応しましたが、NDK にはまだ含まれていないようです。

Android N for Developers : OpenGL ES 3.2 API

まとめると下記の通り。

Android N               OpenGL ES 3.2    Vulkan
--------------------------------------------------
Java API (preview)           Y             N
NDK r11b Platform-24         N             Y

Platform-19 以前で build すると __pure2 シンボルで問題が出ることがあります。
下記の修正でとりあえず対処できます。

include/math.h

#undef __pure2	// ← 追加
#define __pure2

関連エントリ
Android N Preview と Vulkan (2) NDK r11

Android N Preview と Vulkan (2) NDK r11

Android NDK r11 がリリースされました。Vulkan に対応しています。

Android NDK Downloads

これで Android N 対応の Mobile Device で Vulkan が利用できるようになります。
Android N Preview 対応デバイスについてはこちら↓も参考にしてください。

Android N Preview と Vulkan / OpenGL ES 3.2

2014年の Metal からだいぶ時間が経ちましたが、Android でもようやく Grahics 向けの低レベル API が使えるようになります。最初はいろいろ面倒でハードルが高いですが、互換性問題の解消や Desktop API との統一化などメリットも多いので、徐々に使われていくようになるのではないでしょうか。

関連エントリ
Android N Preview と Vulkan / OpenGL ES 3.2

Android N Preview と Vulkan / OpenGL ES 3.2

Android N Preview が公開されています。

Android N Developer Preview

Preview Image には libvulkan.so が含まれているので、Android N から Vulkan 対応になると思って間違いなさそうです。確認したのは Nexus Player 及び Nexus 9。NDK/SDK 側の用意がまだなので実際に利用できるかどうかは試していません。

fugu:/system/lib $ ls -l *vul*
-rw-r--r-- 1 root root 132640 2009-01-01 17:00 libvulkan.so

なお SDK の方には新たに OpenGL ES 3.2 API が追加されているようです。

Android N Preview に対応しているデバイスは下記の通り。

Device SoC GPU API
Nexus 5X Snapdragon 808 Adreno 418 ES3.1 AEP
Nexus 6 Snapdragon 805 Adreno 420 ES3.1 AEP
Nexus 6P Snapdragon 810 Adreno 430 ES3.1 AEP
Nexus 9 Tegra K1 Kepler ES3.1 AEP
Nexus 9 LTE Tegra K1 Kepler ES3.1 AEP
Nexus Player Bay-Trail Z3560 PowerVR G6430 ES3.1
Pixel C Tegra X1 Maxwell ES3.1 AEP

いずれも OpenGL ES 3.1 以上をサポートしており、Vulkan に対応可能な GPU を搭載していることがわかります。
残念ながら Nexus 5 は含まれていませんでした。Nexus 5 は Adreno 330 (OpenGL ES 3.0) なので、Android N にアップグレードできても Vulkan はおそらく非対応となるでしょう。

関連エントリ
低レベル Graphics API Vulkan 登場
SHIELD Android TV (Tegra X1) は OpenGL ES 3.2 対応
AEP を取り込んだ OpenGL ES 3.2 は機能面で Desktop に並ぶ, Android は Vulkan へ
3D 低レベル API の現状 Direct3D 12/Metal
CPU 負荷が低い 新しい 3D API

関連ページ
3D Low overhead API (Low Level API) Metal/D3D12/Vulkan

低レベル Graphics API Vulkan 登場

新しい低レベル API Vulkan がリリースされました。

Khronos Releases Vulkan 1.0 Specification

これでようやく各プラットフォームの API が出揃ったことになります。対応は下記の通り。

               Desktop                  Mobile
-------------------------------------------------
Metal          OS X                     iOS
Direct3D 12    Windows 10
Vulkan         Windows 7~, Linux       Android

Vulkan 最大の特徴は Platform の枠を超えて利用できることです。Android, Linux だけでなく Windows でも動作します。

Windows にはすでに DirectX12 がありますが Windows 10 以降が必須となっています。Windows 7 でも使える Vulkan は Windows 環境でも十分魅力的に映るかもしれません。

すでに Beta 版ドライバが公開されているため、比較的すぐに試してみることができます。
現時点で対応している GPU は下記の通り。(分かる範囲のみ)

GeForce Kepler/Maxwell       Windows, Linux, Android
RADEON GCN                   Windows
Intel HD Graphics Gen8~     Linux

GCN すべてに対応しているかどうかは未確認です。
Mobile GPU の場合 Vulkan に対応できるのは、予想通り OpenGL ES 3.1 以降になるようです。

Intel HD Graphics と低レベル API の対応

Metal         Intel HD Graphics Gen 7~       Ivy Bridge 以降
Direct3D 12   Intel HD Graphics Gen 7.5~     Haswell 以降
Vulkan        Intel HD Graphics Gen 8~       Broadwell 以降

Vulkan が動いているかどうかは vulkaninfo コマンドで調べることができます。
GeForce の場合 driver と同時にコマンドも install されました。

下記は GeForce GTX 960 の抜粋です。

===========
VULKAN INFO
===========

Vulkan API Version: 1.0.3


~
VkPhysicalDeviceFeatures:
=========================
        robustBufferAccess                      = 1
        fullDrawIndexUint32                     = 1
        imageCubeArray                          = 1
        independentBlend                        = 1
        geometryShader                          = 1
        tessellationShader                      = 1
        sampleRateShading                       = 1
        dualSrcBlend                            = 1
        logicOp                                 = 1
        multiDrawIndirect                       = 1
        drawIndirectFirstInstance               = 1
        depthClamp                              = 1
        depthBiasClamp                          = 1
        fillModeNonSolid                        = 1
        depthBounds                             = 1
        wideLines                               = 1
        largePoints                             = 1
        textureCompressionETC2                  = 0
        textureCompressionASTC_LDR              = 0
        textureCompressionBC                    = 1
        occlusionQueryPrecise                   = 1
        pipelineStatisticsQuery                 = 1
        vertexSideEffects                       = 1
        tessellationSideEffects                 = 1
        geometrySideEffects                     = 1
        shaderImageGatherExtended               = 1
        shaderStorageImageExtendedFormats       = 1
        shaderStorageImageMultisample           = 1
        shaderStorageImageReadWithoutFormat     = 1
        shaderStorageImageWriteWithoutFormat    = 1
        shaderUniformBufferArrayDynamicIndexing = 1
        shaderSampledImageArrayDynamicIndexing  = 1
        shaderStorageBufferArrayDynamicIndexing = 1
        shaderStorageImageArrayDynamicIndexing  = 1
        shaderClipDistance                      = 1
        shaderCullDistance                      = 1
        shaderFloat64                           = 1
        shaderInt64                             = 1
        shaderInt16                             = 0
        shaderResourceResidency                 = 1
        shaderResourceMinLod                    = 1
        alphaToOne                              = 1
        sparseBinding                           = 1
        sparseResidencyBuffer                   = 1
        sparseResidencyImage2D                  = 1
        sparseResidencyImage3D                  = 1
        sparseResidency2Samples                 = 1
        sparseResidency4Samples                 = 1
        sparseResidency8Samples                 = 1
        sparseResidency16Samples                = 1
        sparseResidencyAliased                  = 1
        variableMultisampleRate                 = 1
        iheritedQueries                         = 1
~

ヘッダファイルやツール類は Open Source として GitHub からダウンロードする形になるようです。
Vulkan-LoaderAndValidationLayers に含まれています。

GitHub: The Khronos Group

ビルドもできます。build には cmake と Python3 が必要。例えば glslang の場合下記の通り。

cd glslang
mkdir build
cd build
cmake .. -G "Visual Studio 14 Win64"
start glslang.sln

関連エントリ
AEP を取り込んだ OpenGL ES 3.2 は機能面で Desktop に並ぶ, Android は Vulkan へ
3D 低レベル API の現状 Direct3D 12/Metal
CPU 負荷が低い 新しい 3D API

関連ページ
3D Low overhead API (Low Level API) Metal/D3D12/Vulkan