Download - Gpu vs fpga
GPU vs FPGA
@yukitaketake
竹村幸尚@DMP
がっかりポイント
• 私は「組み込み」GPUを設計しています
– CUDAとか関係ないです
– OpenCL全然盛り上がってないです
• FPGAはあまり触ってません
– 指示出す側です
– FPGAと格闘していたのは10年以上前です
• Altera FLEX10Kとか…
DMP グラフィックスIPソリューション
組込み機器向け高性能・低消費電力グラフィックスIP コア
高性能2D/3DグラフィックスIP
低電力モバイルから高性能アミューズメントまでサポート
ビルディング・ブロック構造によるスケーラブルなアーキテクチャ
フォトリアリスティック
3DグラフィックスIPコア (OpenGL ES 1.1 互換 + 独自拡張)
PICA200
標準3DグラフィックスIPコア
PICA200Lite (OpenGLES 1.1 )
SMAPH-S (OpenGLES 2.0 )
OpenVG 1.1対応
ベクターグラフィックスIPコア
SMAPH-F
GPUの初歩
• 材料
– 頂点データ
– Indexデータ
– テクスチャ
– シェーダ
• パラメタ/テーブル等をレジスタへ
void main() { #if defined MASK vec4 mask = texture2D( texture_unit2, out_texcoord0); #else const vec4 mask = vec4( 1.0, 1.0, 1.0, 1.0); #endif #if defined ALPHA_TEST if( mask.x < 0.6) discard; #endif vec3 color = texture2D( texture_unit0, out_texcoord0).xyz; color = planar_reflection2( color);
GPUの初歩
• 頂点データ処理 – 頂点ごとにデータ整形
– FP32bit化
– Index arrayに従って整列
Position0
Color0
Texture0
Palette index0
Position1
Color1
Position2
Color2
Positionx
Colorx
::
Palette index1
Palette index2
Palette indexx
::
Texture1
Texture2
Texturex
::
VPへ
FixedColor
Position0
Colo
r0
Pale
tte index0
Textu
re0
Position3
Colo
r3
Pale
tte index3
Textu
re3
Position4
Colo
r4
Pale
tte index4
Textu
re4
Fixe
dColor
Fixe
dColor
Fixe
dColor
全てfloat24/vec4
0
3
4
16
x
::
Index array
GPUの初歩
• 頂点シェーダプロセッサ
– 頂点テクスチャリード
– M-V変換
• 頂点バッファ
– 頂点シェーダ処理後のデータをストア
頂点データ処理
頂点プロセサ 頂点バッファ頂点データ
テクスチャユニット
GPUの初歩
• トライアングルセットアップ – 頂点をプリミティブ化
– クリッピング
– カリング
• ラスタライズ – 演算器の塊
• プロセッサでやるとかw
頂点データ処理
頂点プロセサ 頂点バッファ頂点データトライアングルセットアップ
ラスタライザ
テクスチャユニット
テクスチャ
GPUの初歩
• ピクセル(フラグメント)シェーダ – テクスチャリード
• ピクセルシェーダと頂点シェーダは同じプロセッサで動作させる – 元々は別プロセッサ
– ユニファイドシェーダ
頂点データ処理
ユニファイドシェーダ
頂点バッファ
頂点データ
トライアングルセットアップ
ラスタライザ
スケ
ジュ
ーラ
テクスチャユニット
テクスチャデータ
テーブル パラメタ
GPUの初歩
• ROP(Rendering Output Pipeline / Rasterize OPeration) – シェーダから1pixelのカラーを受け取って – Zバッファを読んでそのピクセルを描画すべきか判定して – そのpixelが一番手前ならZバッファを更新して – (フレームバッファから既に書かれているカラーを読んで) – (シェーダからのアルファ値に従ってブレンドして) – フレームバッファに書き込む
頂点データ処理
ユニファイドシェーダ
頂点バッファ
頂点データ
トライアングルセットアップ
ラスタライザ
スケ
ジュ
ーラ
テクスチャユニット
ROP
フレームバッファ
テクスチャデータ
テーブル/パラメタ
Zバッファ
ユニファイドシェーダと テクスチャユニットだけを使うのが
GPGPU
GPUの初歩
• まとめ図
GPUの特徴
• スループットコンピューティング – グラフィックスはmsの世界 – CPUはレイテンシコンピューティング? – FPGAはどちらにも振れる
• 最短のレイテンシを得るならFPGA
• 浮動小数点演算重視 – 圧倒的なFLOPS値
• もはやTFLOPSに • ただし電力食い
– 整数無視と言っても良いぐらい • 最近はそうでもないけど
– GPUで整数演算をするのはもったいないかも • 電力効率最悪かも • 整数ならFPGA大活躍の可能性
GPU性能を上げるために
• 可能なら固定パイプラインで – やることが決まっていればプロセッサより高効率
• 出来るだけ沢山演算器を詰める – 最低限の精度で
• 各演算器の使用率を出来るだけ高く – 沢山入れても動いてないんじゃ意味が無い
• 動作周波数を高く – パイプライン演算器
• 浮動小数点演算だと必須 – ちょっと古いGPUだと4stage – 最近のは多分8stageとか
• 整数・固定少数でも32bitなら必要 • 段数深くすれば高周波数対応可能
– 効率良く動かすのは難しくなる
パイプライン演算器
• GPUはなぜパイプライン演算器を使いこなせるのか – 各パイプラインに別々のスレッドが走っている
• GPUが性能出せる秘密はこれ
– このように動けないアプリケーションでは性能が出ない
• FPGAでも性能を出すには、同じようにパイプライン演算器にデータを詰めないといけない – レイテンシに特化するならその限りではない?
GPUのほうが有利な場合
• 大量の浮動小数点演算
• 電力気にしない
• データ並列性
• レイテンシ気にしない
FPGAのほうが有利な場合
• Float/int精度が不要 – 小さい演算器使える
• 消費電力重要 • レイテンシ重要 • パイプラインを深く出来る • 少ないリソースで足りるアプリケーション • 苦労を厭わない
– HW屋でもFPGAツールにはハマること多いです
• FPGAアーキテクチャに合う回路が作れる • 特殊なメモリアーキテクチャが必要
– 大きな帯域は必ずしも必要ない • 帯域だけで勝負したらGPUが上になる
特徴比較
CPU GPU FPGA ASIC
コスト ○ ○ △ ?
電力 ☓ ☓ ○ ◎
メモリ帯域 ○ ◎ △ ◎
自由度 △ △ ○ ◎
Op/sec ○ ◎ △ ○
開発容易性 ◎ ○ △ ☓☓
ASIC化 △ ☓ ◎ -
データ制御 ○ ☓ ◎ ◎
事例その1 - GPU
• FPGAにGPUを入れてみる。 – 使ったもの
• TED社製FPGAボード – Xilinx Virtex7使用(XC7V2000T)
» ハイエンドもいいところ
– お値段約xxx万円(当時)
– 入れたもの • DMP OpenGLES3.0準拠GPU
– SMAPH-S
– 4 shaders
» 4SIMD x 4
FPGAボード例
FPGAボード例
FPGAボード例
事例その1 - GPU
• 結果 – Slice LUT:70%
– Slice reg: 15%
– BRAM:20%
– たかが4つのSIMDプロセッサで割といっぱいということ • GPUは配線が多いので、あまり詰まらない
• 現時点ではFPGAで浮動小数点演算を扱うのはメリット少ない? – これでもかなりましになった
» Virtex6とかひどかった
• ハズレ世代に注意しましょう
事例その2 – 演算器アレイ
• 目的 – FPGAにどれぐらい浮動小数点演算器が詰まるか確
かめてみる • 格安FPGAでどれぐらいのFLOPS値まで行けるか
– 浮動小数点演算アクセラレータとして使うイメージ
• 環境 – Xilinx Zynq-7000
• XC7Z020CLG484
• f:50MHz – 速い浮動小数点演算機が用意できませんで
– 頑張れば200MHzぐらいまでは行けるかと
ブロック図
• 動作フローは以下の通り
– ARMからモード等をレジスタ設定
– DMACでARM側メモリからIBUF0又は1へ計算データ転送
– 起動。計算結果をOBUF0又は1に書き込み
– DMACでOBUFからARM側へ書き戻し
• IBUFへの書き込み及びOBUFからの読み出しは、ダ
ブルバッファにより計算中にも行う。
• FP Unit Arrayの規模をどこまで増やせるか
IBUF0
IBUF1
FP UnitArray
OBUF1
OBUF0
DMACSW
SW
AXI Interconnect master
Configuration Register
AXI Interconnect slave
ブロック図
• 基本ユニット
– Fp32 multiply and add x 4
– Fp32 x 8 variable input
– Fp32 x 4 constant input
– 4stage pipeline
MAD
MAD
MAD
MAD
INP
UNIT
ブロック図
• UNIT2つとSFU1つをセットに数珠つなぎ – SFU
• RCP/RSQ/SIN/COS/EXP/LOG • Fp32bit x 1
• あくまで評価のための回路 – 多少なりとも使い物にしようとするなら、UNITの入力及びバッファを増やさな
いといけないが… • 配線使い過ぎるとFPGAには入らない • ホントはUNIT内部に比較器等入れて、簡単な分岐が出来るようにしたい
UNITUNIT
UNITUNIT
SFU
FIFO
SFU
FIFO
IBUF0
FIFO FIFO
Constant register
FIFO
UNIT
FIFO
OBUF0
1set
FPGA構成
• AXIバスでARM側とつなぐだけ
– レジスタ設定用スレーブポートもAXIで
事例その2 – 演算器アレイ
• 結果 – Slice LUT: 94.91% – Slice Reg: 35.57% – 入ったもの
• これだけ→
– 33 FP units • 1.65GFLOPS
– もちろん実際こんなに出ませんが
• 200MHzなら6.6GFLOPS
– 1ランク上のFPGAの場合
• XC7Z030CLG484 • 93FP units • 29.65GFLOPS
– 200MHzなら118.6GFLOPS
– Artixクラスだと制御系でかなりリソース食ってしまい、計算にリソースが回らない? • Z030はKintexクラスだそうで
UNITUNIT
UNITSFU
FIFOIBUF0
FIFO FIFO
Constant register
OBUF0
まとめ
• 安価なFPGAではやれることが少ない
– 特に演算系
– 演算系ならGPUオススメ
• ASIC化を見据えたプロトタイプ作成用に魅力