代替コンパイラの選択は広範囲にわたります:インテルコンパイラスイート、Sun Studio Expressコンパイラ、TenDRA C / C ++コンパイラ、Tiny Cコンパイラ、その他の軽量コンパイラ。
最も人気のある(AFAIK)代替コンパイラ-iccへの切り替えを検討します。
あなたは尋ねるかもしれません:なぜこれが必要なのでしょうか? 実際のところ、iccはgccよりもIntelプロセッサーでの実行用にコードを最適化します。
自分で比較してください:
テストプログラム | bunzip2 linux-2.6.32.tar.bz2 | bzip2 linux-2.6.32.tar | oggenc -q5 testfile.wav | lame -V4 testfile.wav |
---|---|---|---|---|
平均リードタイム(gcc) | 22.118 | 91.452 | 108.554 | 98.438 |
平均リードタイム(icc) | 20.373 | 68.284 | 88.581 | 84.626 |
スピードアップ | 8.5% | 33.9% | 22.5% | 16.3% |
同意、非常に良い結果。
テストが実行されたコンピューターの構成:Intel Core 2 Duo T7250 @ 2.00 GHz; linux 2.6.31-gentoo-r7 x86; gcc-4.4.2; icc-11.1.056; すべてのテストは、I / Oの速度を犠牲にしないように、tmpfsセクションで実行されました。
設置
準備ができたら、インストールを続行します。
# emerge icc
iccの作業にはライセンスが必要です 。無料の非営利オプションを使用します 。 こちらから入手できます 。 .licファイルを取得したら、それを/ opt / intel / licensesに入れます。
Portageのセットアップ
すぐに警告します。一部のアプリケーションはiccによってビルドされておらず、一部はビルドされていますが動作しません。ただし、icc開発者はgccと可能な限り互換性を保とうとしています。 したがって、コンパイラの変更が完了するとは言えません-gccによってのみ何かを構築でき、それを拒否しません。 2つのオプションがあります。すべてのiccをコンパイルし、アプリケーションgccを個別にコンパイルするか、その逆で、メインのgccコンパイラーを終了し、iccは一部のプログラムのみを収集します。 どちらを選択するかはあなた次第です-システムを長時間探し回る余裕がない場合、または単に不必要な問題を望んでいない場合は、おそらく、2番目のオプションがより受け入れられます。 十分な空き時間がある場合や新しいことを試してみたい場合は、最初の選択肢があります。
最初のオプション:メインコンパイラはicc、セカンダリコンパイラはgcc
make.confのiccのフラグはICCCFLAGSおよびICCCXXFLAGS(gccのCFLAGSおよびCXXFLAGS)として定義されていると仮定します。 gccがビルドする必要のあるパッケージのリストは/etc/portage/package.gccにあります。 個々のパッケージの特別なフラグは/etc/portage/package.gcc-cflagsおよび/etc/portage/package.icc-cflagsにあります。
現在のコンパイラは、OCCおよびOCXX環境変数で定義されています-ここでそれらを変更します。
これを行うには、次の内容のスクリプト/ etc / portage / bashrcを作成します。
export GCC=${OCC} #
export GCXX=${OCXX}
export OCC="icc" #
export OCXX="icpc"
export GCCCFLAGS=${CFLAGS} #
export GCCCXXFLAGS=${CXXFLAGS}
export CFLAGS=${ICCCFLAGS} #
export CXXFLAGS=${ICCCXXFLAGS}
[ -r ${ROOT}/etc/portage/package.gcc ] || return 0
while read -a target; do
if [ "${target}" = "${CATEGORY}/${PN}" ]; then # /etc/portage/package.gcc,
export OCC="${GCC}" #
export OCXX="${GCXX}"
export CFLAGS="${GCCCFLAGS}" #
export CXXFLAGS="${GCCCXXFLAGS}"
if [ -r ${ROOT}/etc/portage/package.gcc-cflags ]; then # /etc/portage/package.gcc-cflags,
while read target flags; do
if [ "${target}" = "${CATEGORY}/${PN}" ]; then
export CFLAGS="$CFLAGS $flags" #
export CXXFLAGS="$CXXFLAGS $flags"
break
fi
done < ${ROOT}/etc/portage/package.gcc-cflags
fi
return 0
fi
done < ${ROOT}/etc/portage/package.gcc
if [ -r ${ROOT}/etc/portage/package.icc-cflags ]; then # icc
while read target flags; do
if [ "${target}" = "${CATEGORY}/${PN}" ]; then
export CFLAGS="$CFLAGS $flags"
export CXXFLAGS="$CXXFLAGS $flags"
break
fi
done < ${ROOT}/etc/portage/package.icc-cflags
fi
export CC_FOR_BUILD="${OCC}" # workaround
unset GCC
unset GCXX
unset GCCCFLAGS
unset GCCCXXFLAGS
2番目のオプション:メインコンパイラはgcc、セカンダリコンパイラはicc
前のケースと同様に、ここでのみ/etc/portage/package.iccのiccによって収集されたパッケージのリストがあります
[ -r ${ROOT}/etc/portage/package.icc ] || return 0
while read -a target; do
if [ "${target}" = "${CATEGORY}/${PN}" ]; then # /etc/portage/package.icc,
export OCC="icc" #
export OCXX="icpc"
export CFLAGS="${ICCCFLAGS}" #
export CXXFLAGS="${ICCCXXFLAGS}"
if [ -r ${ROOT}/etc/portage/package.icc-cflags ]; then # /etc/portage/package.icc-cflags,
while read target flags; do
if [ "${target}" = "${CATEGORY}/${PN}" ]; then
export CFLAGS="$CFLAGS $flags" #
export CXXFLAGS="$CXXFLAGS $flags"
break
fi
done < ${ROOT}/etc/portage/package.icc-cflags
fi
export CC_FOR_BUILD="${OCC}" # workaround
return 0
fi
done < ${ROOT}/etc/portage/package.icc
if [ -r ${ROOT}/etc/portage/package.gcc-cflags ]; then # gcc
while read target flags; do
if [ "${target}" = "${CATEGORY}/${PN}" ]; then
export CFLAGS="$CFLAGS $flags"
export CXXFLAGS="$CXXFLAGS $flags"
break
fi
done < ${ROOT}/etc/portage/package.gcc-cflags
fi
fi
それだけです! システムは、新しいコンパイラでパッケージを収集する準備ができています。
長所と短所
プラス
一つだが大胆。 プロセッサ集約型プロセスの顕著な加速-(de)オーディオ/ビデオのエンコード、(de)暗号化など
短所
1. gccとの不完全な互換性。 一部のプログラムはiccによってビルドされず、一部はビルドされますが機能しません。 たとえば、LZMAアルゴリズム(xz-utils、p7zip)を使用するプログラムは収集されますが、アーカイブは解凍されません-彼らはbeatられていると言います。 これが唯一の例ではないことを確信しています。
2. iccは実行可能ファイルを独自のライブラリにリンクします。何らかの理由で削除する場合は、コンパイルしたすべてのパッケージを再構築する必要があります。
3. iccが閉じられます。 一部の人にとってこれはマイナスではありませんが、そのソースコードの発見が害を及ぼさなかったことを認めなければなりません(もちろんIntelを除く)。
おわりに
他のコンパイラーへの移行も本質的に変わらないと言いたいです。スクリプトでは、iccを選択したコンパイラーに変更するだけです。
この記事がお役に立てば幸いです。
PS招待してくれてありがとうgribozavr !