gpgpu tomoaki-fp16

36
FP16 ををを @tomoaki_teshima 2016 8 21 (Sun)

Upload: tomoaki0705

Post on 08-Jan-2017

498 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Gpgpu tomoaki-fp16

FP16 を使う@tomoaki_teshima

2016 8 21 (Sun)

Page 2: Gpgpu tomoaki-fp16

みなさん浮動小数点使ってますか?

Page 3: Gpgpu tomoaki-fp16

FP16(binary16) 知ってますか?

Page 4: Gpgpu tomoaki-fp16

浮動小数点のフォーマット暗唱できますか?

Page 5: Gpgpu tomoaki-fp16

はじめに

Page 6: Gpgpu tomoaki-fp16

今日の発表• FP16 の解説• GTX1080 でのパフォーマンス測定結果• とその考察

• FP16 の真のメリット• FP16 データをどう作るのか?• FP16 の限界• お前誰やねん

Page 7: Gpgpu tomoaki-fp16

FP16 とは?• IEEE 754-2008 で定義された 16bit 幅の浮動小数点• float(32bit) に対して、 half precision

Page 8: Gpgpu tomoaki-fp16

浮動小数点数のフォーマットIEEE754

64bit = double 倍精度

32bit = float 単精度

16bit = half 半精度

符号 bit

指数部仮数部

1

1

1

11bit 52bit

23bit

10bit5bit

8bit

Page 9: Gpgpu tomoaki-fp16

なにゆえ FP16 ?• Pascal から、 FP16 での演算がサポートされた• 32bit float の倍のスループット• GPGPU 勉強会向けのネタ!

http://pc.watch.impress.co.jp/docs/column/kaigai/752331.html

Page 10: Gpgpu tomoaki-fp16

性能測定画像(float)

画像(float)

画像(half)

画像(half)

画像(float)

画像(float)

転送 転送GPU 転送 転送GPU

画像(half)

画像(half)

x x

Page 11: Gpgpu tomoaki-fp16

カーネルのコード

• half の演算には intrinsic を使う• half を 2 要素使った half2 も試してみる

half g = gain[px]; half i = src[px];

i = __hmul(g, i);

dst[px] = __hmul(g, i);

float g = gain[px]; float i = src[px];

i = g*i;

dst[px] = g*i;

half2 g = gain[px]; half2 i = src[px];

i = __hmul2(g, i);

dst[px] = __hmul2(g, i);

Page 12: Gpgpu tomoaki-fp16

演算の性能差

画素数(要素数)

100

回実行し

た時の計

算時間(

us)

おや?

Page 13: Gpgpu tomoaki-fp16

演算の性能差(追加スライド)

画素数(要素数)

100

回実行し

た時の計

算時間(

us)

Page 14: Gpgpu tomoaki-fp16

演算の性能比の考察(追加スライド)• 前スライドの結果だけ見ると、 half2 を使うのが一番速い(ように見える)• ただし、ちょっと複雑• FP16 コアのスループットは FP32 コアと同等(後述)• カーネル内の演算は掛け算のみ• 演算が単純なので、メモリ律速に近い状況になる• half2 は 1 回の演算で 2 要素演算するので、 half に比べてかなり速くなる• half が float より速いのはメモリ?

Page 15: Gpgpu tomoaki-fp16

何で発表時の資料がダメダメだったか(追加スライド)• 多分時間測定の分解能が十分じゃなかった• カーネルがあまりにも短時間で終わるので、毎回測定して 100 回分足し算すると、結果がハチャメチャになったのではないか、と推測。• 今回は 100 回{データ転送+演算}を行い、合計の経過時間から、データ転送の時間を差し引き、前述の結果になった。

Page 16: Gpgpu tomoaki-fp16

GTX1080 では。。。• FP16 コアは FP32 コアと同等のパフォーマンスしか発揮しない• = FP16 で倍速は幻!( GTX1080 では)• Tesla P100 では FP16 演算は FP32 演算の倍のスループット• GP100 ( Tesla P100 )• GP102 ( GTX1080 Ti )• GP104 ( GTX1080 、 GTX1070 )• GP106 ( GTX1060 )

