HPCメモ

HPC(High Performance Computing)に関連したりしなかったりすることのメモ書き

CentOS 6.3へgcc4.8.0をインストール

仕事でCentOS 6.3な環境でテストプログラムを書いていて、乱数が必要になったので、ふと思いたってc++11のメルセンヌツイスタを使ってみようとしました。
ところが、標準でインストールされているg++は

$ g++ --version
g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULmmAR PURPOSE.

このバージョンだとstd::mersenne_twister_engineはあるけど、std::uniform_real_distribution は未実装という残念な状況です。
しかもアップデートパッケージも用意されていない模様。

ま、コンパイラが入ってるんだからソースから入れりゃ良いだろうってことで、最新リリースのver. 4.8.0を
gcc4.8.0を入れてみることにしました。*1
手順は以下のとおり

依存しているライブラリをyumで入れる
> yum install gmp.x86_64 gmp-devel.x86_64
> yum install mpfr-devel.x86_64 mpfr.x86_64
> yum install libmpc-devel.x86_64 libmpc.x86_64
gccのソースを取ってくる

これは、GNUのページにある適当なミラーサイトからどうぞ
http://gcc.gnu.org/mirrors.html

適当なディレクトリに展開
>tar xfj gcc-4.8.0.tar.bz2
configureしてmake

既存のgccを上書きしないように、/opt/gcc48へインストールすることにします。

> configure --prefix=/opt/gcc48 &&make &&make install


私の環境では、libgcc/libgcc2.cのコンパイルで以下のエラーが出ました。

In file included from /usr/include/features.h:385:0,
                 from /usr/include/stdio.h:28,
                 from ../../.././libgcc/../gcc/tsystem.h:87,
                 from ../../.././libgcc/libgcc2.c:27:
/usr/include/gnu/stubs.h:7:27: fatal error: gnu/stubs-32.h: No such file or directory
# include 
                           ^

ググってみたら、stackoverflowに"You're missing the 32 bit libc dev package"と書かれてたのが見えたので
yumでglibc-devel.i686を入れて、念の為x86_64の方もアップデートした上でmakeを継続。

>yum install glibc-devel.i686 glibc.i686 glibc-devel.x86_64 glibc-headers.x86_64
>make&&make install
moduleの設定ファイルを用意

CentOS 6.3ではmoduleが使えるようになっているので、/etc/modulefiles/gcc48を次のような内容で作ります。

#%Module 1.0
#
#  gcc ver. 4.8.0 module for use with 'environment-modules' package:
#
prepend-path            PATH            /opt/gcc48/bin
prepend-path            LD_LIBRARY_PATH /opt/gcc48/lib

中身はopenmpiのものをコピーして書き換えただけなので、まっとうなものかどうかは分かりません:(

これで、gcc4.8.0のインストールが完了です。
module availするとgcc48が見えて、module load gcc48すればver 4.8.0のgccを使うことができます。
もちろん、module unload gcc48すれば、元のgcc 4.4.7を使うこともできます。

>module avail

-------------------------------------------------------------- /usr/share/Modules/modulefiles ---------------------------------------------------------------
dot         module-cvs  module-info modules     null        use.own

--------------------------------------------------------------------- /etc/modulefiles ----------------------------------------------------------------------
gcc48          openmpi-x86_64

>module load gcc48
> gcc --version
gcc (GCC) 4.8.0
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

>module unload gcc48
>gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

ちなみに仕事のプログラムはrand()を使いました。だってコンパイルに20時間くらいかかったし・・・orz

*1:2.9の頃の大騒動を思うと、いくらリリース版とはいえ最新を入れるのはちょっと怖いとこですが・・・