Ver Feed RSS

Olhos que ardem...

Tutorial - Gentoo - Portage compilando pacotes com o compilador C/C++ da Intel - ICC

Avalie este Post de Blog

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

Foi este erro que me motivou a traduzir e adaptar este tutorial. ;-)



Com o emerge, ao compilar os programas eu estava obtendo este erro:


/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



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


Atualizado 14-05-2009 em 21:34 por Duca

Categorias
Pessoal

Comentários

  1. Avatar de Duca
    Resolvi traduzir e adaptar o tutorial ao erros que eu tive aqui no trabalho.
    Como não encontrei referências em português, resolvi traduzir e postar aqui no Under.
    Não encontrei o patch para os processadores AMD, se alguem achar por favor avise-me.

    Fast and furious (Drift, Drift, Drift)

    Ab, Duca.
    Atualizado 08-05-2009 em 18:33 por Duca
  2. Avatar de Duca
    Dêem uma olhadinha aqui para mais informações:
    alphagemini: March 2008

+ Enviar Comentário