フォト

Google AdSense

  • AdSense
無料ブログはココログ

« 渡米準備 | トップページ | 頂点シェーダでのUAV使用 »

2013.07.11

DX10以降のHLSLのhalfの挙動の話メモ

ちょうどTwitterで出た話題のメモ。

HLSLにhalf型という変数型があるわけですが、DX9世代だと16bit浮動小数点値なわけで、GPUによってはこれで演算処理が速くなったりするんですがDX10以降だとちょいと事情が変わります。

Scalar Types(英語、最新情報)
http://msdn.microsoft.com/en-us/library/windows/desktop/bb509646(v=vs.85).aspx

スカラー型(日本語、古い。halfの記述はあってるけど、後述の低精度変数の話は無い)
http://msdn.microsoft.com/ja-jp/library/ee418354(v=vs.85).aspx

このデータ型は、言語互換性を維持するためにのみ提供されています。Direct3D 10 シェーダー ターゲットは、すべての half データ型を float データ型にマップします。half データ型は、均一グローバル変数では使用できません (この機能が必要な場合は /Gec フラグを使用します)。

・・・というわけで、DX10以降のSM4.0以降だとhalfを使ってもfloatになるので最適化目的でのhalf型の使用はできません。

一方で、英語のドキュメントを読むと下記のような見慣れない変数があります。

min16float - minimum 16-bit floating point value.
min10float - minimum 10-bit floating point value.
min16int - minimum 16-bit signed integer.
min12int - minimum 12-bit signed integer.
min16uint - minimum 16-bit unsigned integer.

DX11はWindows RTやWindows Phone 8などのモバイルOSでも使用できるわけですが、これらの端末のGPUは
OpenGL ES 2.0を使ったiOSやAndroidでおなじみですが、それらの低精度で実行するのと同じような感じですね。消費電力や速度のために変数の精度を下げるって感じですね。

GPUとドライバによって実際に効果があるかはまちまち(32bitで実行される場合も)ですが、精度を下げて速度を稼ぐという場合にはこちらの記述を使った方が良さそうですね。

« 渡米準備 | トップページ | 頂点シェーダでのUAV使用 »

Programming」カテゴリの記事

コメント

最近のGPUでは4Byteレジスタへのhalf 2Bパックなどもあるようですよ

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

« 渡米準備 | トップページ | 頂点シェーダでのUAV使用 »