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
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:
- Premaknemo datoteko maxnumber.h v imenik include
- mkdir include
- mv maxnumber.h include/
- 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