検証

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

検証

投稿記事 by ISLe » 8年前

Direct3Dコンポーネントの肥大化を解消するために、旧版のDirect3Dは最新のDirect3Dのラッパに構成し直す計画だというのをMicrosoft公式ブログで読んだ記憶がある。
Windows 10のカーネルサイズに絡んだ内容だったと思うのでDirect3D 12を対象にしたものだっただろうか。
Microsoft公式ブログのサイトが変わってしまって過去の記事を見付けるのが難しく断念。

Direct3D 9で浮動小数点数の演算精度が変化する問題はどうなる(どうなった)のか。
とりあえず現状はどうなっているか検証してみた。

検証のベースとなるコード。
► スポイラーを表示
Windows 10 Pro バージョン1703 64ビット
Visual Studio 2017 Community
DXライブラリ 3.18e

検証結果。
float.png
float.png (7 KiB) 閲覧数: 191 回
上から
1. DXライブラリ・VCのコンパイルオプション共にデフォルト
2. DXライブラリのSetUseDirect3DVersion関数でDX_DIRECT3D_9を指定、VCのコンパイルオプションはデフォルト
3. DXライブラリのSetUseDirect3DVersion関数でDX_DIRECT3D_9を指定、VCのコンパイルオプションに/arch:IA32を指定

1.
現在のDXライブラリは、Direct3D 11が使えるときはDirect3D 11を使う。
Microsoftのサポートが継続していて最も古いWindows 7でDirect3D 11は標準搭載である。
浮動小数点数演算の精度変化が発生するのはDirect3D 9であり、Direct3D 11では発生しない。
2.
Visual Studio 2012以降、/arch:SSE2オプションが既定となり、浮動小数点数の演算にSIMD拡張命令が使用される。
Direct3D 9で浮動小数点数演算の精度変化が発生する対象はx87(FPU)命令であり、 SIMD拡張命令に影響しない。
#64ビットターゲットでは常にSIMD拡張命令が使用される。
オフトピック
MSDNライブラリの/archオプションの説明だと、/arch:SSE2としてもx87命令が完全に排除されるとは限らないように読める。ちょっとしたコードの変化でも演算結果に影響を与える可能性はあるということか。
3.
SIMD拡張命令を使用しないようにしてやっと浮動小数点数演算の精度変化が確認できた。

SetUseDirect3DVersion関数でDX_DIRECT3D_9EXを指定した場合も同様であった。

いまのところ、32ビットターゲットでDirect3D 9/Direct3D 9Exデバイスを作成するプログラムを/arch:IA32オプションを付けてビルドするとまだ再現するということが確認できた。
Windows XPで動作させたいといった目的でもなければもはやあり得ない組み合わせだと思う。
この情報が何かの役に立つだろうか。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前

Re: 検証

投稿記事 by Dixq (管理人) » 8年前

つまり以前はDXライブラリを利用する際はdouble型を使うメリットは無かったが、11が使える今は使うメリットがあるということでしょうか?

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: 検証

投稿記事 by ISLe » 7年前

メリットがあるかどうかは使う人が判断することなので何とも言えませんが、doubleを使う意味がないことはないとは言えると思います。