FreeBSDでpgccを使う
FreeBSDではソフトをコンパイルするのにgccを使うが、このgccをIntel Pentiumに最適化させたコンパイラが「pgcc」である。話によれば、pgccでコンパイルすると数パーセントから数十パーセントのパフォーマンスアップが期待できるとのことだ。
残念なことに、pgccはPortsで提供されていない。そのため、自力でインストールする必要がある。以下にその方法を紹介する。なお、OSの対象はFreeBSD4とする。
<参考サイト>
GCC Home Page
gccの公式サイト(英語)
AMATERAS SPACE
pgccのパッチを配布している
Installing GCC
gccのインストール方法を解説している(公式サイト英語)
ひらちゃんのインストールメモ
pgccのインストール方法を解説している
PentiumGCC FAQ
pgccのFAQ日本語訳
diff/patch Tips
パッチ当てに必要なpatchコマンドの解説
<手順>
※注意:コンパイル作業をするためには、ディスクに十分な空き容量が必要なため、余裕のあるスライス内で行うべし。
パッチ適用が完了すると以下のようなメッセージが表示される。
(略) Hmm... The next patch looks like a unified diff to me... The text leading up to this was: -------------------------- |diff -urN gcc-2.95.3-old/libiberty/cplus-dem.c gcc-2.95.3/libiberty/cplus-dem.c |--- gcc-2.95.3-old/libiberty/cplus-dem.c Sun May 16 20:44:09 1999 |+++ gcc-2.95.3/libiberty/cplus-dem.c Fri Apr 13 15:08:36 2001 -------------------------- Patching file libiberty/cplus-dem.c using Plan A... Hunk #1 succeeded at 4451. done |
Reading specs from /usr/local/lib/gcc-lib/i386-unknown-freebsdelf/pgcc-2.95.3/specs gcc version pgcc-2.95.3 20010315 (release) |
このままでは「/usr/local/bin/pgcc/gcc」と指定しないとpgccを使ってコンパイルすることができない。単に「gcc」と指定したらpgccが使われるように設定を変える必要がある。
その方法は、シェルの設定ファイルを書き換えて「/usr/local/bin/pgcc」へパスを通す。この際気をつけるのが、オリジナルのgccは「/usr/bin」にあるため、それより前に記述することだ。
<手順>
.cshrcの例
set path = (/sbin /bin /usr/sbin /usr/local/bin/pgcc /usr/bin /usr/games /usr/local/sbin /usr/local/bin /usr/X11R6/bin $HOME/bin) |
ユーザーごとではなく、全ユーザーにパスの変更を適用したい場合は、「/etc/csh.cshrc」に記述する。
インストールしてパスも通してやっと使えるまでになったが、これだけではpgccの真価を発揮できないかもしれない。通常のgccには最適化オプションとして-O1〜-O3までの3段階あるが、pgccでは-O6まであるのだ。さらにCPUの種類も適切に指定する必要がある。そのための設定を行う。
<手順>
CPUTYPE=i686 CFLAGS=-O6 -pipe |
さっそくPortsから何かインストールしてみてほしい。pgccが使われてmakeされたことを確認しよう。
作成されたバイナリをviなどのテキストエディタで開き、「pgcc」で検索すると、
^@^@GCC: (GNU) c 2.95.4 20020320 [FreeBSD]^@^@GCC: (GNU) pgcc-2.95.3 20010315 (release) |
※MySQL4.0とLinuxThreadsの組み合わせでmakeしてみたが、configureでエラーになってしまった。LinuxThreadsはpgccでのmakeに合わないようだ。そのためLinuxThreadsは通常のgccでmakeした。
また、MySQL4.0はpgccでmakeできるが、最適化オプションを-03まで下げないとmake途中でエラーになった。