Instalando o Compilador de Intel Fortran 90 em FreeBSD.

Autor: Alberto
Data: 12/06/02
Version: 1.0


Introduccion

Normalmente, no mundo do Software Livre existem compiladores para quase todos as linguagens que queiramos. Em meu caso para todos as linguagens que preciso, exceto para Fortran 90.

O Fortran em general é uma linguagem de uso muito limitado, somente é util para calculo cientifico, mas para isto é uma linguagem excelente: é singelo de usar, muuuy rapido (em minha experiência ao menos como C), e tem muchisimas librerias para calculo numerico, etc...

Para alguns de nós é uma necessidade ter um compilador de Fotran em nossa maquina. No mundo do Software livre temos g77 como compilador de Fortran 77, e para ser sinceros, em meu opinion é bastante mau. Há um projeto chamado g95 para fazer um compilador livre de fortran 90-95, mas mesmo esta em desenvolvimento. Que eu saiba não há ningun compilador de Fortran 90 livre (ainda que me agradaria muchisimo estar equivocado, asi que se alguém sabe de algum decidmelo).

Sem ser nem muito menos livre, temos o compilador gratuito (algo é algo) de Intel para Linux. O objeto deste documento é mostrar como podeis fazer funcionar este compilador com vosso FreeBSD e a emulacion Linux.

Quanto ao compilador em se, tenho certa experiência com o, e posso dizer que é uma maravilha. Tem optimizaciones para todos os pentium, (suporte para SSE, SSE2, etc...), e vos funcionasse em qualquer maquina (com Athlon XP/MP, podeis usar quase todas as optimizaciones, com os anteriores micros de AMD não podreis usar SSE).

Bueno, vamos já ao grão...

Antes de começar

Há certas ferramentas que precisaremos para instalar o compilador, e que estan nos ports: rpm2cpio e a emulacion para Linux.

Se poneis rpm2cpio e não encontra o comando, instalai-o dos ports (por exemplo com portinstall rpm2cpio, ou cd /usr/ports/archivers/rpm2cpio && make install). Para assegurar-vos que teneis a emulacion para linux correndo, executai linux como root. Tambien assegurai-vos que existe o diretório /usr/compat/linux/opt/

Quanto à emulacion para linux necesitais o port linux_base-7 (não vos valdra linux_base-6), e o linux_devtools-7. podeis instalá-los como mas vos goste.

Uma vez instalados esses ports, precisámos fazer uma mudança, e é fazer um link simbolico, para que logo não nos de problemas ao executar os proramas que compilámos:

root@pc # ln -s /usr/compat/linux/lib/ld-2.2.2.so /usr/compat/linux/usr/lib/libc.so.1.

E com isto já temos todo preparado para instalar o compilador. Isto ultimo é um pouco chapuza, asi que se admitem outros arreglos.

Conseguindo o compilador

O primeiro passo que precisardes seguir é conseguir o compilador de Intel. Se não quereis apokinar tendreis que vos baixar a version não comercial e sem suporte do compilador. Debeis rechear um formulário, e é necessário que o e-mail seja correto, já que alli vos mandassem o fichero com a licença imprescindível para que corra bem o compilador.

Seguindo as instruções da web não deberia custar-vos muito ter um .tar.bz2 de uns 50M com o compilador em nosso disco duro.

Instalando o compilador

Agora vos ides a um diretório temporal e descomprimis o .tar.bz2 (OLHO! normalmente FreeBSD tem a particion /tmp pequena ou no mesmo lugar que a / pode ser que não vos caiba todo alli. Se é asi elegei um diretório temporal em outra particion ej: /usr/fortran):

root@pc # mkdir /tmp/fortran
root@pc # cd /tmp/fortran
root@pc # bunzip2 -c <path ao fichero>/intel-fortran-6.0.tar.bz2 | tar -xvf -

Despues disto deberias dos seguintes ficheros em tmp //fortran :

