• ベストアンサー

MS-VisualStudio 2003と2005(マルチスレッドのみ)の環境の違い

MS-VisualStudio2003にて C,C++,FORTRAN混合言語ソースで開発したシミュレーションプログラム  ・混合言語(CをメインにC++,FORTRAN9.0含む)  ・ライブラリ指定(シングルスレッド、debugモード) を MS-VS2005にシフトしましたが計算結果の違いが結構出てくることで 悩んでいます(悩ましいことに、多少違ってくる) MS-VS2005環境は  ・ライブラリがマルチスレッド環境のみ  ・IntelFORTRANはVer9.10 の様ですが、弊方はこの環境を持っておらず、 環境設定などの詳細がわかないで困っています PC環境、プログラミングの問題、その他いろいろと考えられる 因子はありますが、弊方と同じような開発環境で悩んだ方で ・MS-VisualStudio開発環境(2003,2005) ・IntelFORTRAN環境 (9.0/9.1) 以上の大きな相違点など何かヒントでもあればありがたく 書き込みいただければ幸いです

質問者が選んだベストアンサー

  • ベストアンサー
  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.7

「相手先が…」というのは、お客様ですか。。。 顧客が問題にするなら、問題ですね。 きちんとした理由をもって説明しないと。。でも、大変そうだ。 計算誤差が発生する簡単なサンプルプログラム(実プログラムから抜き出せたらもっといいですが)を作って、計算に違いが生じることを説明できたら、シミュレーション結果の違いは許容できる誤差の範囲であれば、納得してくれるようなクライアントなんでしょうかね?^^

tigersv1
質問者

お礼

>顧客が問題にするなら、問題ですね。 >きちんとした理由をもって説明しないと 御察しいただき 有難う御座います   >計算誤差が発生する簡単なサンプルプログラム(実プログラムから抜き出せ>たらもっといいですが)を作って、計算に違いが生じることを説明できた >ら、 その辺りで確認して、証拠を作るしかなさそうです  本日(8/25 17:10)は、別件でPCを離れますので  失礼致します  いろいろ有難う御座いました

その他の回答 (6)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.6

#2のzwiです。 VS2005からはシングルスレッドライブラリは無くなっているので選べません。 基本的にはマルチスレッドセーフになっているだけのライブラリだと思うのですが、VS2003のシングル時と浮動小数点誤差に関する差があるのかは確認したことが無いので分かりません。試しにVS2003をマルチスレッドライブラリで動かしてみるのも手かもしれません。 それとプログラムの最適化の基準は変わっていると思いますので、そのために演算の順位などが変わっていると誤差も変わるかもしれません。 >MS-VSのバージョンアップのたびに、こんな問題で悩んでいる方々がいるのではと思う今日この頃です 前からコンパイラのバージョン毎の浮動小数点ライブラリの誤差の問題はあった気がします。そのために精度の高い有料のサポートがある浮動小数点ライブラリが売られてたりしますので、そういう需要があるのだと思います。 最後に誤差の原因になる部分をDLLとかにパッケージとして封じ込められれば、提供する側としては安心できるかも知れませんので検討してみてください。

tigersv1
質問者

お礼

>試しにVS2003をマルチスレッドライブラリで動かしてみるのも手かもしれ >ません。 一応VS2003環境で試してみました  結果は問題ありませんでした (完全に隅から隅まで数値をチェックした訳ではありませんが) >最後に誤差の原因になる部分をDLLとかにパッケージとして封じ込められ>れば、提供する側としては安心できるかも知れませんので検討してみてくだ>さい。 参考にさせて頂きます  返答してくださった皆様  いろいろアドバイス有難う御座いました

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.5

ほんとに問題なのか、問題ですけど^^; でも、調べるということは、許容範囲を超えているのですよね^^

tigersv1
質問者

お礼

そうなんです 問題といえば問題なんですが(問題にしないと思えば問題にしない) MS-VS(WinOSもそうですが)のバージョンアップや DegitalFortran時代からInteFortranまでの変遷の度に 気持ち悪い思いをしてきました

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.4

ライブラリが、シングルスレッド→マルチスレッドに変わってますが、 このライブラリというのは、行列計算などをするものですか? で、マルチスレッドのライブラリの関数を呼ぶと自動的にスレッド生成して並行計算するみたいな。。。 それなら、シングルとマルチで、ライブラリ中の関数の計算順序が変わってる可能性が大きいので、計算結果に多少の違いが生じる可能性も大ですよね。 しょせん、近似計算なのだから、あまり細かい数値誤差は気になさらないほうがよろしいのでは? わたしは、自分で書いたシミュレーションプログラムなどがコンパイラをバージョンアップして、計算結果が違ってきても、許容誤差範囲なら何も調べませんでしたけど^^;

