アカウント名:
パスワード:
昔ちょっと書いたことがあったけど、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とかもそうだしそんな事しょっちゅうあることだった)
COMMONとかEQUIVALENCEは?
>http://www.emit.jp/prog/prog_opt0.htmlこの例じゃぁ、何にも説得力無いぞ。今どきのコンパイラだと「最適化その3」をやろうがやるまいが実行時間に関係ないな。gcc (GCC) 4.8.2 20131212 (Red Hat 4.8.2-7) で試した結果:最適化レベル オリジナル 最適化その3-O0 12.133 7.092-O1 4.034 1.519-O2 1.520 1.523-O3 0.270 0.272エイリアシングを問題にするならもっとよい例を挙げてくれよ。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
犯人は巨人ファンでA型で眼鏡をかけている -- あるハッカー
FORTRANは77?90? (スコア:3, 興味深い)
昔ちょっと書いたことがあったけど、77と90では別言語ってぐらい違ってたように思うけど、ここで言うFORTRANは77のことなのかなぁ。
77は確かにシンプルな言語仕様だったが、C言語と比較してなぜ計算が速いのかは分からなかったな。
多分、コンパイラとライブラリの成熟度の違いだろうなと今もそう思っている。
Re: (スコア:0)
ポインタによるエイリアスが発生しないのが大きい。
Re: (スコア:1)
へーそうなんだ。
なぜ発生しなのかは今一わからんが…、C言語でも怪しい場合はワーニングが出るはずだから
気をつけてれば今はそんなに差がないようにも思える。
Re:FORTRANは77?90? (スコア:1)
> なぜ発生しなのかは今一わからんが…、
ポインタがないんだからポインタによるエイリアシングなんか発生のしようがない
> C言語でも怪しい場合はワーニングが出るはずだから
> 気をつけてれば今はそんなに差がないようにも思える。
人間に気をつけさせても意味がなくて、コンパイラがエイリアシングが発生しないことを証明できなければならない。さもなければエイリアシングが起きていなければできたであろう最適化を諦めなければならないことがある。
具体例もあげとこうか。
http://www.emit.jp/prog/prog_opt0.html [www.emit.jp]
「コンパイラによる最適化がかからない理由」以降。
Re:FORTRANは77?90? (スコア: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とかもそうだしそんな事しょっちゅうあることだった)
Re: (スコア:0)
COMMONとかEQUIVALENCEは?
Re: (スコア:0)
>http://www.emit.jp/prog/prog_opt0.html
この例じゃぁ、何にも説得力無いぞ。今どきのコンパイラだと「最適化その3」をやろうがやるまいが実行時間に関係ないな。
gcc (GCC) 4.8.2 20131212 (Red Hat 4.8.2-7) で試した結果:
最適化レベル オリジナル 最適化その3
-O0 12.133 7.092
-O1 4.034 1.519
-O2 1.520 1.523
-O3 0.270 0.272
エイリアシングを問題にするならもっとよい例を挙げてくれよ。