Nahajate se tukaj

Okolje module

Okolje module omogoča uporabnikom uporabo različnih nesistemskih programskih paketov in verzij le teh. Prvotno je sistem razvil Cray inc., sedaj pa se uporablja na večini večjih unix sistemov na katere se nameščajo novi programi, katere osnovna distribucija ne vsebuje. Za uporabnika so pomembni naslednji ukazi:

  • module avail - izpiše razpoložljive sistemsko nameščene programske module
  • module list - izpiše module, ki jih je uporabnik izbral sam ali pa so bili vsiljeni s sistemskim profilom
  • module load - vpiše sistemske spremenljivke za iskalne poti podanega modula
  • module help - opiše modul z osnovnimi podatki
  • module display - izpiše sistemske spremenljivke, ki se bodo vpisale z module load

Naslednji moduli so bili na voljo v juliju 2014:

$ module avail                                          
------------------- /usr/local/Modules/default/modulefiles -------------------
dot         module-git  module-info modules     null        use.own          

------------------ /usr/local/Modules/Application-Software -------------------
ansoft/14.5              libreoffice/3.5.4        r/2.14.0
ansys/13.0               libreoffice/4.0.0        r/2.14.1
ansys/14.0               libreoffice/4.1.3        r/2.15.0
ansys/14.5               mathematica/8.0(default) r/2.15.2
ansys/1.5                mathematica/9.0          subversion/1.7.4
eclipse/3.7.2            octave/3.5.92            texlive/2011
elmer/7.0                openfoam/1.7.1           texlive/2012
elmergui/7.0            openfoam/2.1.1           texlive/2013
elsA                     openfoam/2.2.2           ugs/7.5
elsA-impi                openfoam/2.3.0           visit/2.4.2
gnuplot/4.4.4            opera/11.10              visit/2.6.2
gnuplot/4.6.0            paraview/3.12            xoopic/2.70
inkscape/0.48.2          paraview/3.98            xoopic/2.70.2
inkscape/0.48.4          proe/3.0                 xpdp1/4.11

------------------------ /usr/local/Modules/Compiler -------------------------
cmake/2.8.10.2 gcc/4.5.2      intel/12.1     jdk/1.7.0      python/2.7.3
cmake/2.8.7    intel/11.1     jdk/1.6.0_26   python/2.7

------------------ /usr/local/Modules/Parallel-Environments ------------------
intelmpi/4.0  openmpi/1.4.4 openmpi/1.5.1 openmpi/1.6.3 openmpi/1.8.1
openmpi/1.4.3 openmpi/1.4.5 openmpi/1.5.5 openmpi/1.6.5

------------------------ /usr/local/Modules/Libraries ------------------------
arpack-ng/3.1.5    glui/2.35          intel-tbb/3.0.6    qt/4.7.1
atlas/3.10.1       gmp/4.3.2          jre/1.6.0_26       qt/4.7.3
atlas/3.8.3        gsl/1.14           lapack/3.5.0       qt/4.7.4
blacs/03           gsl/1.15           mumps/4.10.0       qt/4.8.4
blas/2014          hdf5/1.8.10-patch1 netcdf/4.1.1       qwt/6.0.2
cblas/2014         hypre/2.9.0b       numpy/1.3.0        scalapack/2.0.2
cunit/2.1-2        intel-ipp/7.0.2    numpy/1.6.2        scipy/0.7.1
fftw/3.2.2         intel-libs/11.1    opencascade/6.5.5  szip/2.1
freetype/2.4.10    intel-mkl/10.2     parmetis/4.0.3     vtk/5.10.1
ftgl/2.1.3-rc5     intel-mkl/10.3     qt/4.5.3           xgrafix/2.70.2
gle/3.1.0          intel-tbb/3.0.5    qt/4.7.0           zlib/1.2.3

----------------- /usr/local/Modules/Debugging-and-Profiling -----------------
ddt/4.1.1       itac/8.0        totalview/8.9.0

Nastavitve v ukazni lupini

Uporabnik si z module load v datoteki .profile ali .bash_profile nastavi knjižnice, prevajalnike in programe, ki jih želi uporabljati. Vse stalne nastavitve naj bi se pisale v prijavno lupino in ne v .bashrc, ki se interpretira pri vsakem odpiranju lupine. Zaradi suid/sgid ld.so programov, kot sta ssh-agent in konsole, se $LD_LIBRARY_PATH iz prijavne školjke ne prenese, zato uporabimo obnovitev okolja tako, da se okolje v prijavni školjki shrani in nato v .bashrc obnovi. V ${HOME}/.bash_profile dodamo vrstico pred ukazi module load