tigersv1
質問者

お礼

mikaemiさん 早速の回答・ご返事有難うございました(本当に早かったですね) プログラムはVS2003シングル開発ですから(元はWin3.1、DegitalFortran時代から継承なのです)マルチの必要なないのですが 相手先が、VS2005(マルチ)のみ環境らしく、この計算誤差の原因を どう説明しようかと考えております おっしゃる通り、私も計算結果は許容誤差範囲かなと考えておりますが この誤差がもとで、収束計算/最適化ループ計算の中で雪だるま的になる 場合もありまして、手を焼いている次第です VS2005の知識が無く申し訳ありませんが VS2005のライブラリはマルチの環境設定しかないのでしょうか? とするとMS-VSのバージョンアップのたびに、こんな問題で悩んでいる 方々がいるのではと思う今日この頃です

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.3

ん?ライブラリがデバッグモードってありますね。 もし、コンパイルもデバッグモードでしているなら、 最適化はかかってないかもしれないですね^^ zwi さんが指摘されているように、バイナリ→文字列変換の方法が、 バージョンアップで変わってる可能性はありますね。 Fortran なら unformatted で出力して比較するのがいいのかな。 unformatted のファイルの形式も変わってるという可能性は低いと思いますので^^

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

>・MS-VisualStudio開発環境(2003,2005) >・IntelFORTRAN環境 (9.0/9.1) 私はこの組み合わせの経験はないのですが、ピンポイントな組み合わせなので都合よく同等の条件で困った方から返事がある可能性が低いと思われます。 そこでアドバイスです。まずやるべきことは、 ●FORTRAN側かVisualStudio側に原因があるのか原因を切り分けること。 どこで誤差が生まれたかを切り分けます。様々なポイントで、浮動小数点値をテキストファイルに書き出して、新しい方と古いほうで比較して違いが出てくる場所を見つけます。 表示誤差とかが気になるので出来れば浮動小数点値のバイナリーデータで比較することが望ましいです。 ●ソフト的に誤差が生まれる原因として考えられるのは、 1.表示時の誤差。表示しているプログラム側の丸め誤差。 2。提供されている浮動小数点ライブラリ関数の仕様変更。打ち切り誤差などが違う。 3.型変換時の変換誤差。正規化の丸め誤差に差がある? 辺りでしょうか。 参考↓ http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0

tigersv1
質問者

お礼

zwiさん  貴重な書き込み、アドバイス有難う御座いました 確かに楽して問題は解決しないですね 一番くさいのは、MS-VS環境(シングル/マルチ)や混合言語によるメモリの取り扱い 方による、浮動小数点の誤差かと睨んでいますが 今一度調べてみます

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.1

コンパイラがバージョンアップ(たとえば、Interl Fortran 9.0/9.1 → 9.10)したということですし、 コンパイラの最適化レベルが変わって、浮動小数点の計算結果に多少の違いが出てきたのではないのでしょうか? まったく最適化しないオプションをつけてコンパイルして、VS2003 と VS2005 でコンパイル・リンクした計算結果を比較してみるのはどうでしょう? デフォルトの丸めモードなども変わってる可能性があれば異なるでしょうけど。 ところで、シミュレーション結果が容認できないほど変わってしまったということなのでしょうか? あるいは、許容範囲の誤差ではあるが、プログラムを修正後の単体テストをするのに、 VS2003で出した計算結果とプログラム修正後の計算結果を字面上で単純に比較してチェックできないので、困っているということですか?

