gpgpu tomoaki-fp16

Post on 08-Jan-2017

495 Views

Category:

Technology

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

FP16 を使う@tomoaki_teshima

2016 8 21 (Sun)

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

FP16(binary16) 知ってますか?

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

はじめに

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

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

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

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

64bit = double 倍精度

32bit = float 単精度

16bit = half 半精度

符号 bit

指数部仮数部

1

1

1

11bit 52bit

23bit

10bit5bit

8bit

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

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

性能測定画像(float)

画像(float)

画像(half)

画像(half)

画像(float)

画像(float)

転送 転送GPU 転送 転送GPU

画像(half)

画像(half)

x x

カーネルのコード

• 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);

演算の性能差

画素数(要素数)

100

回実行し

た時の計

算時間(

us)

おや?

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

画素数(要素数)

100

回実行し

た時の計

算時間(

us)

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

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

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

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 でも受け付けるっぽい

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 の倍より低い(ほぼ同等)

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

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

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

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

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

性能測定画像(float)

画像(float)

画像(half)

画像(half)

画像(float)

画像(float)

転送 転送GPU 転送 転送GPU

画像(half)

画像(half)

x x

転送の所要時間の差

画素数(要素数)

100

回転送し

た時の所

要時間(

us)

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

転送の所要時間の差

画素数(要素数)100

回転送/

変換した

時の所要

時間(u

s)

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

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

画素数(要素数)100

回転送/

変換した

時の所要

時間(u

s)

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

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

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

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 の次期リリースに含まれます(ステマ)

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

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

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

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

半精度浮動小数点数の限界 – 丸め誤差• 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

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

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

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

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

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

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

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

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

2 )𝑛

−( 1−√52 )

𝑛}pow 関数 で計算

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

指数で計算する場合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

参考文献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/

top related