FLAGS para “compilação segura” com GCC 3.X

Janeiro 25, 2007 at 2:15 pm | In linux, nerdices, tecnologia |

 

Muita gente ouve falar sobre recompilar algum software otimizado para a sua CPU, mas não faz a mínima idéia do que se trata. Nesse artigo explicarei um pouco sobre como funciona a compilação usando” FLAGS” para otimizar o software.

Primeiro vamos aos pré-requisitos:

 

Ter o kernel otimizado para a arquitetura do seu processador e saber quais são as FLAGs a utilizar.

 

Para saber a versão de GCC, digite:

$ gcc –version

 

Para saber informação sobre o processador:

$ cat /proc/cpuinfo

Algumas informações sobre as FLAGs:

Quando vc usa, por exemplo a FLAG “-march=athlon-xp -O3 -pipe -fomit-frame-pointer”

Você está informando ao compilador que o seu processador é um athlon-XP (-march=athlon-xp), que vc está querendo otimização máxima (-03), e que o uso de frame pointer não é necessário (-fomit-frame-pointer)

-O1 otimização leve

-O2 otimização segura

-O3 otimização extrema

PS: muitos softwares são compilados com a opção -02 pois é uma otimização segura.

Para mais informações sobre as funções de otimização veja o site

http://docs.freebsd.org/info//gcc/gcc.info.Optimize_Options.html

Para maiores informações sobre outras opções recomendo a leitura do manual do GCC:

$ man gcc

Escolha as FLAGs para o seu processador segundo a lista abaixo:

 

i386 (Intel)

CHOST=”i386-pc-linux-gnu”
CFLAGS=”-march=i386 -O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-march=i386 -O3 -pipe -fomit-frame-pointer”

i486 (Intel)

CHOST=”i486-pc-linux-gnu”
CFLAGS=”-march=i486 -O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-march=i486 -O3 -pipe -fomit-frame-pointer”

Pentium 1 (Intel)

CHOST=”i586-pc-linux-gnu”
CFLAGS=”-march=pentium -O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-march=pentium -O3 -pipe -fomit-frame-pointer”

Pentium MMX (Intel)

CHOST=”i586-pc-linux-gnu”
CFLAGS=”-march=pentium-mmx -O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-march=pentium-mmx -O3 -pipe -fomit-frame-pointer”

Pentium PRO (Intel)

CHOST=”i686-pc-linux-gnu”
CFLAGS=”-march=pentiumpro -O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-march=pentiumpro -O3 -pipe -fomit-frame-pointer”

Pentium II (Intel)

CHOST=”i686-pc-linux-gnu”
CFLAGS=”-march=pentium2 -O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-march=pentium2 -O3 -pipe -fomit-frame-pointer”

Celeron (Mendocino), aka Celeron1 (Intel)

CHOST=”i686-pc-linux-gnu”
CFLAGS=”-march=pentium2 -O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-march=pentium2 -O3 -pipe -fomit-frame-pointer”

Pentium III (Intel)

CHOST=”i686-pc-linux-gnu”
CFLAGS=”-march=pentium3 -O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-march=pentium3 -O3 -pipe -fomit-frame-pointer”

Celeron (Coppermine) aka Celeron2 (Intel)

CHOST=”i686-pc-linux-gnu”
CFLAGS=”-march=pentium3 -O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-march=pentium3 -O3 -pipe -fomit-frame-pointer”

Celeron (Willamette?) (Intel)

CHOST=”i686-pc-linux-gnu”
CFLAGS=”-march=pentium4 -O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-march=pentium4 -O3 -pipe -fomit-frame-pointer”

Pentium 4 (Intel)

CHOST=”i686-pc-linux-gnu”
CFLAGS=”-march=pentium4 -O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-march=pentium4 -O3 -pipe -fomit-frame-pointer”

Eden C3/Ezra (Via)

CHOST=”i586-pc-linux-gnu”
CFLAGS=”-march=i586 -m3dnow -O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-march=i586 -m3dnow -O3 -pipe -fomit-frame-pointer”

nota: o ezra não tem instruções especiais, é basicamente parecido com o K6-3… (p2 com 3dnow)

K6 (AMD)

