Mac OS X Metal の対応 GPU

Mac の Metal API 対応機種が明らかになっています。mid 2012 以降、Mac Pro のみ 2013以降となります。これらの機種を GPU に照らし合わせると下記の通り。

・Intel HD Graphics 4000 Gen7 以降 (Ivy Bridge)
・GeForce Kepler 以降
・RADEON GCN 以降

Metal はもともと Mobile OpenGL ES 3.1 世代向けの API なので、機能面の要求はそれほど厳しくなく Direct3D 12 よりも多くの GPU に対応しています。ですが予想よりも対応 GPU には差が少ないことがわかりました。

比較すると下記の通りです。いずれも Direct3D 11 世代以降の GPU となります。

GPU D3D12 Metal OSX
GeForce Fermi N(Y) N GTX 400
GeForce Kepler Y Y GTX 680
GeForce Maxwell GM1 Y Y GTX 750
GeForce Maxwell GM2 Y Y GTX 980
RADEON GCN 1.0 Y Y HD 7000
RADEON GCN 1.1 Y Y R9 200/300
RADEON GCN 1.2 Y Y 285/380/Fury
Intel HD Graphics Gen7 N Y Ivy Bridge
Intel HD Graphics Gen7.5 Y Y Haswell
Intel HD Graphics Gen8 Y Y Broadwell
Intel HD Graphics Gen9 Y Y Skylake

一番の違いは Metal が Intel HD Graphics 4000 Ivy Bridge に対応していることです。
この世代の GPU は BayTrail として Windows Tablet の多くに採用されていますが D3D12 を使うことができなくなっています。

iOS の Metal 対応機種は下記の通り

Device SoC 64 GPU Metal GPU Family
iPhone 4S A5 N SGX 543MP2 N
iPad 2 A5 N SGX 543MP2 N
iPad mini A5 N SGX 543MP2 N
iPod touch 5 A5 N SGX 543MP2 N
iPad 3 A5X N SGX 543MP4 N
iPhone 5 A6 N SGX 543MP3 N
iPhone 5c A6 N SGX 543MP3 N
iPad 4 A6X N SGX 554MP4 N
iPhone 5s A7 Y G6430 Y Family1
iPad Air A7 Y G6430 Y Family1
iPad mini 2 A7 Y G6430 Y Family1
iPad mini 3 A7 Y G6430 Y Family1
iPhone 6/Plus A8 Y GX6450 Y Family2
iPod touch 6 A8 Y GX6450 Y Family2
iPad mini 4 A8 Y GX6450 Y Family2
Apple TV A8 Y GX6450? Y Family2
iPad Air 2 A8X Y GX6850 Y Family2
iPhone 6s/Plus A9 Y ? Y Family3
iPad Pro A9X Y ? Y Family3

下記ページも更新しました

GPU 世代対応表 (API 対応表)
Metal (iOS/OS X)

Mac 対応機種は下記より。

Apple Mac Developer Library : Metal Feature Set Tables

関連エントリ
歴代 iPad の CPU/GPU 速度の比較と iPad Pro の速度の目安
3D 低レベル API の違い Direct3D 12/Metal
3D 低レベル API の現状 Direct3D 12/Metal

歴代 iPad の CPU/GPU 速度の比較と iPad Pro の速度の目安

Apple の製品紹介には、前モデルからどれだけパフォーマンスが向上したか比較値が載っています。この数値をまとめてみました。

iPad mini/iPad 2 はどちらも Apple A5 (Cortex-A9 1.0GHz dual/PowerVR SGX543MP2) が用いられており同一です。これを 1.0 とした時の速度の比較は下記のとおり。数値が大きい方が高速です。

iPad mini SoC CPU 速度 GPU 速度
iPad mini A5 1.0 1.0
iPad mini 2 A7 4.0 8.0
iPad mini 3 A7 4.0 8.0
iPad mini 4 A8 5.2 12.8
iPad SoC CPU 速度 GPU 速度
iPad A4 0.5 0.1
iPad 2 A5 1.0 1.0
iPad 3 A5X 1.0 2.0
iPad 4 A6X 2.0 4.0
iPad Air A7 4.0 8.0
iPad Air 2 A8X 5.6 20.0
iPad Pro A9X 10.1 40.0

誤差が含まれていると思われるため目安程度にお願いします。
iPad mini2/3, iPad Air はどちらも A7 を搭載しており、きちんと同じ数値になっています。実際は mini と Air は CPU Clock で僅かに (7%ほど) 違いがあります。

GPU の速度向上が著しいことがよくわかります。
iPad Pro に至っては CPU 10倍、GPU 40倍という結果に。Metal でも新たに iOS GPUFamily3 が追加されているので、A9/A9X (または A9X のみ) には新しい GPU が搭載されている可能性があります。

元にした数値は下記の通り。

