O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

Gpgpu tomoaki-fp16

1.131 visualizações

Publicada em

GPGPU 勉強会 #4 の資料
http://connpass.com/event/35554/

Publicada em: Tecnologia
  • Seja o primeiro a comentar

Gpgpu tomoaki-fp16

  1. 1. FP16を使う @tomoaki_teshima 2016 8 21 (Sun)
  2. 2. みなさん 浮動小数点使ってますか?
  3. 3. FP16(binary16)知ってますか?
  4. 4. 浮動小数点のフォーマット 暗唱できますか?
  5. 5. はじめに
  6. 6. 今日の発表 • FP16の解説 • GTX1080でのパフォーマンス測定結果 • とその考察 • FP16の真のメリット • FP16データをどう作るのか? • FP16の限界 • お前誰やねん
  7. 7. FP16とは? • IEEE 754-2008で定義された16bit幅の浮動小数点 • float(32bit)に対して、half precision
  8. 8. 浮動小数点数のフォーマット IEEE754 64bit = double 倍精度 32bit = float 単精度 16bit = half 半精度 符号bit 指数部 仮数部 1 1 1 11bit 52bit 23bit 10bit5bit 8bit
  9. 9. なにゆえFP16? • Pascalから、FP16での演算が サポートされた • 32bit floatの倍のスループット • GPGPU勉強会向けのネタ! http://pc.watch.impress.co.jp/docs/column/kaigai/752331.html
  10. 10. 性能測定 画像 (float) 画像 (float) 画像 (half) 画像 (half) 画像 (float) 画像 (float) 転送 転送GPU 転送 転送GPU 画像 (half) 画像 (half) x x
  11. 11. カーネルのコード • 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);
  12. 12. 演算の性能差 画素数(要素数) 100回実行した時の計算時間(us) おや?
  13. 13. 演算の性能差(追加スライド) 画素数(要素数) 100回実行した時の計算時間(us)
  14. 14. 演算の性能比の考察(追加スライド) • 前スライドの結果だけ見ると、half2を使うのが一番 速い(ように見える) • ただし、ちょっと複雑 • FP16コアのスループットはFP32コアと同等(後述) • カーネル内の演算は掛け算のみ • 演算が単純なので、メモリ律速に近い状況になる • half2は1回の演算で2要素演算するので、halfに比べて かなり速くなる • half がfloatより速いのはメモリ?
  15. 15. 何で発表時の資料がダメダメだったか (追加スライド) • 多分時間測定の分解能が十分じゃなかった • カーネルがあまりにも短時間で終わるので、毎回 測定して100回分足し算すると、結果がハチャメ チャになったのではないか、と推測。 • 今回は100回{データ転送+演算}を行い、合計の 経過時間から、データ転送の時間を差し引き、前 述の結果になった。
  16. 16. 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
  17. 17. 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でも受け付けるっぽい
  18. 18. 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の倍より低い(ほぼ同等)
  19. 19. 結論:float で遅ければP100を使えば良いじゃない http://www.irasutoya.com/2013/03/blog-post_159.html いらすとや
  20. 20. 今日の発表 • FP16の解説 • GTX1080でのパフォーマンス測定結果 • とその考察 • FP16の真のメリット • FP16データをどう作るのか? • FP16の限界 • お前誰やねん
  21. 21. half のメリットって薄くね? • 転送時間が短くなります!
  22. 22. 性能測定 画像 (float) 画像 (float) 画像 (half) 画像 (half) 画像 (float) 画像 (float) 転送 転送GPU 転送 転送GPU 画像 (half) 画像 (half) x x
  23. 23. 転送の所要時間の差 画素数(要素数) 100回転送した時の所要時間(us)
  24. 24. halfへの変換のオーバーヘッド • 通常halfのデータは存在しない • float のデータをそのままGPUに転送するか • float のデータをhalfに変換してGPUに転送するか • halfの変換ってどうやるの?→後述 • どれ位時間がかかるの?
  25. 25. 転送の所要時間の差 画素数(要素数) 100回転送/変換した時の所要時間(us) Intel(R) Xeon(R) CPU E5-2623
  26. 26. 転送の所要時間の差(追加スライド) 画素数(要素数) 100回転送/変換した時の所要時間(us) シングルスレッド、_mm_cvtps_ph使用時 Intel(R) Xeon(R) CPU E5-2623
  27. 27. floatでの転送vs halfでの転送 • half への変換は実用的なスピード • 同じデータを使い回す場合は十分実用的 • 変換してから転送してもtotalで所要時間を上回る可能 性が十分ある • マルチコア化、256bit幅で高速化の余地がまだある • そもそも、どうやって変換するの?
  28. 28. 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の次期リリースに含まれます (ステマ)
  29. 29. 今日の発表 • FP16の解説 • GTX1080でのパフォーマンス測定結果 • とその考察 • FP16の真のメリット • FP16データをどう作るのか? • FP16の限界 • お前誰やねん
  30. 30. 半精度浮動小数点数の限界 – オーバーフロー • float の最大 • 指数部8bit、仮数部23bit→ 10E38 まで扱える • signed intの最大 + 2,147,483,647 より大きい • half の最大 • 指数部5bit、仮数部10bit→65504まで扱える • unsigned shortの最大 +65536より小さい!
  31. 31. 半精度浮動小数点数の限界 – 丸め誤差 • 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
  32. 32. どういう時に使うべきか? • 値域が限定的かつ小さい場合 • 乗算、除算などには向いている • 例 • 回転行列(sin, cosは絶対値が1未満) • 画像の座標もなんとかhalfの範囲に入る • ゲイン処理(1/8 – 8 倍程度)
  33. 33. まとめ • FP16での演算がPascalからサポートされた • 従来より変換はサポートされていた • FP16のまま演算ができる • FP32の倍のスループットを持つ • 対象GPUはまだ限定的 • TX1はMaxwellアーキテクチャだが、対応している • バイト数が変わるので転送時間には如実に効く • CPU側で変換したのちに転送しても、十分早い • FP16は銀の弾丸というわけでは無い • Bit幅が減った分、精度が犠牲になっている
  34. 34. そもそものきっかけ • CodeIQで出題された「マヨイドーロ問題」に挑戦 • フィボナッチ数を求める計算 • 再帰関数で計算 • メモ化再帰で計算 • 指数関数で計算 𝑝 𝑛 = 1 5 1 + 5 2 𝑛 − 1 − 5 2 𝑛 pow 関数 で計算 マヨイドーロ問題 - https://codeiq.jp/q/2549 解説 - https://codeiq.jp/magazine/2015/12/35521/
  35. 35. 指数で計算する場合 n Fn pnの結果 桁数(10進) 桁数(2進) 73 806515533049393 806515533049393 15 50 74 1304969544928657 1304969544928657 16 51 75 2111485077978050 2111485077978050 16 51 76 3416454622906707 3416454622906706 16 52 77 5527939700884757 5527939700884756 16 53 78 8944394323791464 8944394323791464 16 53 79 14472334024676221 14472334024676218 17 54
  36. 36. 参考文献 1. 半精度浮動小数点数 - Wikipedia https://ja.wikipedia.org/wiki/半精度浮動小数点数 2. 【後藤弘茂のWeekly海外ニュース】倍精度浮動小数点演算性能を引き上げた新GPU アーキテクチャ「Pascal」 - PC Watch http://pc.watch.impress.co.jp/docs/column/kaigai/752331.html 3. 【後藤弘茂のWeekly海外ニュース】NVIDIAがグラフィックスに最適化したPascal 「GeForce GTX 1080」を正式発表 - PC Watch http://pc.watch.impress.co.jp/docs/column/kaigai/757916.html 4. 西川善司の3DGE:「GeForce GTX 1080」とはどんなGPUか。そのアーキテクチャをひも とく - 4Gamer.net http://www.4gamer.net/games/251/G025177/20160516073/ 5. 結城浩の「マヨイドーロ問題」 | CodeIQ https://codeiq.jp/q/2549 6. 結城浩の「マヨイドーロ問題」解説|CodeIQ MAGAZINE https://codeiq.jp/magazine/2015/12/35521/

×