http://www.4gamer.net/games/251/G025177/20160516073/

http://pc.watch.impress.co.jp/docs/column/kaigai/757916.html

Page 17: Gpgpu tomoaki-fp16

CC の値から考察CC Architecture Geforce Tesla Tegra

5.0 Maxwell 940M, 950M, 960M

5.2 970, 980, TitanX M4, M40, M6, M60

5.3 X1

6.0 Pascal P100

6.1 1060, 1070, 1080

FP16 対応?

※ ただし、 FP32←→FP16 変換命令自体はかなり古い CC でも受け付けるっぽい

Page 18: Gpgpu tomoaki-fp16

CC の値から考察(追加スライド)CC Architecture Geforce Tesla Tegra

5.0 Maxwell 940M, 950M, 960M

5.2 970, 980, TitanX M4, M40, M6, M60

5.3 X1

6.0 Pascal P100

6.1 1060, 1070, 1080

FP16 演算命令

※ ただし、 FP32←→FP16 変換命令自体は CC=1.0 から存在する※CC=5.3 と 6.0 は FP16 のスループットは FP32 の倍※CC=6.1 でも FP16 演算はサポートするが、スループットは FP32 の倍より低い(ほぼ同等)

Page 19: Gpgpu tomoaki-fp16

結論 :float で遅ければ P100 を使えば良いじゃない

http://www.irasutoya.com/2013/03/blog-post_159.htmlいらすとや

Page 20: Gpgpu tomoaki-fp16

今日の発表• FP16 の解説• GTX1080 でのパフォーマンス測定結果• とその考察

• FP16 の真のメリット• FP16 データをどう作るのか?• FP16 の限界• お前誰やねん

Page 21: Gpgpu tomoaki-fp16

half のメリットって薄くね?• 転送時間が短くなります!

Page 22: Gpgpu tomoaki-fp16

性能測定画像(float)

画像(float)

画像(half)

画像(half)

画像(float)

画像(float)

転送 転送GPU 転送 転送GPU

画像(half)

画像(half)

x x

Page 23: Gpgpu tomoaki-fp16

転送の所要時間の差

画素数(要素数)

100

回転送し

た時の所

要時間(

us)

Page 24: Gpgpu tomoaki-fp16

half への変換のオーバーヘッド• 通常 half のデータは存在しない• float のデータをそのまま GPU に転送するか• float のデータを half に変換して GPU に転送するか• half の変換ってどうやるの?→後述• どれ位時間がかかるの?

Page 25: Gpgpu tomoaki-fp16

転送の所要時間の差

画素数(要素数)100

回転送/

変換した

時の所要

時間(u

s)

Intel(R) Xeon(R) CPU E5-2623

Page 26: Gpgpu tomoaki-fp16

転送の所要時間の差(追加スライド)

画素数(要素数)100

回転送/

変換した

時の所要

時間(u

s)

シングルスレッド、 _mm_cvtps_ph 使用時 Intel(R) Xeon(R) CPU E5-2623

Page 27: Gpgpu tomoaki-fp16

float での転送 vs half での転送• half への変換は実用的なスピード• 同じデータを使い回す場合は十分実用的• 変換してから転送しても total で所要時間を上回る可能性が十分ある• マルチコア化、 256bit 幅で高速化の余地がまだある

• そもそも、どうやって変換するの?

Page 28: Gpgpu tomoaki-fp16

Float/half 変換の方法• ARM/x86/MIPS の SIMD 命令に変換命令がある• x86 系列 (F16C)→vcvtps2ph (_mm_cvtps_ph)• ARM(NEON)→VCVTB.F16.F32 (vcvt_f16_f32)• MIPS(MSA)→FEXDO.H (__builtin_msa_fexdo_h)

• ソフト実装も OpenCV の次期リリースに含まれます(ステマ)

Page 29: Gpgpu tomoaki-fp16

今日の発表• FP16 の解説• GTX1080 でのパフォーマンス測定結果• とその考察

• FP16 の真のメリット• FP16 データをどう作るのか?• FP16 の限界• お前誰やねん