export MODULESBEGINENV=$HOME/.modulesbeginenv
module load intel/11.1 openmpi
module load ansys

Nato v ${HOME}/.bashrc module obnovimo z ukazom

 [ -n "${MODULESBEGINENV}" ] && module update

Uporaba modulov v skriptah LSF

Načeloma ni potrebe, da bi s skriptah LSF nalagali module za programe, saj se celotno okolje prenese tudi v bsub ukaz, ki se izvede v ozadju. Če pa imamo programe, ki smo jih prevajali z različnimi prevajalniki in ali želimo olajšati poganjanje starejših programov, ne da bi jih ponovno prevedli z okoljem, ki ga trenutno uporabljamo, lahko pravilne module napišemo kar v skripto LSF. To storimo tako, da pobrišemo z purge trenutno naložene module in naložimo ustrezne z load. Primer HPL testa:

#!/bin/sh
#BSUB -a openmpi
#BSUB -n 624
#BSUB -J "HPL 2.0"
#BSUB -N
module () { eval `/usr/local/Modules/default/bin/modulecmd bash $*` }
module purge
module load intel/11.1 intel-mkl/10.2 openmpi/1.4.3
mpirun  xhpl

Uporabniški moduli

Poleg sistemsko pripravljenih modulov, si lahko uporabniki sami naredijo module za svoje knjižnice ali za knjižnjice, ki jih uporabljajo, pa niso sistemsko podprte.  Na naslednjem primeru je pokazana uporaba okolja modules, ki je splošno primerno za sisteme z različnimi nestandarnimi knjižnicamin ali programi.

Primer izdelave uporabniškega modula "maxnumber" 

Izdelajmo uporabniško knjižnico, ki vsebuje funkcijo maxnumber in vrača večje celo število. Vsaka knjižnica se sestoji iz funkcij zapakiranih v statični ali dinamični obliki in pripadajoča "header" datoteka za pravilno pretvorbo in kontrolo argumentov funkcij pri prevajanju.

Datoteka maxnumber.c je za naš primer naslednja:

 

#include "maxnumber.h"
int maxnumber(int a, int b)
{
 return a > b ? a : b;
}

 s pripadajočo datoteko maxnumber.h

#ifndef MAXNUMBER
#define MAXNUMBER
int maxnumber(int a, int b);
#endif

Standardno imajo vse knjižnice dva podimenika:

  • include/ - vsebuje deklaracije funkcij in konstant v .h  (header) datotekah za uporabo v fazi prevajanja (compilation)
  • lib/ - vsebuje pevedeni in pripravljene knjižnice za uporabo pri povezovanju (linking) progama

Poleg navedenih so lahko še drugi podimeniki za izvorno kodo, dokumentacijo, teste, primere in drugo

Za pripravo datotek po zgornjih pravilih izvedemo naslednje ukaze:

  1. Premaknemo datoteko maxnumber.h v imenik include
    • mkdir include
    • mv maxnumber.h include/
  2. Pripravimo knjižnico z naslednjimi ukazi
    • cc -c -I./include maxnumber.c
    • ar ru libmaxnumber.a maxnumber.o
    • ranlib libmaxnumber.a
    • mkdir lib/
    • mv libmaxnumber.a lib/

Pripravimo še datoteko modulefile_maxnumber z opisom modula v naslednji obliki: Dodamo port do knjižnice v sistemsko spremenljivko MODULEPATH in že je vidna z module avail in na voljo za uporabo pri prevajanju kot je npr

#%Module1.0#####################################################################
##
## Maxnumber 1.0 Module File
##

proc ModulesHelp { } {
  puts stderr ""
  puts stderr ""
  puts stderr ""
  puts stderr "Release date: October 19th 2010"
  puts stderr ""
  puts stderr "Help and usage of the package"
  puts stderr "(19-10-2010, Leon Kos)"
  puts stderr ""
}
module-whatis   "Maxnumber 1.0 (Release date: October 19th 2010)"
set pkgroot  /home/leon/modules/maxnumber

setenv         MAXNUMBERPATH           $pkgroot
setenv         MAXNUMBER_INC           ${pkgroot}/include
prepend-path   LIBRARY_PATH            ${pkgroot}/lib

Kar prevedemo z:

 cc -I$MAXNUMBER_INC moj_program.c -o moj_program