月別アーカイブ: 2015年9月

Direct3D 12 GPU 毎の Descriptor Size, 問題点等

Direct3D 12 ではリソースバインドの方法が大きく変わっています。Shader の種類も渡すリソースの数も増えており、Bind のコストが無視できなくなっているからです。リソースは Descriptor Heap 上に確保した一連の Descriptor に登録します。この Heap 上の先頭アドレスを指定するだけで描画時のバインドが完了する仕組みです。

Descriptor は GPU がアクセスする領域なので、ハードウエアによってサイズが異なっています。実際にどれくらい違いがあるのか調べてみました。数値の単位は byte です。

GPU FeatureLevel CBV_SRV_UAV SAMPLER RTV DSV
RADEON GCN 1.0 11_1 32 16 32 144
RADEON GCN 1.1 12_0 32 16 32 144
GeForce Kepler 11_0 32 32 32 8
GeForce Maxwell GM1 11_0 32 32 32 8
GeForce Maxwell GM2 12_1 32 32 32 8
Intel HD Graphics Gen7.5 11_1 32 16 32 96
Intel HD Graphcis Gen8 11_1 64 16 32 128

このように GPU によってサイズが異なるため、Descriptor のアドレス計算を行う場合は必ず GetDescriptorHandleIncrementSize() を参照しなければなりません。Descriptor とはいわば Resource を参照するためのポインターですが、View に相当するアクセスに必要な情報も含まれます。サイズ的に単純なアドレスだけではないことがわかります。

全体的に DSV が大きいのは、Depth の他に Stencil Surface が必要なこと、高速化のための (PreZ 等) の追加 Resource が含まれているためと考えられます。そういう意味では DSV が 8byte しかない GeForce はまさにアドレスだけ。更に他の情報構造体を間接的に参照しているのではないでしょうか。

Intel HD Graphics の場合は世代間でも差が生じています。外部からはあまり違いがわかりませんが、ハードウエアの差は思ったよりも大きいようです。

この表は下記ページにも掲載しています。

RootSignature と Descriptor

●気がついた問題点など

DirectX12 は現在も頻繁にドライバの更新が行われています。まだ安定していない機能があるようです。以下使っていて気がついたもの。(2015/09/22現在)

GeForce Maxwell/Kepler (355.82)
 ・Indirect Draw の CommandSignature で RootDescriptor が反映されない問題が生じていたが Driver 355.82 で修正された。

RADEON GCN 1.0/1.1 (15.8Beta)
 ・CommandSignature で Rooto 32bit Consnta/Root Descriptor が反映されない
 ・Bundle で RootSignature のパラメータが継承されない

Intel HD Graphcis Gen7.5/8 (10.18.15.4256)
 ・RootSignature に Root 32bitConstant が複数存在する場合、CommandSignature で最初の 32bit Constant しか更新できない。

下記ページも更新しています。

Direct3D 12 (DirectX 12) Windows 詳細

他にも問題ではありませんが API の挙動で GPU による細かい違いは結構あります。

関連エントリ
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

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 関連