CHOST=”i586-pc-linux-gnu”
CFLAGS=”-march=k6 -O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-march=k6 -O3 -pipe -fomit-frame-pointer”

K6-2 (AMD)

CHOST=”i586-pc-linux-gnu”
CFLAGS=”-march=k6-2 -O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-march=k6-2 -O3 -pipe -fomit-frame-pointer”

K6-3 (AMD)

CHOST=”i586-pc-linux-gnu”
CFLAGS=”-march=k6-3 -O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-march=k6-3 -O3 -pipe -fomit-frame-pointer”

Athlon (AMD)

CHOST=”i686-pc-linux-gnu”
CFLAGS=”-march=athlon -O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-march=athlon -O3 -pipe -fomit-frame-pointer”

Athlon-tbird, aka K7 (AMD)

CHOST=”i686-pc-linux-gnu”
CFLAGS=”-march=athlon-tbird -O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-march=athlon-tbird -O3 -pipe -fomit-frame-pointer”

Athlon-tbird XP (AMD)

CHOST=”i686-pc-linux-gnu”
CFLAGS=”-march=athlon-xp -O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-march=athlon-xp -O3 -pipe -fomit-frame-pointer”

Athlon 4 (AMD)

CHOST=”i686-pc-linux-gnu”
CFLAGS=”-march=athlon-4 -O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-march=athlon-4 -O3 -pipe -fomit-frame-pointer”

Athlon XP (AMD)

CHOST=”i686-pc-linux-gnu”
CFLAGS=”-march=athlon-xp -O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-march=athlon-xp -O3 -pipe -fomit-frame-pointer”

Athlon MP (AMD)

CHOST=”i686-pc-linux-gnu”
CFLAGS=”-march=athlon-mp -O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-march=athlon-mp -O3 -pipe -fomit-frame-pointer”

603 (PowerPC)

CHOST=”powerpc-unknown-linux-gnu”
CFLAGS=”-O3 -pipe
CXXFLAGS=”-O3 -pipe

603e (PowerPC)

CHOST=”powerpc-unknown-linux-gnu”
CFLAGS=”-O3 -pipe
CXXFLAGS=”-O3 -pipe

604 (PowerPC)

CHOST=”powerpc-unknown-linux-gnu”
CFLAGS=”-O3 -pipe
CXXFLAGS=”-O3 -pipe

604e (PowerPC)

CHOST=”powerpc-unknown-linux-gnu”
CFLAGS=”-O3 -pipe
CXXFLAGS=”-O3 -pipe

750 conhecidos por G3 (PowerPC)

CHOST=”powerpc-unknown-linux-gnu”
CFLAGS=”-mcpu=750 -O3 -pipe -mpowerpc-gfxopt”
CXXFLAGS=”-mcpu=750 -O3 -pipe -mpowerpc-gfxopt”

Nota: não usar -march=

7400, conhecidos por G4 (PowerPC)

CHOST=”powerpc-unknown-linux-gnu”
CFLAGS=”-mcpu=7400 -O2 -pipe -maltivec -mabi=altivec -mpowerpc-gfxopt”
CXXFLAGS=”-mcpu=7400 -O2 -pipe -maltivec -mabi=altivec -mpowerpc-gfxopt -maltivec -mabi=altivec -mpowerpc-gfxopt”

Nota: do not use -march= ; -O3 is unstable on G4

7450, conhecidos por G4 na segunda geração (PowerPC)

CHOST=”powerpc-unknown-linux-gnu”
CFLAGS=”-mcpu=7450 -O2 -pipe -maltivec -mabi=altivec -mpowerpc-gfxopt”
CXXFLAGS=”-mcpu=7450 -O2 -pipe -maltivec -mabi=altivec -mpowerpc-gfxopt”

Nota: não usar -march= ; -O3 é instável nos G4

PowerPC (Se desconheces a arquitectura)
CHOST=”powerpc-unknown-linux-gnu”
CFLAGS=”-O3 -pipe -mpowerpc-gfxopt”
CXXFLAGS=”-O3 -pipe -mpowerpc-gfxopt”

Sparc

CHOST=”sparc-unknown-linux-gnu”
CFLAGS=”-O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-O3 -pipe -fomit-frame-pointer”

Sparc 64

