月別アーカイブ: 2007年7月

D3D10 row_major column_major

HLSL では matrix のフォーマットとして、宣言時に row_major と column_major
を選ぶことができます。例えば float4x4 (matrix) と float4 (vector) の乗算
ではどちらで宣言しても
 ・水平演算 dp4 命令を使うか
 ・並列に積和展開するか
の違いになります。命令ステップ数どちらもは 4 で動作上は影響が出ません。
以前こちらのメモに書いた 2種類のコード展開がちょうどこの
row_major と columns_major の違いに相当します。
並列積和か水平か
(row_major, columns_major の違いだけでなく乗算順の設計にも依存する)

なので、エンジン側の設計に合わせて row_major にするか columns_major に
するか選ぶことができます。混在も可能でその辺は HLSL コンパイラがうまい
具合に合わせてくれます。

ただし入力が float3 になると少々話が違ってきます。

例えば VertexShader の入力頂点 float3 を、LocalToWorld float4x4 に
乗算する場合を考えます。

  float4 wpos= mul( LocalToWorld, float4( Input.Position.xyz, 1 ) );
  Output.Pos= mul( WorldToProjection, wpos );

このとき入力頂点の w に 1を代入し、matrix の translation 成分が
そのまま加算されるようにします。

このコードは、積和に水平展開されるとちょうど最後の積和が
単純な加算に置き換わるだけなのでコードのステップ数に影響が出ません。

 vs_4_0
 dcl_input v0.xyz
 dcl_input v1.xyz
 dcl_input v2.xy
 dcl_output_siv o0.xyzw , position
 dcl_output o1.xyz
 dcl_output o2.xy
 dcl_constantbuffer cb0[21], immediateIndexed
 dcl_constantbuffer cb1[4], immediateIndexed
 dcl_temps 2
 mul r0.xyzw, v0.yyyy, cb1[1].xyzw
 mad r0.xyzw, cb1[0].xyzw, v0.xxxx, r0.xyzw
 mad r0.xyzw, cb1[2].xyzw, v0.zzzz, r0.xyzw
 add r0.xyzw, r0.xyzw, cb1[3].xyzw     // w=1 のときの加算
 mul r1.xyzw, r0.yyyy, cb0[5].xyzw
 mad r1.xyzw, cb0[4].xyzw, r0.xxxx, r1.xyzw
 mad r1.xyzw, cb0[6].xyzw, r0.zzzz, r1.xyzw
 mad o0.xyzw, cb0[7].xyzw, r0.wwww, r1.xyzw // ここは積和のまま
 mov o1.xyz, v1.xyzx
 mov o2.xy, v2.xyxx
 ret
 // Approximately 11 instruction slots used

ところが水平加算の dp4 に展開されると

 vs_4_0
 dcl_input v0.xyz
 dcl_input v1.xyz
 dcl_input v2.xy
 dcl_output_siv o0.xyzw , position
 dcl_output o1.xyz
 dcl_output o2.xy
 dcl_constantbuffer cb0[21], immediateIndexed
 dcl_constantbuffer cb1[4], immediateIndexed
 dcl_temps 2
 mov r0.xyz, v0.xyzx // w を書き換えるためにテンポラリにコピー
 mov r0.w, l(1.000000) // w=1 に代入
 dp4 r1.x, cb1[0].xyzw, r0.xyzw
 dp4 r1.y, cb1[1].xyzw, r0.xyzw
 dp4 r1.z, cb1[2].xyzw, r0.xyzw
 dp4 r1.w, cb1[3].xyzw, r0.xyzw
 dp4 o0.x, cb0[4].xyzw, r1.xyzw
 dp4 o0.y, cb0[5].xyzw, r1.xyzw
 dp4 o0.z, cb0[6].xyzw, r1.xyzw
 dp4 o0.w, cb0[7].xyzw, r1.xyzw
 mov o1.xyz, v1.xyzx
 mov o2.xy, v2.xyxx
 ret
 // Approximately 13 instruction slots used

w=1 の代入のために 2命令増えてしまいます。
消費するテンポラリ変数の個数は変わらないので、スレッド数の差は出ていない
と思われます。

ShaderModel1 の nVIDIA 拡張では、dp4 の時に vector 側の最後の成分を
強制的に 1 とみなす dph 命令がありました。もし dph 命令があったら
w=1 代入は不要なので、命令数に差は出ません。

命令の依存関係で見た場合は、mad よりも dp4 の方が直前の命令との相関性が
薄いので並列化では有利に見えます。もし依存関係によるパイプラインストール
が存在しているのなら dp4 の方が良いのかもしれません。
(とはいってもこの例ではバイパスが利くケースなのでストールは限られると
思います)
スレッドによる並列化で、そもそもパイプラインストールが存在しないなら
純粋に命令数が少ない mad の方がきっと速いのでしょう。

また実際はドライバによってさらに GPU 毎にネイティブな命令にコードに
置き換わっているので、このような単純な比較はできないのかもしれません。

CEDEC 2007

