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

Direct3D 12 GPU GeForce GTX 1070 Pascal と RADEON RX 480 Polaris

GeForce GTX 1070 と RADEON RX 480 を購入したので DirectX12 対応表(下記リンク)を更新しました。Skylake (Intel HD Graphic 530 Gen 9) のデータも追加してあります。

Direct3D 12 (DirectX 12) Windows 詳細

↑表は大きいのでリンク先で見て下さい。

Windows と同時に D3D12 SDK も更新されており、いくつか機能追加が行われています。ID3D12Device1 が増えており Root Signature も修正が入りました。一番大きなトピックはおそらく ShaderModel 6.0 でしょう。上の表には ShaderModel 6.0 の Wave/Lane 関連のパラメータも追加しました。ただし今のところ対応している GPU は無いようです。

HLSL Shader Model 6.0

D3D ではありませんが、同じ低レベル API である Metal も大幅な機能拡張が行われているようです。もともと PowerVR 6 (Rogue) 向けだった Metal は昨年 Desktop GPU でも使えるようになりましたが、機能面では API に合わせた ES 3.1 相当のままでした。

今年の更新では Metal でも Tessellator が使えるようになり、D3D11/GL4 相当へと拡張が施されるようです。ただし Pipeline は独自で HS,DS,GS が無く、代わりに CS (ComputeShader) が割り当てられています。Desktop GPU だけでなく PowerVR 7XT 世代の Mobile GPU (Apple A9, iPhone 6s 世代) も対応しています。

関連エントリ
Direct3D 12 GeForce GTX970 は FeatureLevel 12_1 対応、Resource Bind/Heap Tier は低い

HTC 10 Snapdragon 820 Kyro の浮動小数点演算能力

Snapdragon 820 は Qualcomm 独自の 64bit CPU core Kyro を搭載しています。vfpbench で浮動小数点演算速度を計測してみました。

Qualcomm はもともと自社製 CPU core の Scorpion や Krait シリーズを採用していました。早い時期から 1GHz を超える高クロック化、また multi-core 化を実現しており主にハイエンド SoC での差別化を図っています。

ところが 64bit 時代に入ると一転し、フラグシップの Snapdragon 810 も ARM の一般的な Cortex-A57/A53 の big.LITTLE 構成となっていました。Kyro は久々に登場した Qualcomm の独自 CPU でかつ初の 64bit core になります。

2 + 2 の非対称 Multi core なので vfpbench では正しく計測することができませんでした。そのため Single-Thread 時の結果を中心に見ています。

Snapdragon 820 Kyro (2.2GHz x2 + 1.6GHz x2)

ARCH: ARMv8A
CPU core: 4
VFP: AArch64 NEON
FMA: Yes
NEON: Yes
Result
  SingleT SP max: 10.517 GFLOPS
  SingleT DP max:  5.216 GFLOPS

上の値は 1 core あたりの性能です。思ったよりも低い数値が出ています。より詳細なログは下記の通り。

* VFP/NEON (単精度 fp) single-thread
                                   sec       MFLOPS
---------------------------------------------------
FPU fmul (32bit x1) n8        :    0.469     2559.9
FPU fadd (32bit x1) n8        :    0.251     4777.4
FPU fmadd (32bit x1) n8       :    0.571     4205.1
NEON fmul.2s (32bit x2) n8    :    0.456     5257.7
NEON fadd.2s (32bit x2) n8    :    0.252     9510.8
NEON fmla.2s (32bit x2) n8    :    0.456    10516.8
NEON fmul.4s (32bit x4) n8    :    0.913     5258.8
NEON fadd.4s (32bit x4) n8    :    0.489     9825.7
NEON fmla.4s (32bit x4) n8    :    0.924    10387.4
FPU fmul (32bit x1) ns4       :    1.141     1051.6
FPU fadd (32bit x1) ns4       :    0.685     1752.7
FPU fmadd (32bit x1) ns4      :    0.913     2630.1
NEON fmul.2s (32bit x2) ns4   :    1.141     2103.5
NEON fadd.2s (32bit x2) ns4   :    0.685     3504.8
NEON fmla.2s (32bit x2) ns4   :    1.146     4187.6
NEON fmul.4s (32bit x4) ns4   :    1.144     4194.1
NEON fadd.4s (32bit x4) ns4   :    0.728     6595.9
NEON fmla.4s (32bit x4) ns4   :    1.142     8403.3
FPU fmul (32bit x1) n1        :    0.459     2614.5
FPU fadd (32bit x1) n1        :    0.274     4380.9
FPU fmadd (32bit x1) n1       :    4.568      525.5
NEON fmul.2s (32bit x2) n1    :    0.458     5245.7
NEON fadd.2s (32bit x2) n1    :    0.251     9562.2
NEON fmla.2s (32bit x2) n1    :    3.651     1314.6
NEON fmul.4s (32bit x4) n1    :    0.913     5257.8
NEON fadd.4s (32bit x4) n1    :    0.488     9828.5
NEON fmla.4s (32bit x4) n1    :    3.651     2629.5
NEON fmul.4s (32bit x4) n12   :    1.376     5234.2
NEON fadd.4s (32bit x4) n12   :    0.720    10001.3
NEON fmla.4s (32bit x4) n12   :    1.381    10429.9