root@pc # ls /tmp/fortran
flicense                     intel-eldb6-6.0-191.ia64.rpm lgpltext
install                      intel-ifc6-6.0-140.i386.rpm
intel-efc6-6.0-140.ia64.rpm  intel-ildb6-6.0-191.i386.rpm
root@pc #

Destes ficheros a nós só nos interessam os que acabam em i 386.rpm, a não ser que tengais um Itanium por ahi ;). Agora temos que descomprimir os 2 .rpm que precisámos. Eu instalei o compilador em usr //compat/linux/opt/intel. Para isso fazemos:

root@pc # cd /usr/compat/linux/
root@pc # rpm2cpio /tmp/fortran/intel-ifc6-6.0-140.i386.rpm | cpio -i 
root@pc # rpm2cpio /tmp/fortran/intel-ildb6-6.0-191.i386.rpm | cpio -i

Com estes comandos deberiamos de ter mas ou menos o seguinte arbol de diretórios:

root@pc # ls /usr/compat/linux/opt/intel
compiler60 licenses
root@pc # ls /usr/compat/linux/opt/intel/compiler60
docs ia32 man
root@pc # ls /usr/compat/linux/opt/intel/compiler60/ia32
bin     include lib
root@pc #

Mas ou menos esta claro. Em usr //compat/linux/opt/intel/compiler60/ia32 temos os binários do compilador, as librerias, etc... e tambien temos os doc, a man page, que podeis copiar a usr //man/man1, etc...

Agora falta cofigurar o compilador.

Configurando o compilador

Bueno, já temos instalado o compilador, mas não vai funcionar-nos sem que lhe façamos uns quantos mudanças. Para começar devemos de saber que o compilador se chama ifc, e em teoria executando /usr/compat/linux/opt/intel/compiler60/ia32/bin/ifc deberia de compilar, mas não é asi porque esse fichero é um script que põe umas quantas variáveis de meio e executa ifcbin que é o verdadeiro compilador.

Desta forma a este fichero devemos editá-lo e mudar em todos os lugares onde ponha <INSTALLDIR> por usr //compat/linux/opt/intel, devemos de apagar a opcion -a "loquesea" ao exec nas ultimas lineas e devemos de tirar-lhe a opcion -n ao export de forma que fique algo como isto (simplesmente copiai este em seu lugar):

#!/bin/sh

INTEL_LICENSE_FILE=/usr/compat/linux/opt/intel/licenses;
export INTEL_LICENSE_FILE;

if %[ -z LD_LIBRARY_PATH ]
then 
 LD_LIBRARY_PATH=/usr/compat/linux/opt/intel/compiler60/ia32/lib;
else
 LD_LIBRARY_PATH=/usr/compat/linux/opt/intel/compiler60/ia32/lib:$LD_LIBRARY_PATH
fi
export LD_LIBRARY_PATH;

if %[ -z PATH ]
then
 PATH=/usr/compat/linux/opt/intel/compiler60/ia32/bin;
else
 PATH=/usr/compat/linux/opt/intel/compiler60/ia32/bin:$PATH;
fi
export PATH;

export IA32ROOT; unset IA32ROOT;

