狠狠撸

狠狠撸Share a Scribd company logo
GPU vs FPGA
@yukitaketake
竹村幸尚@DMP
がっかりポイント
? 私は「組み込み」GPUを設計しています
– CUDAとか関係ないです
– OpenCL全然盛り上がってないです

? FPGAはあまり触ってません
– 指示出す側です
– FPGAと格闘していたのは10年以上前です
? Altera FLEX10Kとか…
DMP グラフィックスIPソリューション
? 組込み機器向け高性能?低消費電力グラフィックスIP コア
? 高性能2D/3DグラフィックスIP

? 低電力モバイルから高性能アミューズメントまでサポート
? ビルディング?ブロック構造によるスケーラブルなアーキテクチャ

OpenVG 1.1対応
PICA200Lite (OpenGLES 1.1 ) ベクターグラフィックスIPコア

フォトリアリスティック
3DグラフィックスIPコア

標準3DグラフィックスIPコア

(OpenGL ES 1.1 互換 + 独自拡
張)

SMAPH-S (OpenGLES 2.0 )

PICA200

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の初歩
? 頂点データ処理
Position0

– 頂点ごとにデータ整形
– FP32bit化
– Index arrayに従って整列

Color 0
Position1
Color 1
Position2
Color 2
:
:

Color0

:
:
Palette indexx

0
3
4
16
:
:
x
Index array

Position0

Palette index0

Texture0

FixedColor

Color3

全てfloat24/vec4

Texturex

FixedColor

Position3

Palette index3

Texture3

Position4

Palette index2

FixedColor

:
:

Palette index0
Palette index1

Color4

Texture2

Texture4

Texture1

Palette index4

Colorx

Texture0

FixedColor

Positionx

VPへ
GPUの初歩
? 頂点シェーダプロセッサ
– 頂点テクスチャリード
– M-V変換

? 頂点バッファ
– 頂点シェーダ処理後のデータをストア
テクスチャ
ユニット

頂点データ

頂点データ
処理

頂点プロセサ

頂点バッファ
GPUの初歩
? トライアングルセットアップ
– 頂点をプリミティブ化
– クリッピング
– カリング

? ラスタライズ

テクスチャ

– 演算器の塊
? プロセッサでやるとかw
テクスチャ
ユニット

頂点データ

頂点データ
処理

頂点プロセサ

頂点バッファ

トライアングル
セットアップ

ラスタライザ
GPUの初歩
テーブル

パラメタ

? ピクセル(フラグメント)シェーダ
– テクスチャリード

頂点データ
処理

頂点バッファ

トライアングル
セットアップ

ラスタライザ

スケジューラ

頂点データ

ユニファイド
シェーダ

テクスチャユニット

テクスチャデータ

? ピクセルシェーダと頂点シェー
ダは同じプロセッサで動作させ
る
– 元々は別プロセッサ
– ユニファイドシェーダ
GPUの初歩
?

ROP(Rendering Output Pipeline / Rasterize OPeration)
–
–
–
–
–
–

シェーダから1pixelのカラーを受け取って
Zバッファを読んでそのピクセルを描画すべきか判定して
そのpixelが一番手前ならZバッファを更新して
(フレームバッファから既に書かれているカラーを読んで)
(シェーダからのアルファ値に従ってブレンドして)
フレームバッファに書き込む

頂点データ

テーブル/パラメタ

頂点データ
処理

Zバッファ

トライアングル
セットアップ

スケジューラ

ユニファイドシェーダと
テクスチャユニットだけを使うのが
GPGPU

頂点バッファ

ユニファイド
シェーダ
ROP

フレームバッファ

ラスタライザ

テクスチャユニット

テクスチャデータ
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
贵笔骋础ボード例
贵笔骋础ボード例
贵笔骋础ボード例
事例その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ぐらいまでは行けるかと
ブロック図
?

動作フローは以下の通り

AXI Interconnect master

–

DMAC

–

–

FP Unit
Array

IBUF1

SW

OBUF0

SW

IBUF0

–
OBUF1

?

IBUFへの書き込み及び
OBUFからの読み出しは、ダ
ブルバッファにより計算中
にも行う。

?

FP Unit Arrayの規模をどこ
まで増やせるか

Configuration Register

AXI Interconnect slave

ARMからモード等をレジス
タ設定
DMACでARM側メモリから
IBUF0又は1へ計算データ
転送
起動。計算結果をOBUF0
又は1に書き込み
DMACでOBUFからARM側
へ書き戻し
ブロック図
MAD

MAD

INP

MAD

MAD

UNIT

? 基本ユニット
– Fp32 multiply and add x 4
– Fp32 x 8 variable input
– Fp32 x 4 constant input
– 4stage pipeline
ブロック図
1set
IBUF0

UNIT

FIFO
UNIT
SFU
UNIT

FIFO
UNIT
SFU
UNIT

FIFO

FIFO

FIFO

OBUF0

FIFO

Constant register

?

UNIT2つとSFU1つをセットに数珠つなぎ
– SFU
? RCP/RSQ/SIN/COS/EXP/LOG
? Fp32bit x 1

?

あくまで評価のための回路
– 多少なりとも使い物にしようとするなら、UNITの入力及びバッファを増やさな
いといけないが…
? 配線使い過ぎるとFPGAには入らない
? ホントはUNIT内部に比較器等入れて、簡単な分岐が出来るようにしたい
FPGA構成
?

AXIバスでARM側と
つなぐだけ
– レジスタ設定用ス
レーブポートも
AXIで
事例その2 – 演算器アレイ
?

結果
– Slice LUT: 94.91%
– Slice Reg: 35.57%
– 入ったもの
?

IBUF0

UNIT

FIFO
UNIT
SFU
UNIT

これだけ→

– 33 FP units

FIFO

?

1.65GFLOPS

?

200MHzなら6.6GFLOPS

FIFO

–

もちろん実際こんなに出ませんが
Constant register

– 1ランク上のFPGAの場合
?
?
?

XC7Z030CLG484
93FP units
29.65GFLOPS
–

200MHzなら118.6GFLOPS

– Artixクラスだと制御系でかなりリソース食ってしまい、計算にリソースが回らない?
?

Z030はKintexクラスだそうで

OBUF0
まとめ
? 安価なFPGAではやれることが少ない
– 特に演算系
– 演算系ならGPUオススメ

? ASIC化を見据えたプロトタイプ作成用に魅力

More Related Content

Gpu vs fpga