2015年7月31日金曜日

Tegra K1だとfloatのほうが4倍速かった話

Tegra K1はかなりパワフルだと思う.Ubuntuもすこしゆっくりだが普通に動くし,ブラウジングも問題なくできる.極端に重い処理は,CUDAでGPUに投げることができる.電力当たりのスループットに関して言えば,汎用PCに対してアドバンテージがある.

難点を挙げるのならCPUがARMコアであることだ.ほとんどのCUDAアプリケーションが,x86 CPUがホストであることを前提に書かれている.CUDAのカーネル自体は簡単に移植できるだろうが,そのアプリで使用しているライブラリはどうだろうか?
また,ホストCPUの性能,メモリ量,メモリバンド幅,などを勘案すると,やはり計算資源として扱うには足りない.そういう意味では「GTXやTesla向けに書かれたCUDAアプリをTegraで動かせる」のではなく,「計算資源に乏しいモバイル環境にもCUDAが動く環境が来た」というのが正しい表現だと思う.


本題だが,最近Tegra K1でかなり重い処理をリアルタイムでや(ろうとする)る機会があった.
元のコードは,かなりGTX980とかで数分~数時間かけて実行するのが前提のアプリケーションで,ミリ秒処理はあまり考えられていない.
そのまま実行すると,Tegra K1でリアルタイム処理するには遅すぎるので,Atomの置換機能を使ってディレクトリ全体で250箇所くらいをfloatからdoubleへ変更した.そして,そのままでは動かないので少し修正.

nvprofで性能解析したところ,double→floatでおよそ4倍の処理速度になった.

2倍になると思っていたのだが4倍だった.あまり調べていないが,倍精度浮動小数点型の操作には4倍近いクロックがかかるのかもしれない.そういえば,Kepler世代は倍精度が遅いので有名だった.

汎用コンピューターだと,「浮動小数点型で迷ったらdoubleを使っとけ」というのがかなり一般的なのだが,GPGPUの世界だとまだまだfloat全盛期だなあと思った話.
とにかくTegraを触れたのはいい機会だった.今は,半精度だが「1TFLOPS」という大台に乗せてきたTegra X1が気になる.

0 件のコメント:

コメントを投稿