iPad mini 2 A7 iPad mini (A5) の CPU 4倍 / GPU 8倍
iPad mini 3 A7 iPad mini2 (A7) と同一
iPad mini 4 A8 iPad mini3 (A7) の CPU 1.3倍 / GPU 1.6倍
iPad mini 4 A8 iPad mini (A5) の CPU 5.2倍 / GPU 12.8倍
iPad 3 A5X iPad 2 (A5) の CPU 1.0倍 / GPU 2.0倍
iPad 4 A6X iPad 3 (A5X) の CPU 2.0倍 / GPU 2.0倍
iPad Air A7 iPad 4 (A6X) の CPU 2.0倍 / GPU 2.0倍
iPad Air 2 A8X iPad Air (A7) の CPU 1.4倍 / GPU 2.5倍
iPad Pro A9X iPad Air2 (A8X) の CPU 1.8倍 / GPU 2.0倍
iPad Pro A9X iPad (A4) の CPU 22倍 / GPU 360倍

これらのデータは下記公式ページより。

Apple: iPad Pro
Apple: iPad Pro Technology
Apple: iPad mini 4
Apple: iPad mini 4 パフォーマンス
Apple、iPad Air 2を発表—これまでで最も薄く、最もパワフルなiPad
Apple、iPad Airを発表 劇的に薄く、軽く、よりパワフルなiPad
Apple、iPad miniを発表
Apple、新しいiPadを発表

Apple Watch の CPU の種類と浮動小数点演算速度

VFP Benchmark を走らせてみました。

ARCH: ARMv7A
FPU: VFPv4-D32 NEON
SingleT SP max: 0.951 GFLOPS
SingleT DP max: 0.470 GFLOPS
MultiT  SP max: 0.945 GFLOPS
MultiT  DP max: 0.469 GFLOPS
CPU core: 1
NEON: yes
FMA: yes

詳細な結果はこちら。

VFP Benchmark Log

下記は抜粋です。

* VFP/NEON (single fp)               sec     MFLOPS     MFLOPS
--------------------------------------------------------------
VFP fmuls (32bit x1) n8       :    2.649      453.0      453.0
VFP fadds (32bit x1) n8       :    2.557      469.3      469.3
VFP fmacs (32bit x1) n8       :    2.586      928.2      928.2
NEON vmul.f32 (32bit x4) n8   :   10.097      475.4      475.4
NEON vadd.f32 (32bit x4) n8   :   10.182      471.4      471.4
NEON vmla.f32 (32bit x4) n8   :   10.165      944.4      944.4

* VFP/NEON (double fp)               sec     MFLOPS     MFLOPS
--------------------------------------------------------------
VFP fmuld (64bit x1) n8       :   10.164      118.1      118.1
VFP faddd (64bit x1) n8       :    2.554      469.8      469.8
VFP fmacd (64bit x1) n8       :   10.746      223.3      223.3

Single core で VFPv4 と NEON に対応していることがわかります。
ただし NEON でも結果はスカラーと同じ速度しか出ていません。(上の表の MFLOPS)
また倍精度の乗算速度も加算の 1/4 まで落ちています。

これらの特徴を踏まえると Cortex-A7 が使われているものと思われます。速度を見る限り実行クロックは 500MHz 程度でしょう。CPU core 毎の浮動小数点演算能力 (特徴) は下記にまとめています。

CPU の浮動小数点演算能力の詳細

Apple S1 のアプリケーションプロセッサは Android Wear に使われている Snapdragon 400 と比べると少々非力です。CPU core は同じですがクロックはおよそ半分で Single core になります。

↓ 一応 Apple Watch で ChiRaKS 動きました。まだ操作と速度に問題があります。

chiraks_awatch01.png

関連エントリ
iPod touch 6 の浮動小数点演算速度は Core 2 Duo ライン超え
Android Wear Sony SmartWatch 3 SWR50 は速い
iPad Air 2 (Apple A8X) の浮動小数点演算能力
Android Wear VFP Benchmark
ndroid Wear LG G Watch (LG-W100) の速度(実測)
VFP Benchmark 関連

AEP を取り込んだ OpenGL ES 3.2 は機能面で Desktop に並ぶ, Android は Vulkan へ

OpenGL ES 3.2 が登場しました。OpenGL ES 3.1 AEP (Android Extension Pack) の機能が取り込まれています。これまで ES にはなかった GeometryShader や Tessellator などに対応しており、機能面では OpenGL 4.x/Direct3D 11 と完全に並ぶことになります。

おそらく AEP 対応 GPU がそのまま OpenGL ES 3.2 になるのではないかと思われます。
現在発売されている端末で AEP (GL_ANDROID_extension_pack_es31a) が含まれている GPU は下記の通り。