乗算、加算ともに 64bit 単位で、1 cycle あたり 乗算1, 加算2 の構成になっているように見えます。よって 32bit 単精度の場合は 6 flop/cycle となり、Atom 系 (Silvermont, Airmont) に近い値になると思われます。同時に積和命令だけではピークにならないので、実際の理論値はおそらく 6 flop x 2.2GHz = 13.2 GFLOPS くらいでしょうか。2+2 の 4 core で 45.6 GFLOSP 前後。

上の vfpbench の結果は 4 flop/cycle 時のピーク値なので、4 x 2.2GHz = 8.8 GFLOPS。それよりも数値が伸びているので、2.2GHz よりも高い clock に boost されている可能性があります。もしくは、パイプラインが深いために vfpbench でピーク性能を捉えきれていないだけかもしれません。

どちらにせよ、浮動小数点演算だけに注目すると若干控えめな結果といえます。世代が上がる毎に浮動小数点演算をひたすら強化してきた Apple Aシリーズとは大きく特性が異なります。なにせ Apple A9 Twister に至っては 24 flop/clock で初期の AVX を超えています。

* VFP/NEON (倍精度 fp) single-thread
                                   sec       MFLOPS
---------------------------------------------------
FPU fmul (64bit x1) n8        :    0.465     2578.8
FPU fadd (64bit x1) n8        :    0.251     4781.4
FPU fmadd (64bit x1) n8       :    0.685     3506.0
NEON fmul.2d (64bit x2) n8    :    0.913     2627.7
NEON fadd.2d (64bit x2) n8    :    0.489     4912.0
NEON fmla.2d (64bit x2) n8    :    0.924     5194.1
FPU fmul (64bit x1) ns4       :    1.369      876.4
FPU fadd (64bit x1) ns4       :    0.685     1752.6
FPU fmadd (64bit x1) ns4      :    0.913     2629.6
NEON fmul.2d (64bit x2) ns4   :    1.369     1752.7
NEON fadd.2d (64bit x2) ns4   :    0.727     3303.5
NEON fmla.2d (64bit x2) ns4   :    1.369     3505.0
FPU fmul (64bit x1) n1        :    0.456     2629.0
FPU fadd (64bit x1) n1        :    0.274     4379.8
FPU fmadd (64bit x1) n1       :    5.477      438.2
NEON fmul.2d (64bit x2) n1    :    0.913     2629.1
NEON fadd.2d (64bit x2) n1    :    0.489     4911.5
NEON fmla.2d (64bit x2) n1    :    3.651     1314.6
NEON fmul.2d (64bit x2) n12   :    1.369     2629.6
NEON fadd.2d (64bit x2) n12   :    0.721     4992.3
NEON fmla.2d (64bit x2) n12   :    1.380     5215.8

倍精度の結果からも 64bit 単位のパイプラインになっているようです。余裕があれば、Multi-Thread 時を含めてもう少し詳しく調べてみたいと思っています。

関連エントリ
iPhone SE, Apple A9 の浮動小数点演算速度
Raspberry Pi 3 の速度比較, Cortex-A53 の速度
ARM Cortex-A53 の浮動小数点演算速度とコンパイル時間の比較
iPod touch 6 の浮動小数点演算速度は Core 2 Duo ライン超え
iPad Air 2 (Apple A8X) の浮動小数点演算能力

Snapdragon 820 Adreno 530 の OpenGL ES Extension (HTC 10)

Snapdragon 820 (Adreno 530) の OpenGL ES の extension 結果です。Snapdragon 820 は Qualcomm 独自の 64bit CPU Kyro を搭載し、GPU も Adreno 530 に強化されています。

HTC 10 Snapdragon 820 Android 6.0 
CPU Kyro 2+2 core
GPU Adreno 530