CHOST=”sparc-unknown-linux-gnu”
CFLAGS=”-O3 -pipe -fomit-frame-pointer”
CXXFLAGS=”-O3 -pipe -fomit-frame-pointer”

FLAGS para “compilação optimizada” com GCC 3.X

Pentium III (Intel)

CFLAGS=”-march=pentium3 -O3 -pipe -fomit-frame-pointer -fforce-addr -falign-functions=4 -fprefetch-loop-arrays”
CXXFLAGS=”${CFLAGS}”

nota: optimizações -mmmx e -msse estão implícitas a -march=pentium3

Athlon (AMD)

CFLAGS=”-march=athlon -O3 -pipe -fomit-frame-pointer -ffast-math -funroll-loops -fforce-addr -falign-functions=4″
CXXFLAGS=”${CFLAGS}”

nota: optimizações -m3dnow e -mmmx estão implícitas a -march=athlon

Athlon-tbird, aka K7 (AMD)

CFLAGS=”-march=athlon-tbird -O3 -pipe -fforce-addr -fomit-frame-pointer -funroll-loops -falign-functions=4 -maccumulate-outgoing-args”
CXXFLAGS=”${CFLAGS}”

nota: optimizações -m3dnow e -mmmx estão implicitas a -march=athlon-tbird

Athlon XP 2000+

Há quem tenha reportado que tem um sistema estável num Athlon XP 2000+ com:
CFLAGS=”-march=athlon-xp -m3dnow -msse -mfpmath=sse -mmmx -O3 -pipe -fforce-addr -fomit-frame-pointer -funroll-loops -frerun-cse-after-loop -frerun-loop-opt -falign-functions=4 -maccumulate-outgoing-args -ffast-math -fprefetch-loop-arrays”
CXXFLAGS=”${CFLAGS}”

 

 

Compilar um Software usando FLAGs é muito simples, basta escolher a FLAG e usá-la na compilação.

 

Baixe o source do software e descompacte-o:

 

Para source em tar.gz:

tar -xzvf source.tar.gz

 

Para source em tar.bz2:

tar -xjvf source.tar.bz2

 

Entre no diretório descompactado, leia os READMEs e rode o ./configure com a FLAG:

 

PS: eu tenho um processador AthlonXP 2600+

 

CHOST=”i686-pc-linux-gnu” \

CFLAGS=”-march=athlon-xp -O3 -pipe -fomit-frame-pointer” \

CXXFLAGS=”-march=athlon-xp -O3 -pipe -fomit-frame-pointer” \

./configure

 

 

depois rode o $ make && make install

 

Pronto! você tem o software compilado e instalado para o seu pc.

 

Caso utilize a distribuição Slackware Linux siga as instruções abaixo para compilar o software otimizado e empacotar o software em um TGZ.

Crie um arquivo config.list, contendo todas as opções de configuração do software:
$ ./configure –help > config.list
$ vi config.list

Escreva o seu arquivo de configuração seguindo o exemplo:

CHOST=”i686-pc-linux-gnu” \
CFLAGS=”-march=athlon-xp -O3 -pipe -fomit-frame-pointer” \
CXXFLAGS=”-march=athlon-xp -O3 -pipe -fomit-frame-pointer” \
./configure \
–prefix=/usr \
–exec-prefix=/usr \

Agora, execute a configuração do código-fonte:
$ sh config.list

Agora, é hora de compilar. Para isso execute o comando:
$ make


Crie um diretório temporário para armazenar os arquivos que serão usados para a criação do pacote do Slackware:

$ mkdir /tmp/chemonz-slackware

Agora, execute a instalação para o diretório temporário:
$ su root
# DESTDIR=/tmp/chemonz-slackware make install
# cd /tmp/chemonz-slackware

Criando o script de instalação

Feito isso, crie o diretório install, onde serão colocados os arquivos de instalação
do pacote:

# mkdir install

Agora, crie e edite o arquivo doinst.sh, dentro do diretório install, que conterá os procedimentos a serem executados após a instalação do pacote:
# vi install/doinst.sh (substitua “vi” pelo editor de sua preferência)

Insira o seguinte conteúdo:
/sbin/ldconfig

Salve o arquivo e feche-o. Esse script será executado após a instalação do pacote.

