- PR -

アウトオブオーダーについて

投稿者投稿内容
やす
常連さん
会議室デビュー日: 2005/12/07
投稿数: 20
投稿日時: 2007-03-06 12:09
お世話になります。

ある数値計算ライブラリーを使用していて、まったく同じ入力データを与えても
毎回まったく同じ答えにはなりません。有効桁内では一致しているので、計算結
果としては問題ないのですが、末尾までピッタリと一致することはありません。

サポートに問い合わせたら、「これはアウトオブオーダーの問題で起きているの
でしようがない」と言われました。

ここで質問なのですが、例えば、
a+b+c
という計算式をプログラムで書いた場合、
(a+b)+c
の順番で計算されることもあれば
a+(b+c)
の順番で計算されることもあるのでしょうか?

私は、同じプログラム(計算式)、同じ入力データ、同じマシン
であれば何回実行しても、同じ順番で実行され、必ずピッタリと
同じ答えが返るものだと思っていました。

この考えは間違っているのでしょうか?

これって



あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-03-06 13:37
アウト・オブ・オーダー実行の事ですか?
具体的な状況はメモリバリアに詳しく載っています。

サポートの方が言うアウトオブオーダーがこの現象ならば、
「起こるのだから仕方がない」という性格のものではなく、
必要な同期を行うなどして回避すべきものです。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-03-06 18:29
引用:

やすさんの書き込み (2007-03-06 12:09) より:
お世話になります。

ある数値計算ライブラリーを使用していて、まったく同じ入力データを与えても
毎回まったく同じ答えにはなりません。有効桁内では一致しているので、計算結
果としては問題ないのですが、末尾までピッタリと一致することはありません。

サポートに問い合わせたら、「これはアウトオブオーダーの問題で起きているの
でしようがない」と言われました。

ここで質問なのですが、例えば、
a+b+c
という計算式をプログラムで書いた場合、
(a+b)+c
の順番で計算されることもあれば
a+(b+c)
の順番で計算されることもあるのでしょうか?

私は、同じプログラム(計算式)、同じ入力データ、同じマシン
であれば何回実行しても、同じ順番で実行され、必ずピッタリと
同じ答えが返るものだと思っていました。

この考えは間違っているのでしょうか?

これって





なんか、文が中途半端なんだけど?

とにかく、“ある計算ライブラリ”とやらが何かわからん人には、答えようがないわな┐(´〜`)┌
_________________
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-03-06 23:40
引用:

やすさんの書き込み (2007-03-06 12:09) より:
ここで質問なのですが、例えば、
a+b+c
という計算式をプログラムで書いた場合、
(a+b)+c
の順番で計算されることもあれば
a+(b+c)
の順番で計算されることもあるのでしょうか?


これって、マルチスレッドで動くプログラムならありえます。
a と b と c を3つのスレッドで計算して、最後に合計するような場合、a と b が早く出来ていれば (a+b)+c になり、b と c が早く出来ていれば a+(b+c) になるでしょう。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
やす
常連さん
会議室デビュー日: 2005/12/07
投稿数: 20
投稿日時: 2007-03-07 09:24
引用:

unibonさんの書き込み (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}



なるほど、そういうことですか。
これって、マルチスレッドで書いていれば、単一CPUでも起こりうるんですよね?
自分の書いているコードは単一スレッドなので、こういった現象はみられないので
なぜかと疑問に思っていたのですが、これですっきりしました。

ありがとうございました。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2007-03-07 11:50
引用:

やすさんの書き込み (2007-03-07 09:24) より:
これって、マルチスレッドで書いていれば、単一CPUでも起こりうるんですよね?



起こりえます。
#補足:マルチスレッドで別々に足し算するようにプログラミングしたら、
#という意味です。
#a1〜a100までの足し算が何もせずにa1〜a50、a51〜a100の足し算として
#マルチスレッド化されるようなことはありません。
#並列処理用言語であれば絶対ないとは言い切れませんが、
#.NETで並列処理言語はたぶんないと思うので、ないでしょう。

引用:

自分の書いているコードは単一スレッドなので、こういった現象はみられないので
なぜかと疑問に思っていたのですが、これですっきりしました。



Jittaさんも指摘されていますが、何という数値計算ライブラリーでしょう?
その点が抜けているので、そのライブラリがマルチスレッドで動作しているものかどうかもわかりませんよ。
最近のCPUだとハイパースレッディングやマルチコアのCPUも増えてきているので、
マルチスレッドでの処理により高速化する可能性もなくはないですが、
ほとんどの場合はシングルスレッドより処理性能は低下します。

なので、よっぽどターゲットを絞ったライブラリでなければ、
マルチスレッドを使わないのではないかな?と思います。
(製作者ではないので予想でしかありませんが)

サポートの言っていることってアプリレベルのマルチスレッドではなく、
CPU内でのパイプライン処理うんぬんでのアウトオブオーダーなのかな?
とか思ってみたり。
#私はCPU周りはこれっぽっちも詳しくないので、あくまで可能性の話。

<追記>
「起こりえます。」の返答に補足を追加。
</追記>

[ メッセージ編集済み 編集者: よねKEN 編集日時 2007-03-07 12:45 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-03-07 12:12
あまり関係ないけど、気になったことをひとつ。


足し算は、計算の順序を変えても、結果は変わりませんから。
(a+b)*c と a+(b*c) なら変わるけど

本当にアウトオブオーダーの問題なのかな?と、ちと疑問に思った。
_________________
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2007-03-07 12:31
引用:

unibonさんの書き込み (2007-03-06 23:40) より:
引用:

やすさんの書き込み (2007-03-06 12:09) より:
ここで質問なのですが、例えば、
a+b+c
という計算式をプログラムで書いた場合、
(a+b)+c
の順番で計算されることもあれば
a+(b+c)
の順番で計算されることもあるのでしょうか?


これって、マルチスレッドで動くプログラムならありえます。
a と b と c を3つのスレッドで計算して、最後に合計するような場合、a と b が早く出来ていれば (a+b)+c になり、b と c が早く出来ていれば a+(b+c) になるでしょう。


こんなのはさすがにあり得るとは言わないでしょう。
a+b+c
という計算式の順番が変わったりはしません。
※言語的に順序が未定義とかはまた別の話ですが。

各スレッドで、終わった結果から順に足していく、というプログラムであればそうなりますが、それはそういうプログラムを書いてるからです。

スキルアップ/キャリアアップ(JOB@IT)