GDC2013 Low-Level Thingking in High-Level Shading Languages #gdc13j

GDC2013、4日目に行われた高級シェーダー言語でシェーダー作成する際にもチップ側の挙動を考えた作りをするほうがいいよというセッションのメモです。細かいケーススタディの詳細についてはGDC Vaultに上がるはずのスライドを見るべしです。
2
xionchannel @ajinotataki

次はLow-level Thinking in High-level shading languages #gdc13j

2013-03-29 08:00:01
xionchannel @ajinotataki

背景として。昔は手でシェーダーの最適化をしていたが、今はLow-level shader languagesはしんだと。誰もつかってない。今のコードを最適化しても無駄。それよりもコードをみやすくした方がいいよ。という状況。 #gdc13j

2013-03-29 08:07:54
Fumoto Kazuhiro @FumotoKZ

#gdc13j ローレベルのシェーディング言語は死に、アーティストのためにシェーディングネットワーク(ボックスと矢印の)がおうこうしはじめた。

2013-03-29 08:09:02
xionchannel @ajinotataki

コンパイラが最適化をしてくれるからいじゃんって。でも、やつらはルールを破ることをしないってのが問題。 #gdc13j

2013-03-29 08:09:37
xionchannel @ajinotataki

でも、計算式を書いたまま実行コードにしてたりして、結構頭良くないこともあると。定数の計算を展開したりしないのかな? #gdc13j

2013-03-29 08:10:56
Fumoto Kazuhiro @FumotoKZ

#gdc13j 読みやすいシェーダコードは軟弱だ、コンパイルされたコードをみると悲鳴を上げる人がいる。みたいな感じ?そうは言ってないと思うけど。w

2013-03-29 08:13:07
xionchannel @ajinotataki

かっこの展開や、より早いコードを生成する命令を使った書き方へ書き換えた方がいいという内容ですね。あとでスライド見るのがよいかと。 #gdc13j

2013-03-29 08:17:51
xionchannel @ajinotataki

abs/neg -> input, saturate -> outputとすると命令ステップ数が減ると #gdc13j

2013-03-29 08:20:44
xionchannel @ajinotataki

これってどのチップでおなじようなもんなのかな? #gdc13j

2013-03-29 08:21:14
Fumoto Kazuhiro @FumotoKZ

#gdc13j Saturate は自由に使えて、Minと Maxは無い。Saturateを使って計算する。

2013-03-29 08:22:44
xionchannel @ajinotataki

ハードウェア命令に直結している関数を使うようにする。ものによっては直結していないので、それをよく知るべきなんですな。 #gdc13j

2013-03-29 08:24:43
xionchannel @ajinotataki

rcp(), rsqrt(), sqrt()は直結。exp(), log()はちがうと。exp2(), log2()は直結。pow(x,y)はexp2(log2(x) * y)とするべきと。 #gdc13j

2013-03-29 08:24:52
Fumoto Kazuhiro @FumotoKZ

#gdc13j あーなんかわかってきた。Hwコンパイラの動作内容を意識したコーディングをしろってこと?

2013-03-29 08:25:52
xionchannel @ajinotataki

勉強になるが、こういうのってもっと知ろうとするにはどうすればいいんだろ #gdc13j

2013-03-29 08:27:39
yamanouchi t. @yseena

日頃からアセンブラで書くと良いデスよ。;-) http://t.co/W3KGFf9LjQ RT @ajinotataki: 勉強になるが、こういうのってもっと知ろうとするにはどうすればいいんだろ #gdc13j

2013-03-29 13:55:15
Fumoto Kazuhiro @FumotoKZ

#gdc13j 例えば、mul(V,M)はv.x *m0 +....と記述する。

2013-03-29 08:28:30
Fumoto Kazuhiro @FumotoKZ

#gdc13j いまぎれさんのt-podサイトの初期の頃のシェーダコードがこういう記述でしたね。

2013-03-29 08:29:22
Fumoto Kazuhiro @FumotoKZ

#gdc13j もちろんReflect関数はi-2.0*dot(i,n)*nとかくとか。normalizeはrsqrt。

2013-03-29 08:32:46
xionchannel @ajinotataki

これは、なんか懐かしい気分になってくるセッションだなw にやにやしてくるw #gdc13j

2013-03-29 08:32:54
Fumoto Kazuhiro @FumotoKZ

#gdc13j そう言えばいつからかSoftimageがシェーだをコンパイルしたログを吐かなくなったので、こういうのが見れなくなりましたね。昔の XSI5.11とかならコンパイルログを確認しながら勉強できるかも。

2013-03-29 08:36:53
xionchannel @ajinotataki

スカラー値とベクター値の計算はスカラー値を先にまとめてやるようにしないと、途中から全部ベクター値にされちゃって無駄にコードが増えると #gdc13j

2013-03-29 08:37:19
xionchannel @ajinotataki

このての命令長がどうなるか調べるには、ビデオチップメーカーのコンパイラをつかって、直接コードをいれるとステップ数がみれたりするのでよいです #gdc13j

2013-03-29 08:38:01
xionchannel @ajinotataki

実際のディファードの例で、Lowlevelで最適化をすると1、2時間で5ー10%早くなうるのにたいして、Highlevelで最適化では数週間かかって15%遅くなるか2倍早くなるかてな感じとのこと。 #gdc13j

2013-03-29 08:41:19
Fumoto Kazuhiro @FumotoKZ

#gdc13j 1ー2時間の作業でシェーダーは7%短く、ディレクションライトなら5% ポイントライトなら10%早くなると。

2013-03-29 08:41:51