simple.c isimli bir openmp kodumuz olduğunu varsayalım. Bu OpenMP kodu derleyerek, "programim" adıyla bir program (executable) elde etmek için, aşağıdaki şekilde derleme yapılabilir:
Gcc için:
[yildirim@lnode2 ~]$ gcc -fopenmp simple.c -o programim
Intel'in derleyicisi için:
[yildirim@lnode2 ~]$ icc -openmp simple.c -o programim
simple.c(9) : (col. 1) remark: OpenMP DEFINED REGION WAS PARALLELIZED
Intel derleyicilerini kullanabilmek için:
Gerekli ayarların yapılması için, aşağıdaki gibi bir kodun önceden çalıştırılması gereklidir: # for using intel compilers
export INTEL_LICENSE_FILE=/RS/progs/intel/licenses:/opt/intel/licenses
. /RS/progs/intel/Compiler/11.1/069/bin/iccvars.sh intel64
. /RS/progs/intel/Compiler/11.1/069/bin/ifortvars.sh intel64
Trakya makinası için ise: # for using intel compilers
export INTEL_LICENSE_FILE=/RS/progs/intel/licenses:/opt/intel/licenses
. /home1/intel/cc/10.1.015/bin/iccvars.sh
. /home1/intel/fc/10.1.015/bin/ifortvars.sh
|
Unutulmamalıdır ki OpenMP kodları ortak paylaşımlı bellekler gerektirdiği için, sadece tek bir bilgisayarda çalışacaktır. MPI işleri gibi birden fazla bilgisayarı kullanacak şekilde çalıştırılamazlar.
Derlediğimiz programımızı UHEM'de çalıştırmak için,
[yildirim@lnode2 ~]$ bsub -q kuyruk_adi -m ege –P proje_adi -n 8 -a openmp -R "span[hosts=1]" -o %J.out -e %J.err ./programim
Job <6230> is submited to queue <short>.
Buradaki "span[hosts=1]" ifadesi "istedigim tüm işlemcileri tek bir makinada ver" demektir. Openmp birden fazla bilgisayarı aynı anda kullanamadığından bu gereklidir. Ayrıca "-a openmp" ile işimizin openmp işi oldugunu lsf'e bildiriyoruz.
Trakya makinesi için lsf betiği:
Openmp normalde OMP_NUM_THREADS değişkeni ayarlanmazsa tüm işlemci sayısı kadar process açar. Biz tüm işlemcileri kullanmak istemiyorsak, OMP_NUM_THREADS değişkenini ayarlayabilmek için, işi bir lsf betiği olarak vermeliyiz: bsub < betik.lsf
Mesela 8 işlemci kullanmak için, "betik.lsf" dosyası aşağıdaki gibi olmalıdır. #!/bin/bash
#BSUB -q kuyruk_adi
#BSUB -P proje_adi
#BSUB -m trakya
#BSUB -n 8
#BSUB -o %J.out
#BSUB -e %J.err
#BSUB -a openmp
#BSUB -R "span[hosts=1]"
export OMP_NUM_THREADS=8
./programim
|
Bakalım işimiz çalıştı mı?
[yildirim@lnode2 ~]$ bjobs
JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME SUBMIT_TIME
6230 yildirim PEND short ege ./programim Mar 15 13:30
[yildirim@lnode2 ~]$ bjobs
JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME SUBMIT_TIME
6230 yildirim RUN short ege b094 ./programim Mar 15 13:3
Ve aşağıdaki gibi bir çıktı elde edebiliriz:
The output (if any) follows:
Hello World from thread = 0
Number of threads = 8
Hello World from thread = 1
Hello World from thread = 3
Hello World from thread = 2
Hello World from thread = 4
Hello World from thread = 5
Hello World from thread = 7
Hello World from thread = 6