OpenMP
- Open Multi-Processing, открытый стандарт для распараллеливания в системах с общей памятью
- Реализован, в частности, в системном GNU компиляторе (GCC), поставляемом в составе SLES. При компиляции необходимо использовать опцию '-fopenmp'.
- Количество запрошенных через PBS потоков передаётся в программу через переменную окружения '$OMP_NUM_THREADS'.
- Количество потоков не должно превышать число ядер (ncpus), кроме случаев, когда вычислительный узел используется монопольно.
C
- Создадим файл omp_hello.c
#include <omp.h> #include <stdio.h> #include <unistd.h> int main (int argc, char **argv) { int nthreads, tid; char host[32]; #pragma omp parallel private(nthreads, tid, host) { tid = omp_get_thread_num(); gethostname(host,32); printf("Hello world from the thread %d running on %s\n", tid,host); if (tid == 0) { nthreads = omp_get_num_threads(); printf("[Thread 0 say: there are %d threads]\n", nthreads); } } }
- Компилируем :
gcc -fopenmp -O2 omp_hello.c -o omp_hello.out
- Также можно использовать mаkefile следующего вида:
omp_hello.out : omp_hello.c gcc -fopenmp -O2 -o $@ omp_hello.c
- Количество потоков указывается планировщику параметром 'ompthreads'. Скрипт для qsub выглядит так:
#!/bin/sh #PBS -l walltime=00:00:30 #PBS -l select=1:ncpus=4:ompthreads=4 cd $PBS_O_WORKDIR echo "OMP_NUM_THREADS = $OMP_NUM_THREADS" echo ./omp_hello.out
- После выполнения получим примерно следующее:
OMP_NUM_THREADS = 4 Hello world from the thread 3 running on cn101 Hello world from the thread 0 running on cn101 [Thread 0 say: there are 4 threads] Hello world from the thread 1 running on cn101 Hello world from the thread 2 running on cn101
Fortran
- Создадим файл omp_hello.f90 следующего содержания:
program hello integer id, nthrds integer omp_get_thread_num, omp_get_num_threads !$omp parallel private(id) id = omp_get_thread_num() print *, 'hello world from thread', id !$omp barrier if ( id .eq. 0 ) then nthrds = omp_get_num_threads() print *, 'there are', nthrds, 'threads' end if !$omp end parallel end
- Компилируем:
gfortran -O2 -fopenmp -o omp_hello.out omp_hello.f90
- Также для компиляции можно использованием makefile вида:
omp_hello.out : omp_hello.f90 gfortran -O2 -fopenmp -o $@ omp_hello.f90
- Далее запускаем аналогично примеру для 'C'