if %[ $# != 0 ]
then
 exec /usr/compat/linux/opt/intel/compiler60/ia32/bin/ifcbin "$@";
else
 exec /usr/compat/linux/opt/intel/compiler60/ia32/bin/ifcbin;
fi

agora fazemos um link simbolico:

root@pc # ln -s /usr/compat/linux/opt/intel/compiler60/ia32/bin/ifc /usr/local/bin/ifc

Agora quase estamos, só precisámos pôr o fichero de licença que nos mandaram de Intel no diretório /usr/compat/linux/opt/intel/licenses/

root@pc # cp <fichero de  licença> /usr/compat/llinux/opt/intel/licenses

Compilando nosso primeiro programa

Se seguimos bem os passos até aqui, já deberiamos de ser capazes de compilar qualquer programa fortran. Para isso pegamos um programa fortran 90 ou 77 qualquer e executámos:

root@pc # ifc -w90 -c -ou prova.ou <programa.f(90)>

Se todo vai bem deberia de compilá-lo e gerar um fichero prova.ou. Se isto falla repassai bem os passos anteriores, ou mandai-me um mail perguntando.

Linkando o prorama

Se algun impaciente, despues da seccion anterior tentou linkar o programa para produzir um ejecutable, invés de um objeto, se habra dado conta de que lhe saíram 10000 erros ao linkar.

Isto se deve que devemos usar o linkador de linux, e não o de FreeBSD para linkar o programa (Não crio que leia isto nunca, mas graças a Rahul Siddharthan por sua ajuda, sem o jamas habria descoberto isto só). Ademas devemos passar-lhe como parametros as librerias de Fortran 90 que vêm com o compilador de Intel . Para isto fiz um script que o faz todo (baseado num que me envio Rahul Siddharthan, mas que a meu não me funcionava):

#!/bin/sh
#
# Script que linka fortran 90 usando Linux ld.

/compat/linux/usr/bin/ld \
-L/compat/linux/opt/intel/compiler60/ia32//lib/ -lCEPCF90 -lF90 \
-rpath /compat/linux/opt/intel/compiler60//ia32/lib/ \
-lIEPCF90 -lPEPCF90 -lPOSF90 -lcprts -lcxaa -limf -lintrins -lirc \
-e main "$@"

# Agora há que procurar o fichero de  saída.
OPT="-ou"
while %[ "$1" != "$OPT" ]
do
   shift
done
 
brandelf -t Linux $2.

Ponde este script em usr //local/bin com o nome que querais (eu elegi ifcld). Agora podeis linkar o anterior .ou

root@pc # ifcld prova.ou -ou prova.out
root@pc # ./prova.out

E deberia de executar-vos o programa sem problemas. Com isto já teneis o compilador pronto para usá-lo quando querais.

Conclusões

Pelo que a meu respecta, tenho um compilador muito bom em meu FreeBSD da linguagem que por minha profesion mas uso. As comparativas de velocidade são assombrosas, ainda que muito dependentes do codigo, mas em algumas ocasiões (programas que ocupem muita memória 100M ou mas), chega a dividir por 2 ou mas o tempo que demora o f77 que vem com FreeBSD. Ademas tem suporte perfeito para Fortran 90. Comparado com outros compiladores bons, é practicamente igual de rapido que o compilador de Digital (que em meu opinion faz os melhores compiladores de Fortran 90).

FreeBSD é um pouco mas lento executando o codigo que Linux com este compilador, quizas devido à emulacion, mas realmente muito pouco (menos de um 3-5%), com o que não é nada sério.

Penso que o fato de que este compilador funcione em FreeBSD com a emulacion Linux, é importante à hora de pensar um sistema operativo para uma estacion de trabalho ou inclusive um Beowulf. Nestes sistemas um compilador de Fortran 90 é quase imprescindível.

Despedida

Pois nada mas, despeço-me, dizendo que se a alguém se lhe ocorre alguma forma melhor de fazer algo, ou algun erro, que mo comente, e o incluire em futuras versões deste documento.

Tambien me gustaria saber se estes passos, mas ou menos, podem-se aplicar a outro BSD. Em princípio, se tambien tem emulacion para Linux, e um port com as glibc-2.2 não deberia de ser muito complicado. Se alguém sabe um pouco de isto, que mo diga, para poder incluí-lo no documento.

Em realidade isto esta longe de ser estandar, asi que provavelmente muitos script se possam melhorar, ou inclusive fazer que as coisas fncionen mas facilmente. Se necesitais ajuda para algo, não dudeis em escrever-me

Tambien tenho que pedir perdon pelas faltas de ortografia, etc... Se que não pus nem um acento, deixo-o para as futuras versões.


Alberto <[email protected]>
Hosted by www.Geocities.ws

1