Android 6 なので ES 3.1 AEP 止まりですが、Android N 以降では ES 3.2 と Vulkan に対応するものと思われます。この中では ASTC HDR 対応が目を引きます。今までサポートしていたのは Mali だけでした。

GL_VENDOR:   Qualcomm
GL_RENDERER: Adreno (TM) 530
GL_VERSION:  OpenGL ES 3.1 V@145.0 (GIT@I7b6ba47bd6)

GL_EXTENSIONS:
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_KHR_texture_compression_astc_hdr
GL_OES_texture_compression_astc
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_texture_cube_map_array
GL_EXT_draw_buffers_indexed
GL_EXT_gpu_shader5
GL_EXT_robustness
GL_EXT_texture_buffer
GL_EXT_shader_framebuffer_fetch
GL_ARM_shader_framebuffer_fetch_depth_stencil
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_EXT_disjoint_timer_query
GL_KHR_debug
GL_EXT_YUV_target
GL_EXT_sRGB_write_control
GL_EXT_texture_norm16
GL_EXT_discard_framebuffer
GL_OES_surfaceless_context
GL_OVR_multiview
GL_OVR_multiview2
GL_EXT_texture_sRGB_R8
GL_KHR_no_error
GL_EXT_debug_marker
GL_OVR_multiview_multisampled_render_to_texture
GL_EXT_buffer_storage
GL_EXT_blit_framebuffer_paramsDisabled

Adreno 400 等、他の GPU のデータは下記からどうぞ。

CPU/GPU OpenGL ES Extension (Mobile GPU)

iPhone SE, Apple A9 の浮動小数点演算速度

iPhone SE で vfpbench を走らせてみました。
単位は GFLOPS で数値が大きい方が高速です。SP-MT で速い順に並べています。

CPU clock SP-ST DP-ST SP-MT DP-MT
Apple A9 1.85GHz x2 41.857 14.545 81.071 28.333
Apple A8X 1.50GHz x3 23.568 11.751 68.591 33.968
Apple A8 1.40GHz x2 22.194 11.105 44.331 22.084
Apple A7 1.30GHz x2 20.621 10.313 40.871 20.480
Apple A6X 1.40GHz x2 10.855 1.818 21.502 3.573

・SP=単精度, DP=倍精度, ST=SingleThread, MT=MultiThread

Apple A9 は Core 単体の演算能力が非常に上がっていることがわかります。Core 単体の演算速度 SP-ST ですでに 41.9 GFLOPS に達し、Multi-Thread 時の SP-MT では 2 core の A9 が 3 core の A8X を上回っています。クロック差を考えると iPad Pro の A9X はおそらく 100 GFLOPS を超えるでしょう。

他の CPU との比較は下記の通り。Ivy Bridge i5 は Mac Book Pro Late2013 (Core i5-3210M) の結果です。

CPU clock SP-ST DP-ST SP-MT DP-MT
Ivy Bridge i5 2.50GHz x2 48.604 24.315 90.249 45.223
Apple A9 1.85GHz x2 41.857 14.545 81.071 28.333
Tegra K1 2.20GHz x4 17.136 3.431 70.174 14.036
Athlon 5350 2.01GHz x4 15.943 6.127 63.737 24.504
Snapdragon 805 2.70GHz x4 15.575 4.547 64.316 20.393

clock から逆算すると A9 の CPU Twister は単精度の NEON 命令を 3 つ同時に実行しており、積和 x NEON 4 x 3 pipe で clock あたり 24 flop 相当となります。Ivy Bridge が 16 flop, Haswell が 32 flop なのでその中間です。ただし Haswell は 8 並列の AVX x 2 pipe なので、並列度で言えば Twister の方が上回っていることになります。単精度のスカラー命令や SSE との比較なら Twister の方が高速に実行できるかもしれません。

なお倍精度では乗算と積和が 2 並列となっており、A8 Typhoon 世代と同等になっているようです。

CPU 毎の並列度の詳細は下記の参照してください

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

計測結果は下記に追加しています。

VFP Benchmark Log 計測結果まとめ

関連エントリ
Raspberry Pi 3 の速度比較, Cortex-A53 の速度
ARM Cortex-A53 の浮動小数点演算速度とコンパイル時間の比較
2955U vs N3150/J1900/Athlon5350 (コンパイル時間の比較)
Apple TV の浮動小数点演算速度。Fire TV/Android TV との比較など
iPod touch 6 の浮動小数点演算速度は Core 2 Duo ライン超え
iPad Air 2 (Apple A8X) の浮動小数点演算能力