Agora, crie e edite o arquivo slack-desc, que conterá as informações sobre o pacote, exibidas no momento da instalação:
# vi install/slack-desc

Insira o seguinte conteúdo:

chemonz: [nome do software]
chemonz:
chemonz: [descrição do software]
chemonz:
chemonz: [site, email ou qualquer informação sobre o desenvolvedor do software]
chemonz:

Salve o arquivo e feche-o, e está feito.

Agora, basta criar o pacote com o comando makepkg. Cuidado com o nome do pacote. Ele deve ser formado da seguinte forma:

# makepkg -c n -l n [nome]-[versão]-[arquitetura]-[revisão].tgz

Pronto!!! Você acaba de criar um pacote para o Slackware de um software otimizado para o seu processador.

Agora basta instalar o pacote ou atualizá-lo:

#installpkg pacote.tgz

#upgradepkg –install-new pacote.tgz

Qualquer dúvida mande um email para chemonz@bestlinux.com.br

Abraços

10 Comentários »

Alimentação RSS de comentários a este artigo. URI do TrackBack

  1. ae mago…

    fino o artigo XD

    issae

    Comentário de tudela(cast) — Janeiro 25, 2007 #

  2. pots, esse post ficou show de bola, realmente muito util, alias esta cada dia mais dificil achar textos realmente uteis na internet que infelizmente a cada dia tem mais lixo, muito bom brow !!!

    Comentário de B3t0_cyber_punk — Janeiro 25, 2007 #

  3. Não é atoa que te chamam de mago
    Tudo oq vc faz faz com perfeição…
    Que D’us continue te dando sabedoria
    Fuiiiiiiiiiiiiiiiiii

    Comentário de Almeidinha — Janeiro 25, 2007 #

  4. boa chemonz.
    legal publicar isso, eh um assunto que muita gente tem duvida e ver uma explicacao pratica desse jeito eh fantastico!
    e de quebra, ainda ensinou a criar pacutin TGZ!

    Comentário de tzbishop2k — Janeiro 26, 2007 #

  5. Cara, demais esse artigo.
    Mas ficou uma dúvida:
    Meu processador é um Celeron D, devo usar as flags do Willamette ou as do Pentium 4?

    Fora isso, tudo foi muito bem explicado.
    Parabéns!!!

    Comentário de Gilson de Elt — Março 17, 2007 #

  6. Gilson, vc deve usar as flags do williamete:
    Celeron (Willamette?) (Intel)

    CHOST=”i686-pc-linux-gnu”
    CFLAGS=”-march=pentium4 -O3 -pipe -fomit-frame-pointer”
    CXXFLAGS=”-march=pentium4 -O3 -pipe -fomit-frame-pointer”

    Comentário de tzbishop2k — Março 17, 2007 #

  7. o meu é um AMD Sempron 3000+ 2GHz, 512KB de Cache L2.
    até onde sei, o meu é o Sempron Barton.

    qual eu deveria usar?

    Comentário de Eduardo — Abril 8, 2007 #

  8. eduardo, tente usar essas…. se der pau use uma de sempron. Mas acredito q vai dar de boa.

    CHOST=”i686-pc-linux-gnu”
    CFLAGS=”-march=athlon-xp -O2 -pipe -fomit-frame-pointer”
    CXXFLAGS=”-march=athlon-xp -O2 -pipe -fomit-frame-pointer”

    Comentário de ChemonZ — Abril 8, 2007 #

  9. Grande mago, salve sua sabedoria!!!

    adorei o artigo, é de uma “mestria” tremenda!
    abraços e continue assim, ensinando aos simples mortais

    Comentário de Denis — Maio 22, 2007 #

  10. Porfavor, gostaria de saber qual os flags para o meu intem celeron d.
    model name : Intel(R) Celeron(R) D CPU 3.20GHz
    Ele é de 64bit.
    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 nx lm constant_tsc pni monitor ds_cpl cid cx16 xtpr lahf_lm

    Obrigado.

    Comentário de Leonardo Vilar — Novembro 25, 2007 #

Deixe um comentário

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Blog no WordPress.com. | Theme: Pool by Borja Fernandez.
Entries and comments feeds.