インテル®コンパイラー・スイートを例として使用して、Gentooで代替コンパイラーを使用する

この記事では、パッケージをビルドするためにGentooや他のPortageベースのディストリビューションでgccとは異なるコンパイラを使用する方法についてお話したいと思います。
代替コンパイラの選択は広範囲にわたります:インテルコンパイラスイート、Sun Studio Expressコンパイラ、TenDRA C / C ++コンパイラ、Tiny Cコンパイラ、その他の軽量コンパイラ。
最も人気のある(AFAIK)代替コンパイラ-iccへの切り替えを検討します。
あなたは尋ねるかもしれません:なぜこれが必要なのでしょうか? 実際のところ、iccはgccよりもIntelプロセッサーでの実行用にコードを最適化します。
自分で比較してください:
テストプログラムbunzip2 linux-2.6.32.tar.bz2bzip2 linux-2.6.32.taroggenc -q5 testfile.wavlame -V4 testfile.wav
平均リードタイム(gcc)22.11891.452108.55498.438
平均リードタイム(icc)20.37368.28488.58184.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

Source: https://habr.com/ru/post/J83324/


All Articles