Compilando LAPACK e BLAS com ifort

Este tutorial é muito simples e mostra como compilar as bibliotecas de Álgebra Linear BLAS e LAPACK do netlib (http://www.netlib.org) utilizando os compiladores C e fortran da Intel (icc e ifort).

Tanto para Linux (Ubuntu 11.04) quanto no OS X (Mountain Lion), os procedimentos são os mesmos:

$ wget -c http://www.netlib.org/lapack/lapack-3.4.2.tgz
$ tar -zxvf lapack-3.4.2.tgz
$ cd lapack-3.4.2
$ cp INSTALL/make.inc.ifort ./make.inc
$ make lapacklib
$ make blaslib

Como resultado da compilação, duas bibliotecas (libs) deverão ser criadas:

  • liblapack.a
  • librefblas.a

Dependendo da sua aplicação, pode ser necessário atribuir algum valor para a variável “LAPACK_PATH” indicando o caminho das libs que foram geradas. Se a compilação das libs foi feita em /home/user/lapack-3.4.2, então, pode-se fazer:

$ export LAPACK_PATH=/home/user/lapack-3.4.2

Este comando pode ser incluído no seu ~/.bashrc ou mesmo em /etc/bash.bashrc.

Referência:

Anúncios

Catastrophic error: could not set locale “” to allow processing of multibyte characters

As mensagem de erro de compilação dos compiladores da Intel são bastante interessantes: “Catastrophic error…”, ou “Erro catastrófico…” 🙂

Esse erro apareceu quando executei o comando “make” para compilar um código fonte em uma máquina Linux (Ubuntu 11.04) utilizando os compiladores da Intel (ifort/icc). Esse erro apareceu porque o Makefile não conseguiu determinar qual é o “idioma” do terminal, muito embora a variável “LANG” estivesse ajustada para “en_US.UTF-8” (LANG=en_US.UTF-8).

A solução foi ajustar mais uma variável de localização, a “LC_ALL” com o mesmo valor de “LANG”, ou seja:

$ export LC_ALL=en_US.UTF-8

Você pode colocar no seu .bashrc ou ainda em /etc/bash.bashrc, e problema resolvido!

Referência:

 

Erro: no such instruction: `vzeroupper’ do PGF90 12.8-1

Recentemente instalei a versão trial do compilador fortran do Portland Group (PGI) para compilar um pacote. No primeiro teste (com um programa Hello World), ocorreu o seguinte erro:

$ pgf90 teste.f90
NOTE: your trial license will expire in 14 days, 0.939 hours.
NOTE: your trial license will expire in 14 days, 0.939 hours.
teste.f90:74:no such instruction: `vzeroupper'
teste.f90:83:no such instruction: `vzeroupper'
teste.f90:90:no such instruction: `vzeroupper'
teste.f90:97:no such instruction: `vzeroupper'
teste.f90:101:no such instruction: `vzeroupper'
teste.f90:107:no such instruction: `vzeroupper'
teste.f90:234:no such instruction: `vzeroupper'

O que é muito estranho, pois o programa hello world contém apenas uma instrução para imprimir uma linha na tela. Dando uma olhada aqui e alí, encontrei a solução aqui, e a sugestão foi acrescentar a opção  “-tp=nehalem-64” na compilação:

$ pgf90 -tp=nehalem-64 teste.f90
NOTE: your trial license will expire in 14 days, 0.901 hours.
NOTE: your trial license will expire in 14 days, 0.901 hours.

Ou seja, o “a.out” (programa compilado) foi criado e funciona sem problemas. Este problema pode afetar máquinas Linux ou Mac OS X com processador Intel, especialmente com o chip SandyBridge. Meu Macbook Pro é de 2011 e tem processador Intel com chip Sandybridge e a Apple não atualizou (ainda…) o Xcode (que fornece acesso a algumas instruções básicas do processador) para suportar as instruções AVX presentes a partir dos chips SandyBridge (o que é ridículo, pois já temos os novos chips IvyBridge…). Então, esta solução força o compilador a interpretar o chip como um modelo mais antigo, ou mais ou menos isso 🙂

Referência:

http://www.pgroup.com/userforum/viewtopic.php?t=2794&sid=3fb09a8305d263e7694c5c20887035b8