関連するQ&A

  • STLをマルチスレッドで使いたい

    STL(のようなもの)をマルチスレッドで使いたいと考えています。 STL自体はスレッドセーフじゃないとのことですが、 変わりのライブラリとか無いのでしょうか? こんなの使ったよとか、こういうやり方したよとか、あれば教えてください。 言語:C++ 環境は何でもいいです。

  • VisualStudio.net2005についての参考書を探しています

    学生です。VisualStudio.NET2005を持っていて、プログラミングに入門したいと考えております。趣味で電子工作をやっているので、C言語プログラミングはでいるのですが、VS.NETでパソコンのアプリをC#で開発したいと考えております。VS.NETの大体の使い方は理解したのですが、C#があまりわからなく、わかりやすい入門書を探しているのですが、ご存知ありませんでしょうか?よろしくお願いします。

  • シングルスレッドでMFC

    現在Windows用某製品のプラグインを開発しています。 そのプラグインはC言語ベースで開発されており、SDKのマニュアルには、マルチスレッドには対応していない旨書かれています。 ここで質問なのですが、MFCのシングルスレッド用スタティックライブラリというのは存在するのでしょうか?やはりシングルスレッドではMFCを諦めるしかないのでしょうか、、 ご存知のかたぜひご教示ください。

  • マルチスレッドプログラミングの良技術書籍

    C++言語を用いてマルチスレッドを用いた開発を行う予定ですが、 当方マルチスレッドを用いた開発の経験がなく、 事前に前提知識を付けておきたいと思うのですが、 マルチスレッドプログラミングにおいて、 この書籍が分かりやすい、もしくはバイブル的な書籍があれば、 ご教示お願い致します。 ちなみに開発環境はVC++2005です。

  • VisualStudio2010について

    VisualStudio2010について 環境 ・VisualStudio2008(以下VS2008)を今まで使用していました。 ・今日VisualStudio2010(以下VS2010)をインストールをしました。 問題点 ・C++でdllの作成をしようとしました。 ・画像のようなエラーが出ました。 ・VS2008では出ないエラーでした。 ・調べたけど分かりませんでした。 画像 http://img718.imageshack.us/img718/5254/87388517.png

  • VisualStudio2005でのビルドについて

    VisualStudio2005でのビルドについての質問です。 作成したプログラムを他のPCで起動できるようにビルドする方法で 1:プロジェクト(P)→○○ のプロパティ→構成プロパティ→C/C++ 2:ランタイムライブラリをMT(マルチスレッド)に変更 3:ビルド(B)→構成マネージャー 4:構成をDebug→Releaseに 5:ビルド(B)→○○ のビルド(U) で他のPCでも起動出来ることを確認したんですけど 2:のランタイムライブラリをMD(マルチスレッドDLL)に 変更した場合の他PCで起動できるようにするための方法が 全くわかりません。分かる方いましたらよろしくお願いします。

  • VisualStudio2008で

    VisualStudio2008でC#アプリ開発しています。今回2003より移行し開発をしているのですが、VS2008の動きについて質問があります。 通常他クラスのメソッドに移動する場合は、右ボタンクリックで、「定義へ移動」すればメソッドが表示されていましたが、2008ではメタデータが表示され、メソッドで移動しません。 何か設定があるのでしょうか? 有識者の方、よろしくお願い致します。

  • VisualStudio2005 で MSDNライブラリfor2008は使用できますか?

    PCの再セットアップに合わせてVisualStudio2005の再インストールを行ったのですが、MSDNライブラリを最新のものを使おうと調べたところVS2008向けのものがヒットしました。 このVS2008向けのMSDNライブラリはVS2005でも使用可能でしょうか?(インストールしただけで使用できますでしょうか?) 試してみればと言われるとそれまでなのですが、回線速度が残念な環境なので使用できないようならばVS2005についてきたものを使おうと思っております。 また、2008向けを使える際、何か特別な設定等ありましたら教えて頂けると助かります。

  • マルチスレッド環境での配列使用について

    現在、C++を利用してマルチスレッド環境の開発を行っています。 マルチスレッドで排他的に変数を扱う場合、クリティカルセクションや ミューテックスを使用することで、排他制御をおこなうことができますが、 このように、配列の要素ごとに排他制御を行うことは可能でしょうか? たとえば、 int ary[10]; のような配列があれば、a[0]~a[9]まで要素をそれぞれ排他制御によって データの矛盾を避けたいと考えています。 パフォーマンスの関係上、できるだけ、配列全体をロックするのは避けたいと 思っています。 どうぞよろしくお願いします。

  • マルチスレッドプログラミングの利点について

    はじめまして。 質問があります。 現在マルチスレッドプログラミングについて学習しているのですが、 学習を進めていくうちにある疑問が思いつきました。それは、 マルチスレッドで実装した方がよい場合とシングルスレッドで実装 した方がよい場合の区別がよくわからないということです。マルチスレ ッドで実装する利点は、例えば、応答性を向上させるとか、 入出力操作が関わっているときにCPUの空き時間を利用して別スレッド で処理を行わせることによってスループットを向上させることぐらいしか思いつきません。また、CPUが1個しかない環境では、 CPUをフル活動するようなプログラムでは、下手にマルチスレッドで 実装するよりもシングルスレッドで実装したほうが排他制御しない 分だけ処理スピードは上であると思っているのですが、間違いでしょうか?マルチスレッドで実装した場合の利点は上述したこと以外にも 何かあるのでしょうか?ご教授お願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう