パスワードを忘れた? アカウント作成
15471 story

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)ものもあるようだ。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2007年05月20日 18時23分 (#1160046)
    昨日 FreeBSD 7-Currentのベース GCC4.2.0が取り込まれました。
    しかしながら、以下のアナウンスにもあるよう様に、OpenSSL関連で トラブルが出ているようです。
    http://docs.freebsd.org/cgi/mid.cgi?20070520022722.1f5a0cda [freebsd.org]

    皆様ご注意を。
  • by Anonymous Coward on 2007年05月19日 22時53分 (#1159757)
    インストールしてgfortranのOpenMPを使ってみた

    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をすると楽しい。なんか間違ってたらごめん。
  • 最近追いかけていなかったので知りませんでしたが。
    changesに
    The GNU Fortran compiler now uses 4-byte record markers by default for unformatted files to be compatible with g77 and most other compilers.
    とあります。
    これで、ようやくgfortranをまともに使うことができるようになるかもしれません。
  • by TGBT (30714) on 2007年05月20日 2時50分 (#1159865)
    ・OpenMP is now supported for the C, C++ and Fortran compilers.
    の一行しか書いてない。
    iccを使っている人に是非とも性能確認して欲しいところです。

    あと、せっかくだからOmni: OpenMP compiler project [phase.hpcc.jp]との性能比較も……
  • どっかにバージョン別ベンチマークってないかな?
    同一プロセッサで2.9系からどれだけ段々と効率が良くなったのか把握できると時代の流れを感じられるんだけど。
    拡張命令の進化とかあるから難しいベンチマークになりそうだけど。
    --
    妖精哲学の三信
    「だらしねぇ」という戒めの心、「歪みねぇ」という賛美の心、「仕方ない」という許容の心
  • boost (スコア:1, 参考になる)

    by Anonymous Coward on 2007年05月20日 0時41分 (#1159811)

    空いている古いマシン(PenII)にgcc-4.2を入れてみたが、boost(1.34.0)のビルドが出来ない。

    %./configure --show-libraries
    Building Boost.Jam with toolset gcc... tools/jam/src/bin.linuxx86/bjam

    The following Boost libraries have portions that require a separate build
    and installation step. Any library not listed here can be used by including
    the headers only.

    The Boost libraries requiring separate building and installation are:
    %
    gcc-4.1.2を使った場合は問題が起きず、コンパイラ以外の条件は変わっていないので、 bjamとgcc-4.2の組み合わせが問題かもしれないが、まだ原因を考え/調べているところ。
  • by Anonymous Coward on 2007年05月20日 0時01分 (#1159797)
    そろそろ2038年問題を視野に入れて、32ビット環境でもtime_tを64ビットにしてほしい…
    • Re:そろそろ (スコア:3, すばらしい洞察)

      by bee (10028) on 2007年05月20日 0時03分 (#1159799) ホームページ 日記

      それはコンパイラの領分ではなくてライブラリの領分です。

      親コメント
      • Re:そろそろ (スコア:3, すばらしい洞察)

        by ei (19798) on 2007年05月20日 1時38分 (#1159837) 日記
        コンパイル時にtypedef ... time_t(C++では構造体タグtime_tも? )をめっけたらsizeof(time_t)を評価して64未満ならば「こんなへぼいライブラリ捨て捨て! 」とか警告出す機能が、いずれ必要になると思います。
        親コメント
        • Re:そろそろ (スコア:3, おもしろおかしい)

          by Anonymous Coward on 2007年05月20日 10時56分 (#1159929)
          おれが生きている間には、time_tが64バイトも必要になることはないな :-p
          親コメント
          • Re:そろそろ (スコア:1, おもしろおかしい)

            by Anonymous Coward on 2007年05月21日 11時14分 (#1160222)
            ところで64バイトだと何年になるんだ?
            宇宙は残ってる?
            親コメント
            • Re:そろそろ (スコア:1, おもしろおかしい)

              by Anonymous Coward on 2007年05月21日 12時57分 (#1160297)
              本気で勘違いしていた#1159971のACですが。

              64バイトのうち余っている部分は有効利用して、

              ・チェックサムを入れる
              ・PGP署名を入れる
              ・人間向け表記を入れる(UTF-16あたりで)
              ・日記やぐち、伝言を入れる
              ・アナログ時計の画像を入れる
              ・よそにレンタルする

              などすれば、宇宙の最後をみる前に領域が不足すると思われます。そ、そこまで見越していたんだからねっ。

              …ごめんなさい。
              親コメント
              • by Yoh2 (6924) <yoh2@d2.dion.ne.jp> on 2007年05月22日 2時44分 (#1160620) 日記
                そこまでいろいろな情報を詰めなくても、time_tの精度や起点は処理系定義なので、宇宙が誕生した137億年前を起点とした、10**-137秒単位……だと現在にも届かないから、10**-136秒単位の時刻にしてみるとか。
                て、それでも残り280億年以上あったり。

                # 半分寝ながら計算したから間違ってるかも。
                --
                巧妙に潜伏したバグは心霊現象と区別が付かない。
                親コメント
            • by Anonymous Coward
              消滅する宇宙から別次元へワープした子孫たちが今のレガシーコードを使い続けるハメになる可能性も考慮して
              64バイトは必要だろう。
              2000年問題で得た教訓だよ。
              • by Anonymous Coward
                それにしたって何回宇宙が消滅できるかわかったもんじゃない年数ですぜ。

                別次元にワープできるような技術を持ってるなら
                レガシーコードの一つや二つ何とかしてくれるでしょうよ。
          • Re:そろそろ (スコア:0, おもしろおかしい)

            by Anonymous Coward
            2000年問題の教訓を忘れるには早過ぎます。さらに、事実は小説より奇なり、なのです。

            あしたあたり冷凍睡眠カプセルに投げ込まれて目が覚めたら30年後、なんて絶対にない、とは言えませんよ。
        • by Anonymous Coward
          そう思ってるなら、メーリングリストに提案してはどうですか?
  • by Anonymous Coward on 2007年05月20日 9時17分 (#1159902)
    >Firefox2のビルド・使用にも耐えている

    この辺の確認というか保障は誰がしているんでしょうか?
    あと確認用のテスト項目リストとかあります?
    • Re:素朴な疑問 (スコア:4, 参考になる)

      by k.kmn (29899) on 2007年05月20日 11時24分 (#1159941)
      テストで難しいのは、動作確認するコードが、完全には言語仕様に準拠していない事があるという事です。

      たとえば、
      #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, すばらしい洞察)

        by Anonymous Coward on 2007年05月20日 11時56分 (#1159954)
        >このプログラムは、期待した動作が行われません。

        何を期待しているのか分かりません。解説求む!
        親コメント
        • Re:素朴な疑問 (スコア:5, おもしろおかしい)

          by Anonymous Coward on 2007年05月20日 15時07分 (#1159998)
          フレームの元になる事を覚悟の上で書くと

          元のプログラムを見たあなたが、

          1)プログラムの意図が分からない→ポインタのお勉強をしましょう
          2)10と表示されると思った→やっぱりポインタのお勉強をしましょう
          3)結果が投稿者の書いたとおり、0.1のビットパタンが表示される
                (X86系だと1036831949=0x3dcccccd)
                →ANSI-Cのtype-punningについて調べる事をお勧めします。
          4)結果は不定で分からない。→規格に精通したその筋の人。
          5) gcc-2.95 以前であれば1036831949が表示されるはずで、
                gcc-2.96以降だと-O2より強い最適化を施せば結果は10になるが、
                そうでなければ、、、、
              → うるさい、だまれ!!

          親コメント
        • by k.kmn (29899) on 2007年05月20日 12時11分 (#1159958)
          ただ、0.1のFloatと同じビットパタンの整数値が何になるかを見るだけです。
          hexで表示するほうがわかりやすいかもしれませんが。
          親コメント
          • by Anonymous Coward
            解説を求めた者です。
            特定の条件でそういう動作を期待するのは分かりますが、

            >コンパイラの最適化や、コンパイラバージョンに依存したり、周辺のコードによっても結果が変わる動きをします。

            諸々の要因で結果が違うことは知っているんですよね。
            それなのに何か決まった動作を期待するというのは矛盾していませんか?
            仕様外の動きを確認して何をしたいのでしょう?

            >*p = 0.1;
            スタック壊して、mainのリターンと同時にどっか行っちゃう、、、なんて可能性だってあるわけだし :-p
            • by Anonymous Coward
              k.kmn 氏は

              >テストで難しいのは、動作確認するコードが、完全には言語仕様に準拠していない事があるという事です。

              って書いてるじゃない。あのコードは正しくないのが前提だよ。

              #私も、最初、未定義の動作をさせて何をしたいの? と思ったけど。
              • Re:素朴な疑問 (スコア:1, すばらしい洞察)

                by Anonymous Coward on 2007年05月20日 20時22分 (#1160068)
                だから、その「正しくないコード」を走らせて
                何がしたいのか?ということなんだけどね。

                静的なコード解析ツールか何かで、
                そういう言語仕様外のコードをチェックするとかなら理解できますけど、
                どう動作するか分からないコードを動かして、
                「期待どおり」って何が期待どおりなのか?ということだよ。

                # 自分だけしか知らない前提があっての「期待どおり」だということは分かりましたけどね。
                親コメント
              • by Anonymous Coward
                ほんとにまぬけな人だな。

                >どう動作するか分からないコードを動かして、
                >「期待どおり」って何が期待どおりなのか?ということだよ。

                元の k.kmn 氏のコメントはそういうことを言っているのだけど理解できませんか。
              • Re:素朴な疑問 (スコア:1, すばらしい洞察)

                by Anonymous Coward on 2007年05月21日 8時04分 (#1160135)
                ちゃんとはじめから追ってコメントしろよ。
                流れも理解できない奴にまぬけ呼ばわりされたかねーよ。

                >テストで難しいのは、動作確認するコードが、完全には言語仕様に準拠していない事があるという事です。
                >たとえば
                >(省略)
                >このプログラムは、期待した動作が行われません。

                この文章から「期待した動作」を説明せよ。
                という問いに答えられるのは、これを書いた本人だけだよ。

                コードは「動作確認するコード」の例。
                条件によって動作が異なると自分で説明しているじゃん。
                しかし、そのコードがどういう動作になるか説明していないんだから、
                一定の動作を期待できないコードに何を期待しているのか分かるはずがない。
                # もちろん、推測はできるけどね。推測で議論したくないだろ!
                それに対して、説明を求めただけ。

                「仕様外のコードでうまく動くかどうか分からん」なんてのは
                最初から分かっているから。
                親コメント
              • by Anonymous Coward
                まぬけなのは貴方の方なのでは?

                >テストで難しいのは、動作確認するコードが、完全には言語仕様に準拠していない事があるという事です。

                と書いているからには、
                動作確認するコードが言語仕様にマッチしない必要性を説明しなければなりません。
                しかし、例示されたコードは、単に言語仕様に外れた例を示したに過ぎません。
                ここは単に「言語仕様にマッチしたコードを書けよ。」で終了するところでしょう。

                > まあ、まずはこんなところに背伸びしてコメントせずにしっかり勉強しましょう。

                相手を見下したつもりにならないとコメントが書けないのなら、
                こんなところに書込みをしない方が世の為になりますよ。
              • Re:素朴な疑問 (スコア:3, 参考になる)

                by taka2 (14791) on 2007年05月21日 12時02分 (#1160257) ホームページ 日記
                kmn氏の主張と、サンプルコードが食い違ってるのが最大の問題でしょうね。

                strict-aliasing の問題なら、
                #include <stdio.h>
                int *conv(int *ptr) { return ptr; }
                 
                int main(int ac, char **av) {
                        int x = 10;
                        int *p = conv(&x);
                        *p = 20;
                        printf("%d\n", x);
                        return 0;
                }
                ってコードでも示して、「このコードの実行結果が10になるのか20になるのか?」と言えば十分です。
                これは「新しいgccでは結果が変わる」ことの例で「動作確認するコードが、完全には言語仕様に準拠していない」ことの説明になっていませんが、

                このコードと比べても、元の(intのポインタにfloatを代入する)コードは「動作確認するコードが言語仕様にマッチしない」例になっていないと。
                親コメント
              • by k.kmn (29899) on 2007年05月21日 15時28分 (#1160350)
                > ってコードでも示して、「このコードの実行結果が10になるのか20になるのか?」と言えば十分です。

                この例で新しいコンパイラで本当に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
                親コメント
              • by Anonymous Coward on 2007年05月21日 16時37分 (#1160374)
                > # フレームの最中にIDってのは、いやなんだけど、放置もできないからID

                フレーマ相手にご苦労様です。
                つまり、

                ×> テストで難しいのは、動作確認するコードが、完全には言語仕様に準拠していない事があるという事です。
                ○> テストで難しいのは、動作確認するコードが、コンパイラに依存している場合があるという事です。

                もしくは、

                ○> テストで難しいのは、動作確認するコードもコンパイラに依存している場合です。

                でFAですか?
                この主張なら誰もケンカしてないと思うよ。
                親コメント
      • Re:素朴な疑問 (スコア:1, 参考になる)

        by Anonymous Coward on 2007年05月20日 16時59分 (#1160025)
        > なお上記のコードは、-Wallつけても何も怒られません(gcc-4.1)
        > -O2 から結果が変わります。

        つ[ -Wstrict-aliasing , -Wstrict-aliasing=2 ]
        親コメント
    • by Anonymous Coward on 2007年05月20日 23時35分 (#1160097)
      Debianで使用するgccが標準で4.2になれば、結構な数のソフトウェアがテスト対象になると思われますが、まだ先でしょうね、たぶん。
      親コメント
typodupeerror

犯人はmoriwaka -- Anonymous Coward

読み込み中...