- - PR -
アウトオブオーダーについて
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-03-06 12:09
お世話になります。
ある数値計算ライブラリーを使用していて、まったく同じ入力データを与えても 毎回まったく同じ答えにはなりません。有効桁内では一致しているので、計算結 果としては問題ないのですが、末尾までピッタリと一致することはありません。 サポートに問い合わせたら、「これはアウトオブオーダーの問題で起きているの でしようがない」と言われました。 ここで質問なのですが、例えば、 a+b+c という計算式をプログラムで書いた場合、 (a+b)+c の順番で計算されることもあれば a+(b+c) の順番で計算されることもあるのでしょうか? 私は、同じプログラム(計算式)、同じ入力データ、同じマシン であれば何回実行しても、同じ順番で実行され、必ずピッタリと 同じ答えが返るものだと思っていました。 この考えは間違っているのでしょうか? これって | ||||||||
|
投稿日時: 2007-03-06 13:37
アウト・オブ・オーダー実行の事ですか?
具体的な状況はメモリバリアに詳しく載っています。 サポートの方が言うアウトオブオーダーがこの現象ならば、 「起こるのだから仕方がない」という性格のものではなく、 必要な同期を行うなどして回避すべきものです。 | ||||||||
|
投稿日時: 2007-03-06 18:29
とにかく、“ある計算ライブラリ”とやらが何かわからん人には、答えようがないわな┐(´〜`)┌ _________________ | ||||||||
|
投稿日時: 2007-03-06 23:40
これって、マルチスレッドで動くプログラムならありえます。 a と b と c を3つのスレッドで計算して、最後に合計するような場合、a と b が早く出来ていれば (a+b)+c になり、b と c が早く出来ていれば a+(b+c) になるでしょう。 -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} | ||||||||
|
投稿日時: 2007-03-07 09:24
なるほど、そういうことですか。 これって、マルチスレッドで書いていれば、単一CPUでも起こりうるんですよね? 自分の書いているコードは単一スレッドなので、こういった現象はみられないので なぜかと疑問に思っていたのですが、これですっきりしました。 ありがとうございました。 | ||||||||
|
投稿日時: 2007-03-07 11:50
起こりえます。 #補足:マルチスレッドで別々に足し算するようにプログラミングしたら、 #という意味です。 #a1〜a100までの足し算が何もせずにa1〜a50、a51〜a100の足し算として #マルチスレッド化されるようなことはありません。 #並列処理用言語であれば絶対ないとは言い切れませんが、 #.NETで並列処理言語はたぶんないと思うので、ないでしょう。
Jittaさんも指摘されていますが、何という数値計算ライブラリーでしょう? その点が抜けているので、そのライブラリがマルチスレッドで動作しているものかどうかもわかりませんよ。 最近のCPUだとハイパースレッディングやマルチコアのCPUも増えてきているので、 マルチスレッドでの処理により高速化する可能性もなくはないですが、 ほとんどの場合はシングルスレッドより処理性能は低下します。 なので、よっぽどターゲットを絞ったライブラリでなければ、 マルチスレッドを使わないのではないかな?と思います。 (製作者ではないので予想でしかありませんが) サポートの言っていることってアプリレベルのマルチスレッドではなく、 CPU内でのパイプライン処理うんぬんでのアウトオブオーダーなのかな? とか思ってみたり。 #私はCPU周りはこれっぽっちも詳しくないので、あくまで可能性の話。 <追記> 「起こりえます。」の返答に補足を追加。 </追記> [ メッセージ編集済み 編集者: よねKEN 編集日時 2007-03-07 12:45 ] | ||||||||
|
投稿日時: 2007-03-07 12:12
あまり関係ないけど、気になったことをひとつ。
足し算は、計算の順序を変えても、結果は変わりませんから。 (a+b)*c と a+(b*c) なら変わるけど 本当にアウトオブオーダーの問題なのかな?と、ちと疑問に思った。 _________________ | ||||||||
|
投稿日時: 2007-03-07 12:31
こんなのはさすがにあり得るとは言わないでしょう。 a+b+c という計算式の順番が変わったりはしません。 ※言語的に順序が未定義とかはまた別の話ですが。 各スレッドで、終わった結果から順に足していく、というプログラムであればそうなりますが、それはそういうプログラムを書いてるからです。 |
1|2|3
次のページへ»