GCC 4.2.0 リリース 45
ストーリー by GetSet
本番機に入れる前にきっちり確認しなきゃな 部門より
本番機に入れる前にきっちり確認しなきゃな 部門より
Anonymous Coward曰く、
やや旧聞に属する話となってしまったが、去る5月13日、gcc 4.2がリリースされた。 既に国内のミラーサイト(jaistなど)にも4.2.0のバージョンがミラーされている。
changesに4.2の主な変更点が載っているが、最大の変更点はOpenMP (gomp)への対応のようだ。 multi-coreという名でSMPが一般的なPCでも当たり前になっている昨今、今後はpthreadとあわせて普及していくかもしれない。
そのほか、木構造最適化の改良の他、-mtune等に「現在コンパイラが動いているものと同じ石」を指定できるようになる、SPARCv9のSolaris上では64bit (-m64)が標準になるなど、フロントエンド側の引数やデフォルト値も変化しているので、Solaris上で32bitと64bitを混ぜて運用している方等は注意が必要になる。
なお手元のLinux(x86)で4.2.0のプレリリース版で試したところ、Firefox2のビルド・使用にも耐えている。 しかし、ソースによってはエラーチェックで弾かれる(以前はwarningで通ったが4.2ではerror)ものもあるようだ。
FreeBSDで OpenSSL関連トラブル (スコア:4, 参考になる)
しかしながら、以下のアナウンスにもあるよう様に、OpenSSL関連で トラブルが出ているようです。
http://docs.freebsd.org/cgi/mid.cgi?20070520022722.1f5a0cda [freebsd.org]
皆様ご注意を。
インストールしてgfortranのOpenMPを使ってみた (スコア:3, 参考になる)
4.2.0 では必要ないかもしれないけど、GMP Libraryを念のためインストール。
$ tar jxf gmp-4.2.1.tar.bz2
$ cd gmp-4.2.1
$ mkdir ppc
$ cd ppc/
$ ../configure --prefix=/usr
$ make
$ su
# make install
# exit
$ make check
4.2.0 では必要ないかもしれないけど、MPFR Libraryも念のためインストール。
$ tar jxf mpfr-2.2.1.tar.bz2
$ cd mpfr-2.2.1
$ mkdir ppc
$ cd ppc/
$ ../configure --prefix=/usr
$ make
$ su
# make install
# exit
で、gcc-4.2.0をコンパイル/インストール。
$ tar jxf gcc-4.2.0.tar.bz2
$ cd gcc-4.2.0
$ mkdir ppc
$ cd ppc/
$ ../configure --prefix=/usr --enable-languages=c,c++,fortran
$ make bootstrap
$ su
# make install
# exit
で、OpenMPのテスト。参考:https://web.kudpc.kyoto-u.ac.jp/Archives/PDF/NewsLetter/2003-6_openmp.pdf
$ cat omp1.f
program omp1
!$use omp_lib
implicit none
integer i
write(6,*) "Before"
!$omp parallel
do i=1,200000000; end do ! pstree => make---omp1---omp1---6*[omp1]
write(6,*) "Hello OMP"
!$omp end parallel
write(6,*) "After"
end program omp1
$ cat Makefile
#-*-Makefile-*- for OpenMP
# Time-stamp: <07/05/18 13:40:39 yukie>
##
## gfortran (gcc-4.2.0 or higher)
FC=gfortran
FFLAGS=-g -Wall -ffree-form -pipe -fopenmp
## ifort (Intel Fortran, version 9.1 or higher)
#FC=ifort
#FFLAGS=-g -openmp -free -warn all
all: omp1
OMP_NUM_THREADS=6 ./$<
omp1: omp1.o
$(FC) $(FFLAGS) -o $@ $^
clean:
rm -f core *.o *.mod omp1
$ make
gfortran -g -Wall -ffree-form -pipe -fopenmp -c -o omp1.o omp1.f
gfortran -g -Wall -ffree-form -pipe -fopenmp -o omp1 omp1.o
OMP_NUM_THREADS=6 ./omp1
Before
Hello OMP
Hello OMP
Hello OMP
Hello OMP
Hello OMP
Hello OMP
After
$
実行途中にpstreeをすると楽しい。なんか間違ってたらごめん。
gfortranのrecord marker (スコア:3, 参考になる)
changesに とあります。
これで、ようやくgfortranをまともに使うことができるようになるかもしれません。
Changes読んだんだけど (スコア:2, 興味深い)
の一行しか書いてない。
iccを使っている人に是非とも性能確認して欲しいところです。
あと、せっかくだからOmni: OpenMP compiler project [phase.hpcc.jp]との性能比較も……
Re:Changes読んだんだけど (スコア:2, すばらしい洞察)
#そんな私は今お試し中。
最新版を使っとけば一番速いというのはわかるんだが (スコア:2, 興味深い)
同一プロセッサで2.9系からどれだけ段々と効率が良くなったのか把握できると時代の流れを感じられるんだけど。
拡張命令の進化とかあるから難しいベンチマークになりそうだけど。
妖精哲学の三信
「だらしねぇ」という戒めの心、「歪みねぇ」という賛美の心、「仕方ない」という許容の心
Re:最新版を使っとけば一番速いというのはわかるんだが (スコア:5, 興味深い)
4.2でも、OpenMPのほかはあまり変化がないので、この傾向は変わらないのではないでしょうか。
4.3に期待しましょう。
Re:最新版を使っとけば一番速いというのはわかるんだが (スコア:1, 興味深い)
#最終的には自分のコードで試さないと意味がないことは十分承知した上で、
#そうは言っても書いてみると。
自前の数値計算コード(C言語)で試した結果では、いつもgcc3の方が高速であったりします。
gcc4の方が遅いです。(いつもコンスタントに高速なコードを作り出すのはicc8,9。)
しかし、gcc4の方が高速という同業者もいて中々不思議な状況。
とりあえず、時間があるときはそれぞれ試してみています。
Re:最新版を使っとけば一番速いというのはわかるんだが (スコア:5, 参考になる)
GCC Code-Size Benchmark Environment (CSiBE) [u-szeged.hu]
時系列を細かく見ると、何かの機能拡張が入ったタイミングで結果が変わっているのがわかったりします。
boost (スコア:1, 参考になる)
空いている古いマシン(PenII)にgcc-4.2を入れてみたが、boost(1.34.0)のビルドが出来ない。
gcc-4.1.2を使った場合は問題が起きず、コンパイラ以外の条件は変わっていないので、 bjamとgcc-4.2の組み合わせが問題かもしれないが、まだ原因を考え/調べているところ。そろそろ (スコア:0)
Re:そろそろ (スコア:3, すばらしい洞察)
それはコンパイラの領分ではなくてライブラリの領分です。
Re:そろそろ (スコア:3, すばらしい洞察)
Re:そろそろ (スコア:3, おもしろおかしい)
Re:そろそろ (スコア:1, おもしろおかしい)
宇宙は残ってる?
Re:そろそろ (スコア:1, おもしろおかしい)
64バイトのうち余っている部分は有効利用して、
・チェックサムを入れる
・PGP署名を入れる
・人間向け表記を入れる(UTF-16あたりで)
・日記やぐち、伝言を入れる
・アナログ時計の画像を入れる
・よそにレンタルする
などすれば、宇宙の最後をみる前に領域が不足すると思われます。そ、そこまで見越していたんだからねっ。
…ごめんなさい。
Re:そろそろ (スコア:1)
て、それでも残り280億年以上あったり。
# 半分寝ながら計算したから間違ってるかも。
巧妙に潜伏したバグは心霊現象と区別が付かない。
Re:そろそろ (スコア:0)
64バイトは必要だろう。
2000年問題で得た教訓だよ。
Re:そろそろ (スコア:0)
別次元にワープできるような技術を持ってるなら
レガシーコードの一つや二つ何とかしてくれるでしょうよ。
Re:そろそろ (スコア:0, おもしろおかしい)
あしたあたり冷凍睡眠カプセルに投げ込まれて目が覚めたら30年後、なんて絶対にない、とは言えませんよ。
Re:そろそろ (スコア:1, すばらしい洞察)
Re:そろそろ (スコア:0)
Re:そろそろ (スコア:0)
Re:そろそろ (スコア:0, 荒らし)
素朴な疑問 (スコア:0)
この辺の確認というか保障は誰がしているんでしょうか?
あと確認用のテスト項目リストとかあります?
Re:素朴な疑問 (スコア:4, 参考になる)
たとえば、
#include <stdio.h>
float *conv(int *ptr) { return (float *)ptr; }
int main(int ac, char **av) {
int x = 10;
float *p = conv(&x);
*p = 0.1;
printf("%d\n", x);
return 0;
}
このプログラムは、期待した動作が行われません。
コンパイラの最適化や、コンパイラバージョンに依存したり、周辺のコードによっても結果が変わる動きをします。
ここまで分かりやすいものは対応できますけど、構造体などを経由して複雑に入り組んでいると、ほとんどお手上げです。
なお上記のコードは、-Wallつけても何も怒られません(gcc-4.1)
-O2 から結果が変わります。
# この書き方を、入力型チェックつきのキャスト、って言う意味で
# 使うことがあるので困ったことがある。
# -fno-strict-aliasing つければ動きますが、、
Re:素朴な疑問 (スコア:1, すばらしい洞察)
何を期待しているのか分かりません。解説求む!
Re:素朴な疑問 (スコア:5, おもしろおかしい)
元のプログラムを見たあなたが、
1)プログラムの意図が分からない→ポインタのお勉強をしましょう
2)10と表示されると思った→やっぱりポインタのお勉強をしましょう
3)結果が投稿者の書いたとおり、0.1のビットパタンが表示される
(X86系だと1036831949=0x3dcccccd)
→ANSI-Cのtype-punningについて調べる事をお勧めします。
4)結果は不定で分からない。→規格に精通したその筋の人。
5) gcc-2.95 以前であれば1036831949が表示されるはずで、
gcc-2.96以降だと-O2より強い最適化を施せば結果は10になるが、
そうでなければ、、、、
→ うるさい、だまれ!!
Re:素朴な疑問 (スコア:0)
Re:素朴な疑問 (スコア:2)
Re:素朴な疑問 (スコア:0)
一昔前の__volatile__を付けないとIO命令が消えてしまうというという 問題点に似たものですよね。 IOの問題は/usr/includeファイルで対応されたので、 この問題も同様な対応がされるのかな?
Re:素朴な疑問 (スコア:2, すばらしい洞察)
Re:素朴な疑問 (スコア:1)
hexで表示するほうがわかりやすいかもしれませんが。
Re:素朴な疑問 (スコア:0)
特定の条件でそういう動作を期待するのは分かりますが、
>コンパイラの最適化や、コンパイラバージョンに依存したり、周辺のコードによっても結果が変わる動きをします。
諸々の要因で結果が違うことは知っているんですよね。
それなのに何か決まった動作を期待するというのは矛盾していませんか?
仕様外の動きを確認して何をしたいのでしょう?
>*p = 0.1;
スタック壊して、mainのリターンと同時にどっか行っちゃう、、、なんて可能性だってあるわけだし :-p
Re:素朴な疑問 (スコア:0)
>テストで難しいのは、動作確認するコードが、完全には言語仕様に準拠していない事があるという事です。
って書いてるじゃない。あのコードは正しくないのが前提だよ。
#私も、最初、未定義の動作をさせて何をしたいの? と思ったけど。
Re:素朴な疑問 (スコア:1, すばらしい洞察)
何がしたいのか?ということなんだけどね。
静的なコード解析ツールか何かで、
そういう言語仕様外のコードをチェックするとかなら理解できますけど、
どう動作するか分からないコードを動かして、
「期待どおり」って何が期待どおりなのか?ということだよ。
# 自分だけしか知らない前提があっての「期待どおり」だということは分かりましたけどね。
Re:素朴な疑問 (スコア:0)
>どう動作するか分からないコードを動かして、
>「期待どおり」って何が期待どおりなのか?ということだよ。
元の k.kmn 氏のコメントはそういうことを言っているのだけど理解できませんか。
Re:素朴な疑問 (スコア:1, すばらしい洞察)
流れも理解できない奴にまぬけ呼ばわりされたかねーよ。
>テストで難しいのは、動作確認するコードが、完全には言語仕様に準拠していない事があるという事です。
>たとえば
>(省略)
>このプログラムは、期待した動作が行われません。
この文章から「期待した動作」を説明せよ。
という問いに答えられるのは、これを書いた本人だけだよ。
コードは「動作確認するコード」の例。
条件によって動作が異なると自分で説明しているじゃん。
しかし、そのコードがどういう動作になるか説明していないんだから、
一定の動作を期待できないコードに何を期待しているのか分かるはずがない。
# もちろん、推測はできるけどね。推測で議論したくないだろ!
それに対して、説明を求めただけ。
「仕様外のコードでうまく動くかどうか分からん」なんてのは
最初から分かっているから。
Re:素朴な疑問 (スコア:0)
>テストで難しいのは、動作確認するコードが、完全には言語仕様に準拠していない事があるという事です。
と書いているからには、
動作確認するコードが言語仕様にマッチしない必要性を説明しなければなりません。
しかし、例示されたコードは、単に言語仕様に外れた例を示したに過ぎません。
ここは単に「言語仕様にマッチしたコードを書けよ。」で終了するところでしょう。
> まあ、まずはこんなところに背伸びしてコメントせずにしっかり勉強しましょう。
相手を見下したつもりにならないとコメントが書けないのなら、
こんなところに書込みをしない方が世の為になりますよ。
Re:素朴な疑問 (スコア:3, 参考になる)
strict-aliasing の問題なら、 ってコードでも示して、「このコードの実行結果が10になるのか20になるのか?」と言えば十分です。
これは「新しいgccでは結果が変わる」ことの例で「動作確認するコードが、完全には言語仕様に準拠していない」ことの説明になっていませんが、
このコードと比べても、元の(intのポインタにfloatを代入する)コードは「動作確認するコードが言語仕様にマッチしない」例になっていないと。
Re:素朴な疑問 (スコア:2, 興味深い)
この例で新しいコンパイラで本当に10が表示されるんですか?
私は4.2をチェックしてませんので、4.2で変わったというのであればそのように教えてほしいのですけど。
gcc4.1のstrict-aliasingのオプション説明を見る限り
`-fstrict-aliasing'
Allows the compiler to assume the strictest aliasing rules
applicable to the language being compiled. For C (and C++), this
activates optimizations based on the type of expressions. In
particular, an object of one type is assumed never to reside at
the same address as an object of a different type, unless the
types are almost the same. For example, an `unsigned int' can
alias an `int', but not a `void*' or a `double'. A character type
may alias any other type.
中略
Enabled at levels `-O2', `-O3', `-Os'
と書かれてます。
主要な部分だけ意訳すると、
異なった型のポインタを経由して同じオブジェクトにアクセスする事はないという前提で
最適化を行う。(ただし、似たようなポインタ、int *に対してunsigned int *のような場合、は除く)
この最適化オプションは-O2, -O3 -Osで使われる。
しかし、ここで新たに示されたサンプルコードは、同じ型のポインタを使ってアクセスするため、
上に書いた条件を満たしません。
したがって、このコードで、20が表示されるというのは、少なくともgcc-4.1においては
strict-aliasingが適用されたとしても、ないと思うのです。
# このような異なった型の間の変換を合法的に行うにはunionを使えと書いてあるけど
# 実際に存在するコードで守られているとは言い切れないし、unionも使い方で問題が出る
# と<中略>したところに書いてあります。一読をお勧めします。
# フレームの最中にIDってのは、いやなんだけど、放置もできないからID
Re:素朴な疑問 (スコア:1, 興味深い)
フレーマ相手にご苦労様です。
つまり、
×> テストで難しいのは、動作確認するコードが、完全には言語仕様に準拠していない事があるという事です。
○> テストで難しいのは、動作確認するコードが、コンパイラに依存している場合があるという事です。
もしくは、
○> テストで難しいのは、動作確認するコードもコンパイラに依存している場合です。
でFAですか?
この主張なら誰もケンカしてないと思うよ。
Re:素朴な疑問 (スコア:1, 参考になる)
> -O2 から結果が変わります。
つ[ -Wstrict-aliasing , -Wstrict-aliasing=2 ]
Re:素朴な疑問 (スコア:1, 興味深い)