Page 30: Gpgpu tomoaki-fp16

半精度浮動小数点数の限界 – オーバーフロー• float の最大• 指数部 8bit 、仮数部 23bit→ 10E38 まで扱える• signed int の最大 + 2,147,483,647 より大きい

• half の最大• 指数部 5bit 、仮数部 10bit→65504 まで扱える• unsigned short の最大 +65536 より小さい!

Page 31: Gpgpu tomoaki-fp16

半精度浮動小数点数の限界 – 丸め誤差• float の丸め誤差

• 16777216(=2^24) までは整数を正確に表記できる• half の丸め誤差

• 2048 (=2^11) までは整数を正確に表記できる• 1024-2048 のレンジだと小数点以下の情報は失われる• 512-1024 のレンジだと 0.5刻みでしか表現できない

• Ex. 180.5 + 178.2 + 185.2 + 150.3 + 160.3 = 854.5• 正しい平均値 170.9• Half で計算 171.0 ← 丸め誤差 0.1

Page 32: Gpgpu tomoaki-fp16

どういう時に使うべきか?• 値域が限定的かつ小さい場合•乗算、除算などには向いている• 例• 回転行列( sin, cos は絶対値が 1未満)• 画像の座標もなんとか half の範囲に入る• ゲイン処理( 1/8 – 8 倍程度)

Page 33: Gpgpu tomoaki-fp16

まとめ• FP16 での演算が Pascal からサポートされた• 従来より変換はサポートされていた• FP16 のまま演算ができる

• FP32 の倍のスループットを持つ• 対象 GPU はまだ限定的• TX1 は Maxwell アーキテクチャだが、対応している

• バイト数が変わるので転送時間には如実に効く• CPU側で変換したのちに転送しても、十分早い

• FP16 は銀の弾丸というわけでは無い• Bit 幅が減った分、精度が犠牲になっている

Page 34: Gpgpu tomoaki-fp16

そもそものきっかけ• CodeIQ で出題された「マヨイドーロ問題」に挑戦• フィボナッチ数を求める計算

• 再帰関数で計算• メモ化再帰で計算• 指数関数で計算

𝑝𝑛=1√5 {( 1+√5

2 )𝑛

−( 1−√52 )

𝑛}pow 関数 で計算

マヨイドーロ問題 - https://codeiq.jp/q/2549 解説 - https://codeiq.jp/magazine/2015/12/35521/

Page 35: Gpgpu tomoaki-fp16

指数で計算する場合n Fn pnの結果 桁数 (10

進 )桁数 (2進 )

73 806515533049393 806515533049393 15 5074 1304969544928657 1304969544928657 16 5175 2111485077978050 2111485077978050 16 5176 3416454622906707 3416454622906706 16 5277 5527939700884757 5527939700884756 16 5378 8944394323791464 8944394323791464 16 5379 14472334024676221 14472334024676218 17 54

Page 36: Gpgpu tomoaki-fp16

参考文献1. 半精度浮動小数点数 - Wikipediahttps://ja.wikipedia.org/wiki/半精度浮動小数

点数

2. 【後藤弘茂の Weekly 海外ニュース】倍精度浮動小数点演算性能を引き上げた新 GPU アーキテクチャ「 Pascal 」 - PC Watchhttp://pc.watch.impress.co.jp/docs/column/kaigai/752331.html

3. 【後藤弘茂の Weekly 海外ニュース】 NVIDIA がグラフィックスに最適化したPascal 「 GeForce GTX 1080 」を正式発表 - PC Watchhttp://pc.watch.impress.co.jp/docs/column/kaigai/757916.html

4. 西川善司の 3DGE :「 GeForce GTX 1080 」とはどんな GPU か。そのアーキテクチャをひもとく - 4Gamer.nethttp://www.4gamer.net/games/251/G025177/20160516073/

5. 結城浩の「マヨイドーロ問題」 | CodeIQ https://codeiq.jp/q/2549

6. 結城浩の「マヨイドーロ問題」解説| CodeIQ MAGAZINEhttps://codeiq.jp/magazine/2015/12/35521/