今年はメルトダウンどころか鉄人も無いんですね。
CEDEC 2007
去年から参加の ATI もいないし、
DirectX 系のセッションが大幅に減った感じです。

Let’s note R4 に Vista

パナソニックの公式ページに Vista へのアップグレード情報が載っていたので
アップグレードしてみました。2005年発売のレッツノート R4 です。評価リストでも
ぎりぎり一番下。だめだったら戻すつもり。
Windows Vista サポート評価情報(Windows XP からのアップグレード)

Let’snote LIGHT R4
 CF-R4HW
 PentiumM 753 (1.2GHz)
 915GMS Express
 RAM 1G

一旦 XP のリカバリかけてから行いました。
R4 は HDD 内のイメージから再インストールできます。
その後 Vista へのアップグレードです。
アップグレードだと DVD から起動する必要が無いので、適当な DVD ドライブ
を USB 接続して使いました。
手順は完全に評価情報ページにあるマニュアルどおりです。

結果

評価: 1.0 Windows エクスペリエンス インデックス
 プロセッサ: 2.8
 メモリ(RAM): 4.1
 グラフィックス: 1.9
 ゲーム用グラフィックス: 1.0
 プライマリハードディスク: 3.9

評価の数値にちょっと驚いたけど、内蔵グラフィック機能が古いので
こんなもんでしょうか。
915 でも一応 PixelShader2.0 は動くんですけど、、やっぱりだめか。
描画はもちろん Aero Glass は無理で、いかにもがんばって描いてます
といった感じのもたつきが見えます。
描画以外はそこそこ動いています。

emobile EM・ONE ワンセグのバッテリー寿命

ファームアップデートでワンセグ視聴が良い感じになったので軽く
使ってみました。

・Mugen Power 3400mAh バッテリー充電済み
・無線LAN OFF
・Bluetooth OFF
・HSDPA OFF
・画面の明るさ7段階中真ん中(設定→システム→バックライト→明るさ)
・音声出力 OFF
・ワンセグの電波状況は非常に良い

できる限り省電力に設定し、別の作業中だったので音声は OFF にしています。

この状態で TV 付けっぱなしにして 4時間10分放置。
その後バッテリー残量を見てみるとこの状態。

バッテリーが空になるまでまだまだ時間がかかりそうなのでここであきらめました。
これからは遠慮なく、ポータブル TV としても活用することにします。

blog内関連記事
emobile EM・ONE ファームアップとワンセグ
EM・ONE 新ファームウエア v1.01
emobile EM・ONE スーパー大容量バッテリ2
EMOBILE EM・ONE スーパー大容量バッテリー

DirectX10 は敷居が高い?

あえて DirectX10 と書いてます。やはり始めるまでいろいろ障害があって、
今までよりも手を出しにくく敷居が高いように感じます。
その理由を考えてみました。

・WindowsVista が必要
・DirectX10 対応ビデオカードが必要

DirectX10 が動作する条件としてこの2つがあります。
そろえるだけでも結構な出費です。
PC まるごと置き換える予定がなければ、両方そろっての入れ替えは大事です。
必要なソフトの対応状況とか考えると、OS もビデオカードも入れ替えには
それぞれリスクがあります。

○今まではどうだったのか

古いバージョンの OS に対して DirectX のサポートが打ち切られることは
ありました。でも新しい DirectX の動作のために OS の入れ替えが必要になる
ことはまれでした。比較的早く動作制限が付いたのは NT4 くらいでしょうか。

OS と DirectX の更新は非同期で、それぞれお互いにリリースや対応状況に
影響しあうことがあまりなかったからです。
両方一度に入れ替えを必要とするのはたぶん今回が初めてでしょう。
それだけ Vista と DirectX は密接だということなのでしょう。

○GPU の場合

DirectX9 でも DirectX8 世代に登場した ShaderModel1.0 は使えますし、
DirectX8 でも DirectX7 世代の固定機能パイプラインは健在です。

新しい DirectX が登場しても、最新の目玉機能が使えないだけで
HAL 自体は1つ古い世代のビデオカードでも動きました。
また DirectX の機能自体も、すべてが必須の項目ではありません。

DirectX7 世代の機能しか持たないビデオカードが、DirectX8 対応と
書かれていることはよくあることです。実際 DirectX8 自体は動きます。
Shader は使えないけれど。

そのため先に DirectX SDK だけ入れ替えて、ライブラリなどを一通り
コンパイルが通るようにしておいて、あとからビデオカードを入手したら
新機能を試す、なんてこともできました。

ところが DirectX10 の場合、DirectX9 世代のビデオカードではそもそも
起動できず Reference Rasterizer しか使えません。
すべての機能への対応を要求するので、本当の DirectX10 GPU しか使えない
わけです。

直前に買ったばかりの DirectX9 ハイエンドカードが泣いています。
VRAM が 512MByte もあるのに Direct3D10 ではほとんど画面が止まったかと
思うようなソフトエミュレーションになってしまうのです。

これはこれで潔いし、そのうち時間が解決するだろうけれど、
古い環境からの置き換わりには少々時間がかかりそうな感じです。