[過去ログ]
Visual Studio 2008 Part 22 (314レス)
Visual Studio 2008 Part 22 http://mevius.5ch.net/test/read.cgi/tech/1413180800/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
271: デフォルトの名無しさん [sage] 2018/09/17(月) 01:24:06.04 ID:yaPtorLJ >>257 >なおILSpy、グダグダ言わずに試してみたが、 >当たり前だがmanaged code だとILが出る(x86ではない)ので、 >俺って根本的に間違ってたかも? >今までx86のアセンブラで議論してたけど、これって .NET アプリには同梱されていないというオチ? やはり、managed code部分は、x86命令では無く、ILにコンパイルされていて、 普通のC++とは違ってたんだ。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/271
272: デフォルトの名無しさん [sage] 2018/09/17(月) 01:30:31.16 ID:yaPtorLJ >calc_norm_and_regulateをunmanaged関数にすると、違いはなくなる。 >(Releaseビルドの`をコマンドプロンプトで起動した際にも、****ddの結果となる) やはり。 unmanaged関数の場合は、CIL(MSIL)ではなく、exeの段階で既に x86マシン語に直されたものが格納されるんだろう。だとすると、起動方法に 関係なく、少なくともその部分に関しては、x87 fpu命令の使われ方が 全く同じになる。callしたsqrt()関数の中は除いて。 http://mevius.5ch.net/test/read.cgi/
tech/1413180800/272
273: デフォルトの名無しさん [] 2018/09/17(月) 01:37:20.55 ID:dj7qSZnZ >>259-260のコードも>>262-263 も同じ条件でデフォルトでコンパイルしてる コレは間違いない 一行コメントはずしてコンパイルしなおすだけだからな で、>>261、>>264みたいな結果になる >>264の実行結果はDebugビルドとまったく同じになる そのまんま http://mevius.5ch.net/test/read.cgi/tech/1413180800/273
274: デフォルトの名無しさん [sage] 2018/09/17(月) 02:03:16.26 ID:yaPtorLJ はっきり書いてある。managed code は、起動時にJITコンパイルされる。 だから、どんなマシン語に置き換わるかが、コンパイルしただけでは まだ完全には決定されてない。 https://en.wikipedia.org/wiki/Managed_code Drawbacks include slower startup speed (the managed code must be JIT compiled by the VM) and generally increased use of system resources on any machine that is executing the code. managed code は、VMによって、JIT コンパイルされない
といけないので、 起動速度が遅くなり、かつ、一般的に、システム・リソースの使用が増える。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/274
275: デフォルトの名無しさん [] 2018/09/17(月) 02:49:02.18 ID:dj7qSZnZ 普通のコンソールアプリケーション(CLRじゃないほう)でも 同じコードで普通にまったく同じように再現するワケだが ホントなキミラはなにを頭悪いことばっかりいってんの? 実行結果だけははっといてやるが http://mevius.5ch.net/test/read.cgi/tech/1413180800/275
276: デフォルトの名無しさん [] 2018/09/17(月) 02:50:12.89 ID:dj7qSZnZ ?-1 デフォルト設定(Release) 【コード】(その1) #include "stdafx.h" #include <stdio.h> #include <stdint.h> #include <math.h> template<typename T> static double calc_norm_and_regulate(int num, T* r, bool regulate){ // <float> for debug. double norm = 0; for (int i = 0; i < num; i++) { norm += (double)r[i] * (double)r[i]; // fprintf(stdout, "[0]0x%016llX:%.19lg
\n", *(uint64_t*)&norm, norm); } fprintf(stdout, "[1]0x%016llX:%.19lg\n", *(uint64_t*)&norm, norm); norm = sqrt(norm); if (regulate) for (int i=0;i<num;i++) r[i] = (T)(r[i]/norm); return norm; } http://mevius.5ch.net/test/read.cgi/tech/1413180800/276
277: デフォルトの名無しさん [] 2018/09/17(月) 02:50:37.91 ID:dj7qSZnZ ?-1 デフォルト設定(Release) 【コード】(その2) int _tmain(int argc, _TCHAR* argv[]) { int count = 16; __int64 inputs_hex[16] = { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x1fedb1530240aa54, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x1ff0af0d95025bc3, 0x1fc9353df6af376b, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000
000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 }; double* inputs = (double*)inputs_hex; double norm = calc_norm_and_regulate(count, inputs, false); fprintf(stdout, "[2]0x%016llX:%.19lg\n", *(uint64_t*)&norm, norm); return 0; } http://mevius.5ch.net/test/read.cgi/tech/1413180800/277
278: デフォルトの名無しさん [] 2018/09/17(月) 02:51:12.35 ID:dj7qSZnZ ?-1 デフォルト設定(Release) 【実行結果】 ↓このコードの逆アセンブルコード https://ideone.com/Dqqn6J [1]0x0007F2C44DFFF8F2:1.1053482540585106e-308 [2]0x1FF68DDFB62221DE:1.051355436595308e-154 http://mevius.5ch.net/test/read.cgi/tech/1413180800/278
279: デフォルトの名無しさん [] 2018/09/17(月) 02:51:53.99 ID:dj7qSZnZ ?-2 デフォルト設定(Release) 【コード】(その1) #include "stdafx.h" #include <stdio.h> #include <stdint.h> #include <math.h> template<typename T> static double calc_norm_and_regulate(int num, T* r, bool regulate){ // <float> for debug. double norm = 0; for (int i = 0; i < num; i++) { norm += (double)r[i] * (double)r[i]; // fprintf(stdout, "[0]0x%016llX:%.19lg
\n", *(uint64_t*)&norm, norm); } fprintf(stdout, "[1]0x%016llX:%.19lg\n", *(uint64_t*)&norm, norm); norm = sqrt(norm); if (regulate) for (int i=0;i<num;i++) r[i] = (T)(r[i]/norm); return norm; } http://mevius.5ch.net/test/read.cgi/tech/1413180800/279
280: デフォルトの名無しさん [] 2018/09/17(月) 02:52:10.55 ID:dj7qSZnZ ?-2 デフォルト設定(Release) 【コード】(その2) int _tmain(int argc, _TCHAR* argv[]) { int count = 16; __int64 inputs_hex[16] = { 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x1fedb1530240aa54, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x1ff0af0d95025bc3, 0x1fc9353df6af376b, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000
000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000 }; double* inputs = (double*)inputs_hex; double norm = calc_norm_and_regulate(count, inputs, false); fprintf(stdout, "[2]0x%016llX:%.19lg\n", *(uint64_t*)&norm, norm); return 0; } http://mevius.5ch.net/test/read.cgi/tech/1413180800/280
281: デフォルトの名無しさん [] 2018/09/17(月) 02:52:25.20 ID:dj7qSZnZ ?-2 デフォルト設定(Release) 【実行結果】 ↓このコードの逆アセンブルコード https://ideone.com/5OaUe6 ↓実行結果を書き込めないからこっちに書き込んどいた https://ideone.com/FFW0P0 [1]0x0007F2C44DFFF8F1:1.1053482540585101e-308 [2]0x1FF68DDFB62221DD:1.0513554365953078e-154 http://mevius.5ch.net/test/read.cgi/tech/1413180800/281
282: デフォルトの名無しさん [] 2018/09/17(月) 02:53:45.62 ID:dj7qSZnZ ?-2 デフォルト設定(Release) 【コード】(その1) #include "stdafx.h" #include <stdio.h> #include <stdint.h> #include <math.h> template<typename T> static double calc_norm_and_regulate(int num, T* r, bool regulate){ // <float> for debug. double norm = 0; for (int i = 0; i < num; i++) { norm += (double)r[i] * (double)r[i]; fprintf(stdout, "[0]0x%016llX:%.19lg\n
", *(uint64_t*)&norm, norm); } fprintf(stdout, "[1]0x%016llX:%.19lg\n", *(uint64_t*)&norm, norm); norm = sqrt(norm); if (regulate) for (int i=0;i<num;i++) r[i] = (T)(r[i]/norm); return norm; } http://mevius.5ch.net/test/read.cgi/tech/1413180800/282
283: デフォルトの名無しさん [] 2018/09/17(月) 02:54:34.82 ID:dj7qSZnZ (正)>>282 (誤)>>279 http://mevius.5ch.net/test/read.cgi/tech/1413180800/283
284: デフォルトの名無しさん [] 2018/09/17(月) 02:57:46.48 ID:dj7qSZnZ >>276-277のコードも>>282,280のコードも も同じ条件でデフォルトでコンパイルしてる 一行コメントはずしてコンパイルしなおすだけだからな で、>>278、>>281みたいな結果になる >>281の実行結果はDebugビルドとまったく同じになる そのまんま CLRのとき(>>273)の動作とまったく同じ キミラはずーっとなにやってるわけ? http://mevius.5ch.net/test/read.cgi/tech/1413180800/284
285: デフォルトの名無しさん [sage] 2018/09/17(月) 09:44:34.76 ID:yu1Dprt2 >>284 同一のreleaseをコンソールで実行するかデバッガで実行するかで結果が異なるのはなぜだろう。 という話をしていたのであって、 debug/releaseで別の結果になることを問題にしているのではないです。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/285
286: デフォルトの名無しさん [sage] 2018/09/17(月) 10:25:22.39 ID:+dwRu2dr >>191がコンソール起動とIDE起動で挙動が異なる理由は分かりました。 ありがとう。 結論はつまり以下だ。 > JIT の最適化とデバッグ(抜粋) > マネージ アプリケーションをデバッグするとき、Visual Studio では、既定で、 > ジャスト イン タイム (JIT: Just-In-Time) コードの最適化が省略されています。 > 最適化されたコードをデバッグするのは困難であるため、 > 最適化されたコードで発生するバグが、非最適化バージョンでは再現しないとき
にのみお勧めします。 > JIT 最適化は、Visual Studio の [モジュールの読み込み中に JIT 最適化を抑制する] オプションで制御されます。 > 実行中のプロセスにアタッチする場合、既に読み込まれ、JIT でコンパイルされ、 > 最適化されているコードが含まれることがあります。 > このようなコードの場合、[モジュールの読み込み中に JIT 最適化を抑制する] オプションの影響はありません。 > https://msdn.microsoft.com/ja-jp/library/ms241594.aspx 確かにこのオプションで直った。 http://mevius.5ch.net/test/read.cgi/tech/14131
80800/286
287: デフォルトの名無しさん [sage] 2018/09/17(月) 10:25:48.51 ID:+dwRu2dr その他諸々、話を整理すると、以下となる。(ソースは>>191参照) 1. managedコードではMSILが出力され、x86コードは含まれていない。 2. 起動時、MSILはJITされ、x86コードに落とされる。 3. このため、mainの1行目でブレークポイントで止め、calc_norm_and_regulateの逆アセンブルを見ようとしても、 IDE上で「逆アセンブルを表示できません。式がまだネイティブ マシン コードに翻訳されていません。」と出る。 これはmainの1行目に System::Diagnostics::D
ebugger::Launch(); を入れたときも同様。 4. そしてこのJITに関して、上記IDE中の 『[モジュールの読み込み中に JIT 最適化を抑制する] オプション』 が効いてくる。 規定ではオフ、つまり、ReleaseビルドでもIDE起動ならJIT最適化は抑制される。 これがfld/fmul/fadd/fstpのループコードになる理由。 これをオンにすれば、確かにReleaseビルドIDE起動でも、 fld/fmul/faddのループコードとなり、コマンドプロンプト起動と同じ結果になることは確認した。 5. 上記では表現が微妙だが、JIT最適化をするかどうかは読み込まれるときに決まるらし
い。 したがって、Releaseビルドを起動後にアタッチした場合は通常通り最適化され、 IDEからReleaseビルドを起動した場合は『既定では』最適化が抑制されてしまう。 これがIDE起動とコマンドプロンプト起動で挙動が異なった原因。 上記、『[モジュールの読み込み中に JIT 最適化を抑制する]』のチェックを外せば、直った。 6. おそらくこのオプションはソリューション毎ではなく、IDEのインストール毎なんだと思う。 (ソリューション毎のオプションはプロジェクトのプロパティにあり、場所が違う) だからその人の環境によっては最初から
オフにしている人がいたかも? これが再現実験をしてくれた人たちと微妙に結果が異なったりした原因か? これで>>191についての疑問は解消した。(はず) 俺の本番コードについては再度確認し、また報告する。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/287
288: デフォルトの名無しさん [] 2018/09/17(月) 10:28:21.54 ID:dj7qSZnZ 同じリリースビルドで 結果がかわってんのになにいってんの? fprintf入れるだけで リリースビルドで結果が変わる http://mevius.5ch.net/test/read.cgi/tech/1413180800/288
289: デフォルトの名無しさん [] 2018/09/17(月) 10:31:16.66 ID:dj7qSZnZ やはり低学歴知恵遅れは 結果が意味するところが分かってないわ。。。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/289
290: デフォルトの名無しさん [] 2018/09/17(月) 10:32:49.39 ID:dj7qSZnZ ちなみにオレがあげた結果は すべてリリースビルドの結果だからな デバッグビルドの結果なんかあげても 意味ないからな http://mevius.5ch.net/test/read.cgi/tech/1413180800/290
291: デフォルトの名無しさん [] 2018/09/17(月) 10:38:00.02 ID:dj7qSZnZ CLRのケースもCLRでない普通のexeのケースでも 結果はまったく同じだからな しかもすべてリリースビルドで おきてる誤差までぴったり一致してる http://mevius.5ch.net/test/read.cgi/tech/1413180800/291
292: デフォルトの名無しさん [sage] 2018/09/17(月) 10:52:24.35 ID:+dwRu2dr >>288 お前は相変わらず理解してないな。 80bit(拡張倍精度)と64bit(倍精度)の演算で桁落ちが異なり、結果が異なるのは当然なんだよ。 問題は同じバイナリの癖に何故起動方法によって異なるのか?だったんだ。 理由はMSILだからだ。 MSILはCLR上でJITされ、x86コードに落とされる。 このときにJIT最適化がかかれば、拡張倍精度(を保ったまま)のコードになるし、 最適化がかからず毎回メモリに書き戻していれば、倍精度のコードになる。 .NETにおける同一バイ
ナリってのは、同一MSILという意味であって、同一x86機械語という意味ではない。 だから、確かに同一バイナリを掴んでいたが、起動方法によって結果が異なっていたんだよ。 (VSがデバッグ用に意図的にそういう仕様にしていただけ。俺はそれを知らなかった) 君のコードについては、 いちいちfprintする場合はdouble(倍精度)が毎回必要になるから、 コンパイラはその部分での拡張倍精度でのループを断念し、 結果的にそのループが倍精度で回っているだけのこと。 もし仮にCが拡張倍精度型 ExDouble を持っていたとして、printfもそれに対応していれば
、 もしかするとその毎回printfするコードでも拡張倍精度で回っていたかもしれん。 勿論手動でそういうコードのすることも可能だ。 そこはコンパイラがどう判断したのかでしかなく、あまり詰めても意味がない。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/292
293: デフォルトの名無しさん [sage] 2018/09/17(月) 10:54:19.52 ID:+dwRu2dr × fprint ○ printf まあ、分かると思いますが http://mevius.5ch.net/test/read.cgi/tech/1413180800/293
294: デフォルトの名無しさん [] 2018/09/17(月) 10:57:31.99 ID:dj7qSZnZ で、最適化されてるかされてないかすら いまのいままで気付くことすらできない そして気付く方法すらわからなかったわけか うあわ 頭わるう。。。 キミ、プログラムくむの向いてないわ http://mevius.5ch.net/test/read.cgi/tech/1413180800/294
295: デフォルトの名無しさん [] 2018/09/17(月) 10:58:47.63 ID:dj7qSZnZ 問題の切り分けができない人は プログラムはくめない コレは定説だからな http://mevius.5ch.net/test/read.cgi/tech/1413180800/295
296: デフォルトの名無しさん [sage] 2018/09/17(月) 11:09:05.96 ID:ivGPGa/P >>286 なるほど面白いね。 レスが膨大過ぎて最初の方しか読んでなかったけど、ネイティブコードの話と思い込んでたら .NETの話だったのかw http://mevius.5ch.net/test/read.cgi/tech/1413180800/296
297: デフォルトの名無しさん [sage] 2018/09/17(月) 12:34:14.16 ID:yaPtorLJ 個人的には、C++やx87 FPUは割と知識があったけど、.NET関連は余り追いかけてなかったので、気づくのが遅れた。 managedコード、unmanagedコードについて、今回初めて調べてみたくらいだし。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/297
298: デフォルトの名無しさん [sage] 2018/09/17(月) 12:53:34.77 ID:yaPtorLJ >>292 「ID:dj7qSZnZ」の人は理解していないね。 彼は人の事馬鹿にしてるけど・・・。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/298
299: デフォルトの名無しさん [sage] 2018/09/17(月) 13:39:23.91 ID:F2vzl5VC 最初に指摘されたことだろうに。 アセンブラレベルで精度や効率に介入したきゃ.netなんて使うな、なんて分かりきったこと。 http://mevius.5ch.net/test/read.cgi/tech/1413180800/299
300: デフォルトの名無しさん [sage] 2018/09/17(月) 14:58:46.52 ID:zCVYDMXL エディタ使ってるとたまに Intellisense機能が効かないときがあるんだが あれなんなの? 中間ファイルとか消せば直るの? http://mevius.5ch.net/test/read.cgi/tech/1413180800/300
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 14 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.017s