アカウント名:
パスワード:
昔ちょっと書いたことがあったけど、77と90では別言語ってぐらい違ってたように思うけど、ここで言うFORTRANは77のことなのかなぁ。
77は確かにシンプルな言語仕様だったが、C言語と比較してなぜ計算が速いのかは分からなかったな。多分、コンパイラとライブラリの成熟度の違いだろうなと今もそう思っている。
ポインタによるエイリアスが発生しないのが大きい。
へーそうなんだ。なぜ発生しなのかは今一わからんが…、C言語でも怪しい場合はワーニングが出るはずだから気をつけてれば今はそんなに差がないようにも思える。
> なぜ発生しなのかは今一わからんが…、ポインタがないんだからポインタによるエイリアシングなんか発生のしようがない> C言語でも怪しい場合はワーニングが出るはずだから> 気をつけてれば今はそんなに差がないようにも思える。人間に気をつけさせても意味がなくて、コンパイラがエイリアシングが発生しないことを証明できなければならない。さもなければエイリアシングが起きていなければできたであろう最適化を諦めなければならないことがある。具体例もあげとこうか。http://www.emit.jp/prog/prog_opt0.html [www.emit.jp]「コンパイラによる最適化がかからない理由」以降。
> ポインタがないんだからポインタによるエイリアシングなんか発生のしようがないそうだったか…もうFORTRANの事はすっかり忘れてちゃってるんだな
> 人間に気をつけさせても意味がなくて、コンパイラがエイリアシングが発生しないことを証明できなければならない。さもなければエイリアシングが起きていなければできたであろう最適化を諦めなければならないことがある。具体例もあげとこうか。
-fstrict-aliasing を付けると(-O2以降でデフォらしい)、コンパイラはエイリアシングしてないことを前提にするから、人間が気を付けなくてはいけなくなる。GCCは明らかに怪しい場合はワーニングを出す。付けない場合はGCCは常にエイリアシングが発生する前提でコンパイルするはず。
親コメの人とは別人ですが、そのエイリアシングとは別物ですよ。
C言語のstrict aliasing ruleは、(charを除く)互いに異なる型の変数が同じポインタを指さないこと。ここで言っているのは一般的なポインタのaliasingで、複数の(同じ型を含む)ポインタが同じ実体を指さないことです。
FORTRAN(77まで)にはポインタがそもそもありません。Fortran(90から)にはポインタがありますが、「ポインタに指されることがある変数」は明示的にコンパイラに教える必要があります。このおかげで、配列の指す範囲の重複のありなしがコンパイラからわかりやすくなり、命令順を入れ替えても結果が変わらないかどうかを判断しやすくなり、最適化の機会が増える、という寸法です。C言語使いの人には、デフォルトがrestrictポインタ……というと雰囲気がつかみやすいかな。
> C言語のstrict aliasing ruleは、(charを除く)互いに異なる型の変数が同じポインタを指さないこと。> ここで言っているのは一般的なポインタのaliasingで、複数の(同じ型を含む)ポインタが同じ実体を指さないことです。
確かに調べてみると-fstrict-aliasingの最適化は互換性の無いポインタが同じアドレスを指さない事に限定してるっぽい…ポインタが同じ型の場合は重複する可能性がある前提でコンパイルするんだろうね。(よく考えたら、qsortとかもそうだしそんな事しょっちゅうあることだった)
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
人生の大半の問題はスルー力で解決する -- スルー力研究専門家
FORTRANは77?90? (スコア:3, 興味深い)
昔ちょっと書いたことがあったけど、77と90では別言語ってぐらい違ってたように思うけど、ここで言うFORTRANは77のことなのかなぁ。
77は確かにシンプルな言語仕様だったが、C言語と比較してなぜ計算が速いのかは分からなかったな。
多分、コンパイラとライブラリの成熟度の違いだろうなと今もそう思っている。
Re: (スコア:0)
ポインタによるエイリアスが発生しないのが大きい。
Re: (スコア:1)
へーそうなんだ。
なぜ発生しなのかは今一わからんが…、C言語でも怪しい場合はワーニングが出るはずだから
気をつけてれば今はそんなに差がないようにも思える。
Re: (スコア:1)
> なぜ発生しなのかは今一わからんが…、
ポインタがないんだからポインタによるエイリアシングなんか発生のしようがない
> C言語でも怪しい場合はワーニングが出るはずだから
> 気をつけてれば今はそんなに差がないようにも思える。
人間に気をつけさせても意味がなくて、コンパイラがエイリアシングが発生しないことを証明できなければならない。さもなければエイリアシングが起きていなければできたであろう最適化を諦めなければならないことがある。
具体例もあげとこうか。
http://www.emit.jp/prog/prog_opt0.html [www.emit.jp]
「コンパイラによる最適化がかからない理由」以降。
Re: (スコア:1)
> ポインタがないんだからポインタによるエイリアシングなんか発生のしようがない
そうだったか…もうFORTRANの事はすっかり忘れてちゃってるんだな
> 人間に気をつけさせても意味がなくて、コンパイラがエイリアシングが発生しないことを証明できなければならない。さもなければエイリアシングが起きていなければできたであろう最適化を諦めなければならないことがある。
具体例もあげとこうか。
-fstrict-aliasing を付けると(-O2以降でデフォらしい)、コンパイラはエイリアシングしてないことを前提にするから、
人間が気を付けなくてはいけなくなる。GCCは明らかに怪しい場合はワーニングを出す。
付けない場合はGCCは常にエイリアシングが発生する前提でコンパイルするはず。
Re:FORTRANは77?90? (スコア:1)
親コメの人とは別人ですが、そのエイリアシングとは別物ですよ。
C言語のstrict aliasing ruleは、(charを除く)互いに異なる型の変数が同じポインタを指さないこと。
ここで言っているのは一般的なポインタのaliasingで、複数の(同じ型を含む)ポインタが同じ実体を指さないことです。
FORTRAN(77まで)にはポインタがそもそもありません。
Fortran(90から)にはポインタがありますが、「ポインタに指されることがある変数」は明示的にコンパイラに教える必要があります。
このおかげで、配列の指す範囲の重複のありなしがコンパイラからわかりやすくなり、命令順を入れ替えても結果が変わらないかどうかを判断しやすくなり、最適化の機会が増える、という寸法です。C言語使いの人には、デフォルトがrestrictポインタ……というと雰囲気がつかみやすいかな。
Re:FORTRANは77?90? (スコア:1)
> C言語のstrict aliasing ruleは、(charを除く)互いに異なる型の変数が同じポインタを指さないこと。
> ここで言っているのは一般的なポインタのaliasingで、複数の(同じ型を含む)ポインタが同じ実体を指さないことです。
確かに調べてみると-fstrict-aliasingの最適化は互換性の無いポインタが同じアドレスを指さない事に限定してるっぽい…
ポインタが同じ型の場合は重複する可能性がある前提でコンパイルするんだろうね。
(よく考えたら、qsortとかもそうだしそんな事しょっちゅうあることだった)