MPI başta dağıtık bellekli sistemler olmak üzere paralel algoritma yazmaya yarayan bir kütüphane standartıdır. Bir programlama dili değildir. MPI kütüphanelerinin C, C++ ve Fortran dili aileleri için sürümleri bulunmaktadır.MPI, “mesaj geçme" mantığına dayalıdır. Değişik işlemciler, birbirleriyle iletiler sayesinde haberleşirler. Sistemimizde Intel MPI Library 3.1 ve mvapich-1.0 /mvapich2- 1.2p1 yüklüdür.
MVAPICH/MVAPICH2 Nedir?
MVAPICH , MPI1’in infiniband üzerinden MPICH1 tabanlı ,yüksek performansl bir uygulamasıdır.MVAPICH2 ise MPICH2 tabanlı ,yüksek performanslı MPI2 uygulamasıdır.Verbs Level Interface (VAPI) üzerinden yüksek performans ve ölçeklenebilir desteği bu paketlerle sağlanır.Bu paketler uDAPL, OpenIB/Gen2 ve TCP/IP standartı gibi iletim arayüzleri tarafından desteklenir.
MPI Nasıl Derlenir?
Öncelikle bazı çevre değişkenlerinin ayarlanması gerekiyor. Bash için olan ayarlarda .bashrc ya da profile dosyamıza aşağıdaki satırları eklemeliyiz:
export INTEL_LICENSE_FILE=/RS/progs/intel/licenses
# intel mpi için
. /RS/progs/intel/impi/3.1/bin64/mpivars.sh
# c, c++ ve fortran derleyicileri kullanabilmek için
. /RS/progs/intel/Compiler/11.1/069/bin/iccvars.sh intel64
tcsh için .tcshrc dosyamıza aşağıdaki satırları ekleyelim:
source /RS/progs/intel/impi/3.1/bin64/mpivars.csh
source /RS/progs/intel/Compiler/11.1/069/bin/iccvars.csh intel64
Böylece intel derleyicilerini kullanabilir duruma geldik. Kullanılacak olan programın kaynak koduna sahip ve kodu derlemek durumda olan kullanıcılar, kod derleme ve kod çalıştırma denemelerini login node'ların lokal disk'inde bulunan /tmp dizininde, başka dosya ya da dizin isimleriyle çakışmayacak şekilde isimlendirilmiş bir dizin hiyerarşisi içinde yapabilirler. [UYBHM paralel dosya sistemlerinin performansını düşürmemek için /tmp dizinin kullanılması önerilmekte, ancak kimi uygulama kod paketlerinin büyüklüğü göz önüne alınarak bu uygulama zorunlu tutulmamaktadır.] Kullanıcılar derlenen bu yazılımı, kod derleme ve test işlemleri sonrasında, yazılımın hesaplama düğümleri tarafından ulaşılması için öncelikli olarak AKDENIZ dosya sistemine taşımalı, sonrasındaysa kullanım sıklığı ya da şekline göre RS dizinine kopyalamalıdır. Login node'ların /tmp dizinlerinin diski doldurmaması için belirli aralıklarla bu dizin içindeki dosyalar silinecektir. Derleme ve test işlemleri sonrasında ilgili dosya ve dizinlerin kullanıcılarca silinmesi gerekmektedir. Aksi halde belirli aralıklarla yapılan temizlik sonrasında derleme işleminin yapıldığı kodlar da silinmiş olabilir. Artık programımızı derleyelim:
[admin.yildirim@lnode2 tmp]$ mpicc -o mpihello.x mpihello.c
[admin.yildirim@lnode2 tmp]$ mpifort -o mpihello.x mpihello.f
MPI Programlarının Teslimi
$ bsub -q short -P sairler -n 6 -m anadolu_s –a intelmpi -o cikti%J.txt mpirun.lsf \
/AKDENIZ/users/admin.yildirim/rs/sairler/mpihello/mpihello.x
Job <9430> is submitted to queue <short>.
burada "-n 6" programın kaç cpu kullanacağıdır. Fazladan yazdığımız "-a intelmpi" ile bsub'a hangi mpi kütüphanesini kullanacağımızı söylüyoruz. Ayrıca programı mpirun.lsf ile çalıştırdığımıza dikkat edin. Gelin bir de bjobs çıktısına bakalım:
$ bjobs
JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME SUBMIT_TIME
9430 admin.y RUN short anadolu1 2*d020 *llo.HP64 Oct 16 12:57
2*d021
2*d022
burada görüldüğü gibi işimiz 3 farklı makinede 2'şer süreç (process) olarak çalışmıştır. Toplamda istediğimiz gibi 6 cpu ediyor. LSF her makinede kaç cpu olduğunu bildiği için, 2 cpu'lu makinelere, her makineye 2 süreç gelecek şekilde işi boş makinelere dağıtmıştır. LSF işimizi en hızlı çalıştıracağını düşündüğü makinelere otomatik olarak gönderir. Ancak istersek bu aşamada ek şartlar sunarak işimizi belli özelliklere sahip makinelere gönderebiliriz.
MPI+OpenMP (Mixed) Programlarının Derlenmesi ve Teslimi
Mixed programalama düğüm içinde ortak paylaşımlı hafızanın dolayısıyla OpenMP’nin özelliklerini, düğümler arasında da MPI’?n özelliklerini kullanarak yapılan programlama çeşitidir. MPI+OpenMP kodu aşağıdaki şekilde derlenebilir:
[admin.yildirim@lnode2 tmp]$ mpiicc -o mixed -openmp mixedHello.c
mixedHello.c(32) : (col. 1) remark: OpenMP DEFINED REGION WAS PARALLELIZED
Kodları çalıştırmak için;
[admin.yildirim@lnode2 ~]$ bsub -a intelmpi -P sairler -q short -m anadolu_s -o out.%J -e err.%J \
mpirun.lsf ./mixed
Job <6243> is submitted to queue <short>
[admin.yildirim@lnode2 ~]$ bjobs
JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME SUBMIT_TIME
6243 admin.yildirim PEND short anadolu2 *f ./mixed Mar 15 14:4
[admin.yildirim@lnode2 ~]$ bjobs
JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME SUBMIT_TIME
6243 admin.yildirim RUN short anadolu2 d023 *f ./mixed Mar 15 14:4
The output (if any) follows:
INFO: 10.128.1.23:Number of CPUs: 4
10.128.1.23: Hello world from process 0 of 1 thread number = 0
10.128.1.23: Hello world from process 0 of 1 thread number = 110.128.1.23: Hello world from process 0 of 1 thread number = 2
10.128.1.23: Hello world from process 0 of 1 thread number = 3
Job /SFS/LSF_HPC/6.2/linux2.6-glibc2.3-x86_64/bin/intelmpi_wrapper ./mixed
TID HOST_NAME COMMAND_LINE STATUS TERMINATION_TIME
======================= ================ ========== =====
00000 d023 ./mixed Done 03/15/2007 14:45:26
ÖNEMLİ NOT: Infiniband networkunu kullanacak uygulamalarınızda Intel MPI ya da MVAPICH MPI sürümlerini kullanılması tavsiye edilmektedir.