Tutorial - Gentoo - Portage compilando pacotes com o compilador C/C++ da Intel - ICC
Introdução
Compilador C/C++ da Intel, icc, pode ser usado como uma alternativa ao compilador da GNU, gcc. O principal benefício do uso do icc em vez do gcc é usa habilidade para otimizaćão, especialmente para processadores Intel. A principal desvantagem (downside) para usar icc é sua imcompatibilidadecom alguns códigos escritos especificamente para o gcc. Não é possível substituir completamente o gcc com icc neste momento. Depois do seguinte guia, seu sistema ainda compilará pacotes com gcc por padrão. Somente pacotes pré-especificados serão compilados com icc.
dev/lang/icc está disponível através do Portage. Ele está disponível, na realidade, requer uma licença, mas um licença não comercial gratuita está disponível. Apenas porque você não possui um processador Intel não significa que este Howto não se aplica para você. Com um pouco de engenharia reversa (não em nossa posição), e um esperto script Perl, nós podemos fazer com que o icc produza códigos "agradáveis"para processadores AMD também.
Ambiente de teste
Sistema Gentoo64:
# uname -a
Linux fenrir 2.6.29-gentoo-r2 #1 SMP Sat May 2 16:29:55 BRT 2009 x86_64 Intel(R) Xeon(TM) CPU 3.00GHz GenuineIntel GNU/Linux
Todos os testes foram realizados num DELL Precision 490:
processor : 0
vendor_id : GenuineIntel
cpu family : 15
model : 6
model name : Intel(R) Xeon(TM) CPU 3.00GHz
stepping : 4
cpu MHz : 2992.058
cache size : 2048 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 6
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall lm constant_tsc pebs bts pni dtes64 monitor ds_cpl vmx est cid cx16 xtpr pdcm lahf_lm tpr_shadow
bogomips : 5984.11
clflush size : 64
cache_alignment : 128
address sizes : 36 bits physical, 48 bits virtual
power management:
Advertência
Binários compilados com icc não funcionarão depois se o icc for desinstalado
Binários compilados com icc são dinamicamente ligados às bibliotecas do icc. Então, se o icc está desinstalado, binários compilados com icc não funcionarão. Antes de desinstalar o icc, todos os binários compilados com gcc deverão ser recompilados com gcc.
Icc não pode compilar todos os pacotes no Portage
Icc e gcc tem diferentes níveis de tolerância nos quais os códigos são considerados válidos. Alguns pacotes que tem sido escritos usando extensões específicas do gcc (gcc-specific extensions) não podem ser compilados com icc. Compilações destes pacotes usando o icc resultará em um erro de compilaćão. Componentes críticos do sistema não devem ser compilados com icc. Se glibc estiver corrompido (numa forma diferente de como o gcc o compilaria) ele poderia gerar um sistema imprestável
Pacotes críticos do sistema que não devem ser compilados com icc são:
- app-shells/bash
- sys-apps/sed
- sys-devel/binutils
- sys-devel/gcc
- sys-libs/glibc
- sys-libs/ncurses
- sys-libs/libstdc++-v3
- sys-libs/zlib Installation
- sys-process/procps
Instalação
Simplesmente emerge ele.
emerge icc
Você também precisa obter a licença. Para os propósitos deste guia, nós obteremos uma licenća não comercial. Clique em 'Free non-commercial Download' na página do compilador Linux da Intel. Siga os passos no site e coloque seu arquivo de licença em /opt/intel/licenses/.
Portage Integration
/etc/make.conf
Adicione suas CFLAGS do icc no /etc/make.conf. Veja a discussão sobre CFLAGS específicas mais a frente.
Arquivo /etc/make.conf:
ICCCFLAGS="-O2 -xT -gcc"
ICCCXXFLAGS="${ICCCFLAGS}"
/etc/portage/bashrc
/etc/portage/bashrc informará ao Portage qual compilador para compilar o devido pacote.
Arquivo /etc/portage/bashrc:
[ -r ${ROOT}/etc/portage/package.icc ] || return 0
while read -a target; do
if [ "${target}" = "${CATEGORY}/${PN}" ]; then
export OCC="icc"
export OCXX="icpc"
export CFLAGS=${ICCCFLAGS}
export CXXFLAGS=${ICCCXXFLAGS}
if [ -r ${ROOT}/etc/portage/package.icc-cflags ]; then
while read target flags; do
if [ "${target}" = "${CATEGORY}/${PN}" ]; then
export CFLAGS="$flags"
export CXXFLAGS="$CFLAGS"
break
fi
done < ${ROOT}/etc/portage/package.icc-cflags
fi
break
fi
done < ${ROOT}/etc/portage/package.icc
if [ -r ${ROOT}/etc/portage/package.gcc-cflags ]; then
while read target flags; do
if [ "${target}" = "${CATEGORY}/${PN}" ]; then
export CFLAGS="$flags"
export CXXFLAGS="$CFLAGS"
break
fi
done < ${ROOT}/etc/portage/package.gcc-cflags
fi
if [ "${OCC}" != "" ]; then
export CC_FOR_BUILD="${OCC}" #workaround gcc detection function in toolchain-funcs.eclass
fi
Aqui está mais uma versão de um funcional/ etc/portage/bashrc. Use esta versão, se você quer usar o icc por padrão e apenas trocar para gcc onde é necessário pela adição daqueles arquivos para o /etc/portage/package.gcc.
Arquivo /etc/portage/bashrc:
export GCC=${OCC}
export GCXX=${OCXX}
export OCC="icc"
export OCXX="icpc"
export CFLAGS=${ICCCFLAGS}
export CXXFLAGS=${ICCCXXFLAGS}
[ -r ${ROOT}/etc/portage/package.gcc ] || return 0
while read -a target; do
if [ "${target}" = "${CATEGORY}/${PN}" ]; then
export OCC=${GCC}
export OCXX=${GCXX}
export CFLAGS="$flags"
export CXXFLAGS="$CFLAGS"
if [ -r ${ROOT}/etc/portage/package.gcc-cflags ]; then
while read target flags; do
if [ "${target}" = "${CATEGORY}/${PN}" ]; then
export CFLAGS="$flags"
export CXXFLAGS="$CFLAGS"
break
fi
done < ${ROOT}/etc/portage/package.gcc-cflags
fi
break
fi
done < ${ROOT}/etc/portage/package.gcc
if [ -r ${ROOT}/etc/portage/package.icc-cflags ]; then
while read target flags; do
if [ "${target}" = "${CATEGORY}/${PN}" ]; then
export CFLAGS="$flags"
export CXXFLAGS="$CFLAGS"
break
fi
done < ${ROOT}/etc/portage/package.icc-cflags
fi
if [ "${OCC}" != "" ]; then
export CC_FOR_BUILD="${OCC}" #workaround gcc detection function in toolchain-funcs.eclass
fi
unset GCC
unset GCX
/etc/portage/package.icc
/etc/portage/package.icc armazenará os nomes de todos os pacotes que devem ser compilados com icc. Se um pacote não está listado neste arquivo, ele compilará com gcc.
Aqui está uma lista com os pacotes que funcionam bem com icc:
Arquivo /etc/portage/package.icc:
dev-lang/python
dev-db/sqlite
dev-libs/libxml2
app-arch/tar
app-arch/bzip2
app-arch/gzip
app-arch/unzip
app-arch/cpio
sys-power/powertop
media-libs/x264-svn
media-sound/lame
media-libs/faac
media-libs/giflib
media-libs/speex
media-libs/libtheora
media-libs/xvid
media-libs/libogg
media-libs/libvorbis
dev-libs/lzo
net-irc/xchat
media-libs/freetype
dev-libs/glib
x11-libs/gtk+
media-libs/libpng
dev-libs/libgpg-error
media-gfx/gimp
/etc/portage/package.icc-cflags
/etc/portage/package.icc-cflags provê CFLAGS por pacote para pacotes compilados com icc. Um pouco de pacotes se beneficiam de forma gigantesca a partir da flag -O3.
Arquivo: /etc/portage/package.icc-cflags
dev-db/sqlite -O3 -xT -gcc
dev-lang/python -O3 -xT -gcc
/etc/portage/package.gcc-cflags
O arquivo /etc/portage/bashrc até nos permite ter CFLAGS por pacote para gcc também. Adicione seus pacotes e CFLAGS para /etc/portage/package.gcc-cflags no mesmo formato do /etc/portage/package.icc-cflags.
Não existe /etc/portage/package.gcc já que os pacotes são construídos com gcc por padrão.
Finalizando
Depois de você ter criado/editado aqueles arquivos relembre-se de executar os comandos:
# env-update
# source /etc/profile
icc CFLAGS
Para uma lista completa de CFLAGS do icc, confira:
man icc
Icc suporta muitas das mesmas CFLAGS que o gcc, então muitas delas deverão parecer famliares. Ele é também muito complacente :-) .
Quer dizer, se um pacote passa uma CFLAG para o icc que este não reconhece, ele irá avisar e seguir adiante. O que é ótimo!
-Ox
Alguns comportamentos do gcc. x é uma das seguintes općões:
- 0 - desabilita otimizaćões
- 1 - ativa otimizacões básicas
- 2 - ativa a mais otimizaćões (o comportamento padrão)
- 3 - ativa a mais agressivas otimizaćões que podem ou não podem aprimorar o desempenho (recomendado para intensivos programas de looping matemáticos)
- s - similar ao -O1, com mais de uma influência voltada para binários pequenos.
Nota: "-O" é o mesmo que "-O2"
Para especificar um tipo específico de processador para otimizar, passe --xX onde X é uma das seuintes opcões:
- K - Gera código SSE
- W - Gera código SSE2
- P - Gera código SSE3
- T - Gera código SSSE3
- S - Gera código SSE4
A CFLAG -x gera código especializado para rodar exclusivamente em processadores indicados por X. Gerar código genérico em adicão ao código especializado, use -axX onde X é uma das općões anteriores.
-ip[o]
A flag -ip ativa a Otimizaćão Interprocedural (Interprocedural Optimizations) do mesmo modo que uma funćão inlining, eliminacão de código morto, etc. Esta flag é recomendada, mas pode não funcionar com todos os pacotes. Se um pacote é encontrado que não compila com esta flag, adicione o pacote e o sinal de -ip para o arquivo packages.icc-cflags.
A flag -ip ativa Otimizaćão Interprocedural (Interprocedural Optimizations) multifile. Muitos pacotes não compilam com esta flag. Adicione um pacote para package.icc-cflags com CFLAGS incluindo -ipo para testar.
-gcc
A flag -gcc induz ao icc gerar código compativel com icc.
Ativar a flag -gcc é altamente recomendável, especialmente para bibliotecas.
Tirando defeitos do icc em processadores AMD
Icc gera código que detecta a marca do processador no qual está executando. Nos processadores Intel, o binário executará com instrućões SSE, enquanto que ele executará instrućões de nível 386 em processadores AMD sem levar em consideração a disponibilidade de grupos de instruções SSE.
Nota: Para produzir binários icc que executam códigos SSE em processadores AMD, use os patches encontrados aqui. Utilize estes patches para embutí-los no compilador. Ele não é livre, caso haja violaćão da EULA, então faća isso por sua conta e risco. Fora isso, você pode manualmente embutir (patch) todos os executavéis produzidos pelo icc. Para embutir rode o script Perl encontrado no site no /lib do seu diretório de sua instalaćão. Ele é usualamente /opt/intel/cce/your_version/lib.
Eu não consegui achar o bendito script Perl, se alguém achar avise-me para que possa adicionar aqui no wiki.
Problemas Comuns
Sistema não consegue iniciar devido a falta de bibliotecas icc
Icc está instalado em /opt. Se acontecer de /opt estar em uma partićão diferente que a partićão raiz, qualquer ferramentas de necessária para inicar o sistema não funcionarão antes de /opt ser montado. Nesta instância, se /bin/mount/ tinha sido compilado com icc, ele será incapaz de executar o qual evitar qualquer outra partição a partir da montagem.
A solução é copiar as bibliotecas do icc para o /lib.
Compilador C não consegue criar executáveis
Seu arquivo de licenća provavel não foi encontrado. </br>Tente executar:
# icc
Ele contará a você se este é o caso. Se não é, dobre a atenção em suas CFLAGS.
Não consegue abrir o arquivo fonte limits.h
Quando compilando programas os quais as fontes incluem o arquivo limites.h, você pode encontrar o seguinte erro:
/usr/include/gentoo-multilib/amd64/limits.h(125): catastrophic error: could not open source file "limits.h"
# include_next <limits.h>
^
Um conserto tinha sido feito, mas não tinha sido perfeitamente testado.
Adicione no arquivo /opt/intel/cce/10.1.017/bin/icc.cfg:
-idirafter /usr/include/linux
Existe sucesso quando foi experimentado quando compilando PHP com dev-lang/icc-10.1.017 ou superior com este conserto. Foi testado,com sucesso, com a versão 10.1.018 no Gentoo 64 quando foi editado/adaptado este how to.
Liking falha com QT
Icc versão 10.1.0.17 reordena argumentos para o linker, quebrando a compilaćão do Qt-4.3.3. Assim como um emxemplo a općão, ld, --dynamic-list,src/gui/QtGui.dynlist é dividido então aquele argumento para --dynamic-list não aparece imediatamente depois dele. Como um contorno, obtenha uma investigaćão, siga a execução do programa frase após frase usando strace -o log -F -f -s 4000 e reordene os argumentos para o ld e rode o comando manulamente.
/usr/lib32/libstdc++.so.5: no version information available
Com o emerge, ao compilar os programas eu estava obtendo este erro:Foi este erro que me motivou a traduzir e adaptar este tutorial. ;-)
/opt/intel/cce/10.1.018/bin/mcpcom: /usr/lib32/libstdc++.so.5: no version information available (required by /opt/intel/cce/10.1.018/bin/mcpcom)
Consegui resolvendo lendo um determinado tópico no bugs.gentoo.org.
Instale o pacote app-emulation/emul-linux-x86-compat. Depois remova arquivos /usr/lib32/libstdc++.so.5 e redirecione para /usr/lib32/libstdc++-v3/:</p>
- Antes estava assim:
libstdc++.so.5 -> libstdc++.so.5.0.7
- Agora deixe assim:
libstdc++.so.5 -> /usr/lib32/libstdc++-v3/libstdc++.so.5.0.7
Referências
- Intel(R) Compilers for Linux
- Utility to patch binaries generated by ICC to run well with AMD CPUs
- Support Thread on the Gentoo Forums
- Bugzilla Bug 259403 dev-lang/icc-10.X and dev-lang/ifc-10.X problems with libstdc++.so.5 after sys-libs/libstdc++-v3-3.3.6 recompile
Meu /etc/make.conf:
# These settings were set by the catalyst build script that automatically
# built this stage.
# Please consult /etc/make.conf.example for a more detailed example.
#GCC
CFLAGS="-march=native -O2"
CXXFLAGS="${CFLAGS}"
ICC_CFLAGS="-O2 -ip -xP -gcc"
ICCCXXFLAGS="${ICCCFLAGS}"
# WARNING: Changing your CHOST is not something that should be done lightly.
# Please consult http://www.gentoo.org/doc/en/change-chost.xml before changing.
CHOST="x86_64-pc-linux-gnu" # These are the USE flags that were used in addition to what is provided by the
# profile used for building.
USE="apache2 bzip2 canna ccache cdparanoia cdr cdrtools cgi colordiff colors \
compress crypt divx double-precision gd glibc-omitfp glitz icc ifc java \
java6 mpi mpi-threads php sdk single-precision suhosin symlink \
tcpwrapper threads xcb xpm xvid"
FEATURES="ccache fixpackages userfetch parallel-fetch"
MAKEOPTS="-j5"
CCACHE_DIR="/var/tmp/ccache"
CCACHE_SIZE="2G"
FETCHCOMMAND="/usr/bin/wget -t 5 -T 60 --no-passive-ftp -O \"\${DISTDIR}/\${FILE}\" \"\${URI}\""
RESUMECOMMAND="/usr/bin/wget -c -t 5 -T 60 --no-passive-ftp -O \"\${DISTDIR}/\${FILE}\" \"\${URI}\""
Fonte
- Fonte (Adaptado e editado): http://www.gentoo-wiki.info/HOWTO_ICC_and_Portage
- Autor: Duca
Comentários
+ Enviar Comentário