合計 昨日 今日

ISLe
 
記事: 2578
登録日時: 2010年10月16日(土) 22:47
日記: 日記を見る (16)
日記
- 8月 2017
浮動小数点数とGPL (0)
   2017年8月31日(木) 17:35
検証 (2)
   2017年8月30日(水) 18:08
主張 (1)
   2017年8月10日(木) 18:01

+ 12月 2016
+ 4月 2014
+ 7月 2011
+ 6月 2011
+ 2月 2011
+ 1月 2011
+ 12月 2010
+ 11月 2010
+ 10月 2010
フォロー
カテゴリー
フィード
次へ

浮動小数点数とGPL

パーマリンクby ISLe on 2017年8月31日(木) 17:35

DXライブラリはgcc用もあるが、gccが使用する標準ライブラリに三角関数でx87命令を使わないソフトウェア実装があるという。

x87命令が返す結果の正確性に問題があるため、より正確な結果を得られるのだそう(しかもx87命令より高速に)。

つまり、同じソースでもvcでコンパイルしたときとgccでコンパイルしたときでは動作が異なる場合があるということ。

floatだけでなくdoubleにも影響する。
Direct3Dと無関係。
#SIMD拡張命令使ってx87命令を使わないなら回避できるだろうけど。



ところで、GPLを採用したプログラムがVCでビルドしないと期待通り動かないとしたらどうなのだろう。
システム・ライブラリ例外に含まれるであろうソフトウェアに依存するのはGPLの想定外か?

自由でないライブラリを利用する自由ソフトウェアを書けますか?
GPLの採用を阻害する権利は誰にもないであろうが、↑に書かれているように
・gccでコンパイルしてもちゃんと動くようにする
あるいは
・gccでコンパイルするとちゃんと動かない可能性について明示し、gccでコンパイルしてもちゃんと動くよう改変することを提案する
という対応を取るのが適切であろう。
#現実としてはSIMD拡張命令使うようコンパイルオプションに言及すれば良いだけだろうけど。

コメント数: 0 閲覧数: 115

検証

パーマリンクby ISLe on 2017年8月30日(水) 18:08

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

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

検証のベースとなるコード。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "DxLib.h"
#include <float.h>
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    //SetUseDirect3DVersion(DX_DIRECT3D_9);
    ChangeWindowMode(TRUE);
    if (DxLib_Init() != 0) return 0;
    SetDrawScreen(DX_SCREEN_BACK);
 
    double d = 0.1;
    float  f = 0.1f;
 
    unsigned int controlfp = _controlfp(0, 0);
 
    while (ProcessMessage() == 0 && ScreenFlip() == 0 && ClearDrawScreen() == 0)
    {
        DrawFormatString(0, 0,GetColor(255,255,255),"double: %.1f * %.1f = %.15g",d,d,d*d);
        DrawFormatString(0,20,GetColor(255,255,255),"float:  %.1f * %.1f = %.15g",f,f,f*f);
 
        switch (GetUseDirect3DVersion()) {
        case DX_DIRECT3D_9:
            DrawString(0,40,"DX_DIRECT3D_9",GetColor(255,255,255));
            break;
        case DX_DIRECT3D_9EX:
            DrawString(0,40,"DX_DIRECT3D_9EX",GetColor(255,255,255));
            break;
        case DX_DIRECT3D_11:
            DrawString(0,40,"DX_DIRECT3D_11",GetColor(255,255,255));
            break;
        }
 
        switch (controlfp & _MCW_PC) {
        case _PC_24:
            DrawString(0,60,"_PC_24",GetColor(255,255,255));
            break;
        case _PC_53:
            DrawString(0,60,"_PC_53",GetColor(255,255,255));
            break;
        case _PC_64:
            DrawString(0,60,"_PC_64",GetColor(255,255,255));
            break;
        }
    }
 
    DxLib_End();
    return 0;
}


Windows 10 Pro バージョン1703 64ビット
Visual Studio 2017 Community
DXライブラリ 3.18e

検証結果。
float.png
float.png (7 KB) 表示数: 105 回


上から
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拡張命令が使用される。
Offtopic :
MSDNライブラリの/archオプションの説明だと、/arch:SSE2としてもx87命令が完全に排除されるとは限らないように読める。ちょっとしたコードの変化でも演算結果に影響を与える可能性はあるということか。

3.
SIMD拡張命令を使用しないようにしてやっと浮動小数点数演算の精度変化が確認できた。

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

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

コメント数: 2 閲覧数: 184

主張

パーマリンクby ISLe on 2017年8月10日(木) 18:01

keito94(keito940)さんがDXライブラリでアクションゲームを作りたいとたてた質問トピで主に回答したのはみけCAT氏とMath氏だった。
keito94さんは、どこかで拾ってきたサンプルコードの改造途中のものを提示した。
言わずもがなとは思うが、指摘はコードの整合性にほぼほぼ終始。

そこで満足したkeito94さんは、マリオ(風)ジャンプや、ダッシュ、慣性付き移動などアクションゲームとしての完成度を高める実装を進めようとトピをたてた。
そこで以前みけCAT氏とMath氏の協力を得て完成度を高めたコードを提示した。
これはkeito94(keito940)さんにとって完璧なはずだった。
ところが、回答者から、読みにくい、意図が分からない、とフルボッコ。

その後keito94さんが、ゲーム作りのコツ教えてください、とたてたトピはゼロ回答。

思わず吹き出しそうでしたね。
keito94さんが可哀そうに見えましたよ。


あまりに可哀そうなので、坂道の実装トピでついに返信してしまいましたよ。
個人攻撃には加担したくないので、あくまでひとつのコンセプトという選択肢を示す形。


パックマン風についても、わたしは本物にこだわるというコンセプトを示しているに過ぎない。

ところが、異なる選択肢を示すと過剰に反応する輩がいつも現れる。

わたしが檄を飛ばしていると主張して抑え込みにかかる。

あなたの無責任発言に説得力がないのが問題じゃあないのか。
それを自覚しているんじゃあないのか。


そんな輩は跡を絶たない。
もっと過激な反応をしたひともいましたね。
その登録ユーザーはいまも延々と自由な投稿を繰り返してますね。
そのひとはそのひとで、わたしはわたしで、問題ないわけじゃないすか。
なんでいちいち反応するんすかね。
最後に編集したユーザー ISLe [ 2017年8月10日(木) 18:02 ], 累計 2 回

コメント数: 1 閲覧数: 407

隠喩

パーマリンクby ISLe on 2016年12月23日(金) 17:30

ハンドルネームが秀逸だねえ。

断定でないものを断定で表現する技法。
まったく異なる事柄を結び付ける技法。
まさにmetaphor。

コメント数: 0 閲覧数: 1485

さようなら

パーマリンクby ISLe on 2014年4月12日(土) 22:46

もう来ません。

コメント数: 10 閲覧数: 7626

オンラインデータ

登録ユーザー: なし