MSU2011_MPI_OpenMP (811099), страница 5
Текст из файла (страница 5)
nthreads-varОпределяет максимально возможное количество нитей в создаваемойпараллельной области.Начальное значение: зависит от реализации.Значение переменной можно изменить:C shell:setenv OMP_NUM_THREADS 16Korn shell:export OMP_NUM_THREADS=16Windows:set OMP_NUM_THREADS=16void omp_set_num_threads(int num_threads);Узнать значение переменной можно:int omp_get_max_threads(void);21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP108 из 125Internal Control Variables. run-sched-varЗадает способ распределения витков цикла между нитями, если указанаклауза schedule(runtime).Начальное значение: зависит от реализации.Существует одна копия этой переменной для каждой нити.Значение переменной можно изменить:C shell:setenv OMP_SCHEDULE "guided,4"Korn shell:export OMP_SCHEDULE "dynamic,5"Windows:typedef enum omp_sched_t {omp_sched_static = 1,omp_sched_dynamic = 2,omp_sched_guided = 3,omp_sched_auto = 4} omp_sched_t;set OMP_SCHEDULE=staticvoid omp_set_schedule(omp_sched_t kind, int modifier);Узнать значение переменной можно:void omp_get_schedule(omp_sched_t * kind, int * modifier );21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP109 из 125Система поддержки выполнения OpenMPпрограмм.int omp_get_num_threads(void);-возвращает количество нитей в текущей параллельной области#include <omp.h>void work(int i);void test(){int np;np = omp_get_num_threads(); /* np == 1*/#pragma omp parallel private (np){np = omp_get_num_threads();#pragma omp for schedule(static)for (int i=0; i < np; i++)work(i);}}21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP110 из 125Система поддержки выполнения OpenMPпрограмм.int omp_get_thread_num(void);-возвращает номер нити в группе [0: omp_get_num_threads()-1]#include <omp.h>void work(int i);void test(){int iam;iam = omp_get_thread_num(); /* iam == 0*/#pragma omp parallel private (iam){iam = omp_get_thread_num();work(iam);}}21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP111 из 125Система поддержки выполнения OpenMPпрограмм.int omp_get_num_procs(void);-возвращает количество процессоров, на которых программа выполняется#include <omp.h>void work(int i);void test(){int nproc;nproc = omp_get_num_ procs();#pragma omp parallel num_threads(nproc){int iam = omp_get_thread_num();work(iam);}}21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP112 из 125Система поддержки выполнения OpenMP-программ.Функции работы со временемdouble omp_get_wtime(void);возвращает для нити астрономическое время в секундах, прошедшее снекоторого момента в прошлом.
Если некоторый участок окружить вызовамиданной функции, то разность возвращаемых значений покажет время работыданного участка. Гарантируется, что момент времени, используемый вкачестве точки отсчета, не будет изменен за время выполнения программы.double start;double end;start = omp_get_wtime();/*...
work to be timed ...*/end = omp_get_wtime();printf("Work took %f seconds\n", end - start);double omp_get_wtick(void);- возвращает разрешение таймера в секундах (количество секунд междупоследовательными импульсами таймера).21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP113 из 125Материалы по курсу Презентация доступна:ftp://ftp.keldysh.ru/K_student/MSU2011/MSU2011_MPI_OpenMP.pdf21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP114 из 125Литература OpenMP Application Program Interface Version 3.0, May 2008.http://www.openmp.org/mp-documents/spec30.pdf MPI: A Message-Passing Interface Standard Version 2.2, September2009. http://www.mpi-forum.org/docs/mpi-2.2/mpi22-report.pdf Антонов А.С.
Параллельное программирование с использованиемтехнологии OpenMP: Учебное пособие.-М.: Изд-во МГУ, 2009.http://parallel.ru/info/parallel/openmp/OpenMP.pdf Антонов А.С. Параллельное программирование с использованиемтехнологии MPI: Учебное пособие.-М.: Изд-во МГУ, 2004.http://parallel.ru/tech/tech_dev/MPI/mpibook.pdf Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. – СПб.:БХВ-Петербург, 2002. Э. Таненбаум, М. ван Стеен. Распределенные системы. Принципы ипарадигмы. – СПб. Питер, 200321 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP115 из 125АвторБахтин Владимир Александрович, кандидат физико-математических наук,заведующий сектором Института прикладной математики им.
М.В. Келдыша РАН,bakhtin@keldysh.ru21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP116 из 125Инициализация и завершение MPI программПервой вызываемой функцией MPI должна быть функция:int MPI_Init ( int *agrc, char ***argv )Для инициализации среды выполнения MPI-программы. Параметрами функции являютсяколичество аргументов в командной строке и текст самой командной строки.Последней вызываемой функцией MPI обязательно должна являться функция:int MPI_Finalize (void)Обратно21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP117 из 125Определение количества и ранга процессовОпределение количества процессов в выполняемой параллельной программеосуществляется при помощи функции:int MPI_Comm_size ( MPI_Comm comm, int *size ).Для определения ранга процесса используется функция:int MPI_Comm_rank ( MPI_Comm comm, int *rank ).Обратно21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP118 из 125Неблокирующие обмены данными междупроцессорамиДля передачи сообщения процесс-отправитель должен выполнить функцию:int MPI_Isend(void *buf, int count, MPI_Datatype type, int dest,int tag, MPI_Comm comm, MPI_Request *request),где• buf - адрес буфера памяти, в котором располагаются данные отправляемого сообщения,• count - количество элементов данных в сообщении,• type - тип элементов данных пересылаемого сообщения,• dest - ранг процесса, которому отправляется сообщение,Обратно• tag - значение-тег, используемое для идентификации сообщений,• comm - коммуникатор, в рамках которого выполняется передача данных.Для приема сообщения процесс-получатель должен выполнить функцию:int MPI_Irecv(void *buf, int count, MPI_Datatype type, int source,int tag, MPI_Comm comm, MPI_Status *status, MPI_Request *request),где•buf, count, type - буфер памяти для приема сообщения, назначение каждого отдельногопараметра соответствует описанию в MPI_Send,•source - ранг процесса, от которого должен быть выполнен прием сообщения,•tag - тег сообщения, которое должно быть принято для процесса,•comm - коммуникатор, в рамках которого выполняется передача данных,•status - указатель на структуру данных с информацией о результате выполнения операцииприема данных.21 февраля119 из 125Гибридная модель программирования MPI/OpenMPМосква, 2011MPI_WaitallОжидание завершения всех операций обмена осуществляется при помощи функции:int MPI_Waitall(int count,MPI_Request array_of_requests[],MPI_Status array_of_statuses[])Обратно21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP120 из 125MPI_Cart_createСоздание декартовой топологии (решетки) в MPI:int MPI_Cart_create(MPI_Comm oldcomm, int ndims, int *dims, int *periods,int reorder, MPI_Comm *cartcomm),где:• oldcomm - исходный коммуникатор,• ndims - размерность декартовой решетки,• dims - массив длины ndims, задает количество процессов в каждом измерении решетки,• periods - массив длины ndims, определяет, является ли решетка периодической вдолькаждого измерения,• reorder - параметр допустимости изменения нумерации процессов,• cartcomm - создаваемый коммуникатор с декартовой топологией процессов.Обратно21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP121 из 125MPI_Cart_shiftФункция:int MPI_Card_shift(MPI_Comm comm, int dir, int disp, int *source, int *dst)для получения номеров посылающего(source) и принимающего (dst) процессов вдекартовой топологии коммуникатора (comm) для осуществления сдвига вдоль измеренияdir на величину disp.Обратно21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP122 из 125MPI_Card_coordsОпределение декартовых координат процесса по его рангу:int MPI_Card_coords(MPI_Comm comm,int rank,int ndims,int *coords),где:•comm - коммуникатор с топологией решетки,• rank - ранг процесса, для которого определяются декартовы координаты,• ndims - размерность решетки,• coords - возвращаемые функцией декартовы координаты процесса.Обратно21 февраляМосква, 2011Гибридная модель программирования MPI/OpenMP123 из 125MPI_Type_vectorДля снижения сложности в MPI предусмотрено несколько различных способовконструирования производных типов:• Непрерывный способ позволяет определить непрерывный набор элементовсуществующего типа как новый производный тип,• Векторный способ обеспечивает создание нового производного типа как набораэлементов существующего типа, между элементами которого существуют регулярныепромежутки по памяти.