quinta-feira, junho 29, 2006

Dapper em um AMD64-X2 - Compiladores Intel

Hoje vou instalar os compiladores C e FORTRAN da Intel. Até o lançamento do gfortran, o ifc da Intel era o único compilador de FORTRAN 90 disponível para Linux. Para aqueles que acham que FORTRAN é linguagem morta, eu sugiro que vejam as comparações em Computer Language Shootout. FORTRAN só perde para C. Vejam FORTRAN contra Perl, por exemplo. É praticamente imbatível em cálculo numérico (nossos programas aqui rodam por dias e até meses).

Vamos ao que interessa: vá à pagina da Intel de compiladores linux e preencha os formulários para uso não comercial. Você vai receber uma licença por email e instruções para baixar os pacotes. Descompacte o arquivo tar.gz (l_cc_c_9.0.030.tar.gz, no meu caso). Vá para o diretório criado e rode o alien (apt-get install alien) para converter os rpms (i386 ou em64t, dependendo da sua arquitetura). Rode o comando abaixo, em apenas uma linha:


$ fakeroot alien -d intel-icce9-9.0-030.em64t.rpm intel-isubhe9-9.0-030.em64t.rpm intel-iidbe9-9.0-035.em64t.rpm intel-icce9-9.0-030.em64t.rpm


O processo demora um pouco.. Infelizmente o alien não faz todo o trabalho. Vamos ajeitar os pacotes:


$ mkdir tmp
$ dpkg-deb -e intel-icce9_9.0-31_amd64.deb tmp/DEBIAN
$ dpkg-deb -x intel-icce9_9.0-31_amd64.deb tmp


O -e extrai os arquivos de controle e o -x extrai os arquivos do pacote. O DINSTALL é para mudar o diretório de instalação (vai ficar no /opt/intel) . Procurando o INSTALLDIR que está erradamente setado nos scripts:

$ grep \<INSTALLDIR\> tmp/opt/intel/cce/9.0/bin/*


Vemos que a expressão aparece nos arquivos, icc, icpc, iccvars.sh e iccvars.csh. Vamos ao sed (pode usar o vi, se preferir)

$ sed -i 's/<INSTALLDIR>/\/opt\/intel\/cce\/9.0/g' tmp/opt/intel/cce/9.0/bin/icc
$ sed -i 's/<INSTALLDIR>/\/opt\/intel\/cce\/9.0/g' tmp/opt/intel/cce/9.0/bin/icc*sh
$ sed -i 's/<INSTALLDIR>/\/opt\/intel\/cce\/9.0/g' tmp/opt/intel/cce/9.0/bin/icpc

Quase lá. Agora você tem duas opções: ou faz um pacote para distribuir ou um só para você. A diferença é se você quer incluir a licença que recebeu no email no pacote, ou não. Se preferir distribuir basta

$ dpkg -b tmp icc_9.0.30_1.amd64.deb

ou outro nome que queira dar ao pacote -- eu mudei para icc, pois foi o nome que dei na versão anterior: poderia mudar o Provides no DEBIAN/control. Se preferir copie o arquivo de licença para tmp/opt/intel/cce/9.0/licenses, antes de reconstruir o pacote. O pacote com os headers também tem um bugzinho: tem o uninstall que existe no pacote do icc. Assim, vamos fazer

$ dpkg -e intel-isubhe9_9.0-31_amd64.deb tmp/DEBIAN
$ dpkg -x intel-isubhe9_9.0-31_amd64.deb tmp
$ rm tmp/opt/intel/cce/9.0/bin/uninstall.sh
$ dpkg -b tmp intel-isubhe9_9.0-31_amd64.deb


Instalando os pacotes

$ sudo dpkg -i icc_9.0.30_1.amd64.deb
$ sudo dpkg -i intel-iidbe9_9.0-36_amd64.deb
$ sudo dpkg -i intel-isubhe9_9.0-31_amd64.deb


O procedimento para a criação do pacote FORTRAN é idêntico e fica como exercício para o leitor ;)
Para executar o compilador é necessário atualizar as variáveis de ambiente, rodando

$ source /opt/intel/cce/9.0/bin/iccvars.sh

Esta linha pode ser adicionada ao seu .bashrc.

Problemas:

icc: error: could not find linux directory based on g++

Solução: export LC_ALL=C

Como o Renato apontou nos comentários, o g++ é dependência dos pacotes, embora não relatado pelo alien. Se quiser fazer o serviço bem limpo, inclua build-essential e g++ no Depends: do arquivo tmp/DEBIAN/control antes de reconstruir o pacote.

19 Comentários:

Às 02 julho, 2006 10:14 , Anonymous Toninho disse...

Na verdade há outro compilador fortran 90 pra linux, ainda em desenvolvimento mas plenamente funcional:

http://www.g95.org

Já compilei várias aplicações com ele, inclusive o MPICH 1.2.7, e funciona muito bem.

 
Às 02 julho, 2006 10:32 , Blogger Thadeu Penna disse...

Sim, já instalei este nos 32 bits e em um Ubuntu Hoary. O que me deixou meio desencantado é que vi uma comparação de performance dele com o gfortran,e o g95 ficou significativamente atrás:

http://www.polyhedron.com/pb05/linux/f90bench_p4.html

 
Às 02 julho, 2006 11:45 , Anonymous Toninho disse...

Entao eu tenho que refazer os meus benchmarks. Na ultima vez que eu comparei o gfortran com o g95, usando programas meus, o g95 ganhou com boa margem.

 
Às 05 julho, 2006 23:04 , Anonymous Renato disse...

Olá Thadeu. Segui as intruções para instalar o ifort mas algo não funcionou, pois obtenho isto quando tento executar o ifort:

renato@snoopy:~$ ifort -what
bash: ifort: comando não encontrado

Você poderia me dar uma idéia do que posso fazer para deixá-lo funcionando?

 
Às 05 julho, 2006 23:12 , Blogger Thadeu Penna disse...

Oi Renato

você rodou o
"source opt/intel/ifc/9.0/bin/ifcvars.sh "
?

Este script atualiza as variáveis de ambiente para o ifort.

 
Às 06 julho, 2006 13:27 , Anonymous Renato disse...

Rodei e coloquei no .bashrc. Ocorreu-me o seguinte: ao mandar executar diretamente o ifort ele traz como resultado que INSTALLDIR está errado, ou coisa que o valha (não estou no computador agora). Talvez eu tenha cometido algum erro ao digitar os comandos com o sed. A propósito, qual a função daquele 'g', no final da linha de comando?
Como devo proceder para fazer a troca manual? É apenas colocar o caminho da instalação no lugar da variável INSTALLDIR?
Desculpe-me pelo número de perguntas, mas apesar de ser usuério linux a bom tempo, sou novato no debian/ubuntu.

 
Às 06 julho, 2006 13:34 , Blogger Thadeu Penna disse...

O mais provável é que tenha um erro de digitação: o ideal seria o copy-and-paste do sed. Talvez o blog tenh quebrado as linhas.

O g no final do sed é para trocar todas as ocorrências, se você esqueceu dele, o sed só trocará a primeira ocorrência. Edite os arquivos e veja se algum INSTALLDIR permaneceu no arquivo.

QQ. coisa é só comentar, não se acanhe. Para isto que fizemos o blog: servir para a posteridade :)

[]s

 
Às 06 julho, 2006 21:32 , Anonymous Renato disse...

Refiz todo o processo. A variável INSTALLDIR foi modificada, criei o .deb e instalei. Executei o source e obtenho a mesma resposta: ifort comando não encontrado.
Não funciona o man também.

Alguma sugestão?

 
Às 06 julho, 2006 21:55 , Blogger Thadeu Penna disse...

Oi Renato,

acho que tem um bug aí :)
Me manda a saída dos comandos
echo $PATH
echo $LD_LIBRARY_PATH
echo $MAN_PATH

depois que você roda o

source /opt/intel/fce/9.0/bin/ifortvars.sh

Se aparecerem < ou > na saída dos comandos então tem que consertar o ifc, ifort e ifortvars.sh.

Vamos apenas confirmar se é isto.

[]s

 
Às 06 julho, 2006 22:06 , Blogger Thadeu Penna disse...

Só para conferir
$ source /opt/intel/cce/9.0/bin/iccvars.sh
(substitua pelo fortran)
$ echo $PATH
$ echo $LD_LIBRARY_PATH
$ echo $MANPATH

 
Às 06 julho, 2006 22:14 , Anonymous Renato disse...

renato@snoopy:~$ echo $PATH
=/opt/intel/fc/9.0=/bin:=/opt/intel/fc/9.0=/bin:=INSTALLDIR=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games
renato@snoopy:~$ echo $LD_LIBRARY_PATH
=/opt/intel/fc/9.0=/lib:=/opt/intel/fc/9.0=/lib:=INSTALLDIR=/lib
renato@snoopy:~$ echo $MANPATH
=/opt/intel/fc/9.0=/man:=/opt/intel/fc/9.0=/man:=INSTALLDIR=/man:/usr/local/man:/usr/local/share/man:/usr/share/man
renato@snoopy:~$

substitui o < e o > por =, senão não passa no blog. Acho que taí o problema.

 
Às 06 julho, 2006 22:19 , Blogger Thadeu Penna disse...

Sim é isto aí. Edite então os arquivos ifc, ifort e ifortvars.sh no /opt/intel/fce/9.0/bin/ e tudo deve funcionar. Obrigado por achar o bug :)
Vou acertar no blog...

 
Às 06 julho, 2006 22:27 , Anonymous Renato disse...

Thadeu, estes arquivos não tem nenhuma ocorrência do INSTALLDIR. Devem ser outros, ou um dos executáveis, o que seria pior.

 
Às 06 julho, 2006 22:32 , Blogger Thadeu Penna disse...

Não é o INSTALLDIR, são as sinais < e > . Por exemplo, no /opt/intel/fce/9.0/bin/ifort você deve ter
#!/bin/sh
if [ -z "$INTEL_LICENSE_FILE" ]
then
INTEL_LICENSE_FILE="< /opt/intel/fce/9.0 >/licenses
certo ?
Remova todos os < e > que encontrar naqueles arquivos que citei ;)

[]s

 
Às 06 julho, 2006 22:43 , Anonymous Renato disse...

Bingo! Caramba, e eu não vi que era justamente o < e >!
Agora está ok! Muito obrigado, Thadeu.

 
Às 06 julho, 2006 22:50 , Anonymous Renato disse...

Deu zebra. Testei o help e estava ok. Mas ao compilar um programa obtive:

renato@snoopy:~/programas$ ifort -o teste.out int_sin.f90
ifort: error: could not find directory in which g++ resides

 
Às 06 julho, 2006 23:06 , Blogger Thadeu Penna disse...

este é fácil:
sudo aptitude install g++

O alien não capturou as dependências corretamente. Vou corrigir no post.

 
Às 06 julho, 2006 23:16 , Anonymous Renato disse...

Agora sim! Eu fui pelo sinaptic e ele não encontrou o g++. O gcc estava instalado e quando dei um apt-cache search g++ apareceu uns 200 arquivos!
O g++ não seria uma dependência do gcc?

Parabéns, o site ficou com um aspecto melhor.

Abraços,

Renato

 
Às 06 julho, 2006 23:42 , Blogger Thadeu Penna disse...

Obrigado por ter apontado os erros. O g++ é o compilador C++. O gcc é uma das dependências dele, mas não o contrário.

Continue visitando o site e colaborando. O Toninho é que o especialista em FORTRAN, aqui do grupo...

 

Postar um comentário

Assinar Postar comentários [Atom]

Links para esta postagem:

Criar um link

<< Página inicial