Tegra K1  Keper (192)     SHIELD Tablet / Nexus 9
Tegra X1  Maxwell (256)   SHIELD
Adreno 4xx                Snapdragon 805/808/810 等

Intel HD Graphics Gen8 も対応しているので、Cherry Trail 搭載 Android 端末が出ればこの一覧に入ることになるでしょう。

シェーダーのバージョンも 3.2 (320 es) です。Version 番号の空きを使い尽くしたので、もし次があるなら番号が飛ぶことになるかもしれません。(GLSL Version 一覧)

NVIDIA の Beta Driver がすでに使えるようになっているので試してみました。
GL_ARB_ES3_2_compatibility で実際に Context を作ることができます。

GL_VERSION: OpenGL ES 3.2 NVIDIA 355.58
GL_RENDERER: GeForce GTX 760/PCIe/SSE2
GL_VENDOR: NVIDIA Corporation
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.20

↓詳細はこちら

Desktop GPU Extensions

OpenGL ES 3.2 は ASTC 対応ですが、やはり OpenGL 4.5 context のまま Texture を読むとパフォーマンスの警告が出るようです。

また OpenGL 4.5 の方にはかなり気になる Extension が増えています。スレッドを使ったシェーダーのコンパイルが可能になるとのこと。

GL_ARB_parallel_shader_compile

なお Android もついに低レベル API である Vulkan 対応を発表しています。予想されてきたことではありますが、低レベル API はプラットフォームごとに完全に分かれることになりました。

API             Platform
------------------------------------------
Direct3D 12     Windows Desktop / Mobile
Metal           iOS / Mac OS X
Vulkan          Android

パフォーマンスだけでなく Mobile / Desktop API の統合や、レガシーな OpenGL API からの脱却などさまざまなメリットもありますが、開発者にとっては悩ましいところです。

関連エントリ
Desktop GPU と OpenGL ES 3.1 API
Android 5.x OpenGL ES 3.1 と対応 GPU
OpenGL ES 3.1 は OpenGL 4.x 相当で ComputeShader に対応
3D 低レベル API の現状 Direct3D 12/Metal

Metal iOS 半透明ソート (PowerVR GX6450)

ROV のテストで用いたシェーダーはそのまま Metal でも動きました。

metal_ios_sort.png

↑上記は iPod touch 6 (A8) の結果です。
左が DepthTest 無しの通常の RenderTarget の内容、
右がバッファをソートした結果。
iOS のみです。Metal というより PowerVR の機能です。

fragment PS_OUT pmain(
    VS_OUT  pin     [[stage_in]],
    constant GeometryBuffer&    geometry    [[buffer(1)]],
    half4   rcolor  [[color(0)]],
    float4  zstack  [[color(1)]],
    uint4   stack   [[color(2)]]
    )
{
    PS_OUT  pout;
    half3   Light= normalize( half3( 0.0h, -0.5h, -1.0h ) );
    half3   normal= normalize( half3(pin.Normal) );
    half3   eyevec= normalize( half3( 0.0h, 0.0h, -120.0h ) - half3(pin.WPos.xyz) );
    half3   hvect= normalize( eyevec.xyz + Light.xyz );
    half3   spec= pow( saturate( dot( hvect, normal ) ), 82.0h ) * saturate( half3(geometry.Color.xyz) + half3( 0.6h, 0.6h, 0.6h ) );
    half    diffuse= saturate( max( dot( normal, Light ), 0.0h ) + 0.2h );
    half4   color;
    color.xyz= half3(geometry.Color.xyz) * diffuse + spec;
    color.w= half(geometry.Color.w);
    uint    color_enc= EncodeColor( color );
    float   pz= pin.Position.z;
    if( pz < zstack.w ){
        zstack.w= pz;
        stack.w= color_enc;
    }
    if( pz < zstack.z ){
        zstack.w= zstack.z;
        stack.w= stack.z;
        zstack.z= pz;
        stack.z= color_enc;
    }
    if( pz < zstack.y ){
        zstack.z= zstack.y;
        stack.z= stack.y;
        zstack.y= pz;
        stack.y= color_enc;
    }
    if( pz < zstack.x ){
        zstack.y= zstack.x;
        stack.y= stack.x;
        zstack.x= pz;
        stack.x= color_enc;
    }
    pout.Color= color;
    pout.Color1= zstack;
    pout.Color2= stack;
    return  pout;
}

関連エントリ
Direct3D12 ROV を試してみる (3) 半透明ソートと Intel HD Graphics
Direct3D12 ROV を試してみる (2) Depth Test と半透明ソート
Direct3D12 ROV (Rasterizer Order View) を試してみる
3D 低レベル API の違い Direct3D 12/Metal
Direct3D 12 GeForce GTX970 は FeatureLevel 12_1 対応、Resource Bind/Heap Tier は低い
3D 低レベル API の現状 Direct3D 12/Metal