1 / 14

Параллельное программирование с использованием технологии OpenMP

Параллельное программирование с использованием технологии OpenMP. Лекция 3 Томский политехнический университет. Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ.

hart
Télécharger la présentation

Параллельное программирование с использованием технологии OpenMP

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Параллельное программирование с использованием технологии OpenMP Лекция 3 Томский политехнический университет Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ

  2. Директива sectionsопределяет набор независимых секций кода, каждая из которых выполняется своей нитью. Директива sectionзадаёт участок кода внутри секции sectionsдля выполнения одной нитью. Выполнение Первая секция Номер потока=2 Вторая секция Номер потока=0 Третья секция Номер потока=1 Параллельная область Параллельная область Параллельная область Параллельные секции intnum; omp_set_num_threads(3); #pragmaompparallelprivate(num) { num=omp_get_thread_num(); #pragmaompsections { #pragmaompsection//Не является обязательной cout<<"Первая секция Номер потока="<<num<<endl; #pragmaompsection cout<<"Вторая секция Номер потока="<<num<<endl; #pragmaompsection cout<<"Третья секция Номер потока="<<num<<endl; } cout<<"Параллельная область"<<endl; } Параллельное программирование с использованием технологии OpenMP Аксёнов С.В.

  3. В опции lastprivate(список) определяются переменные, перечисленные в списке, которым присваивается результат, полученный в последней секции. Выполнение Первая секция Номер потока=1 n = 1 Первая секция Номер потока=0 n = 2 Параллельная областьНомер потока=1 n = 2 Параллельная областьНомер потока=0 n = 2 intnum, n; omp_set_num_threads(2); #pragmaompparallelprivate(num) { num=omp_get_thread_num(); #pragmaompsectionslastprivate(n) { #pragmaompsection//Не является обязательной { n = 1; cout<<"Первая секция Номер потока="<<num <<" n = "<<n<<endl; } #pragmaompsection { n = 2; cout<<"Вторая секция Номер потока="<<num<<" n = "<<n<<endl; } } cout<<"Параллельнаяобласть Номер потока="<<num <<" n = "<<n<<endl; } Опция lastprivate() Параллельное программирование с использованием технологии OpenMP Аксёнов С.В.

  4. Нити, выполняющие текущую параллельную область, дойдя до директивы barrier, останавливаются и ждут, пока все нити не дойдут до этой точки программы, после чего они разблокируются и продолжают работать дальше. Барьер Выполнение Параллельнаяобласть 1 Номер потока=1 Параллельнаяобласть 1 Номер потока=0 Параллельнаяобласть 1 Номер потока=2 Параллельнаяобласть 2 Номер потока=0 Параллельнаяобласть 2 Номер потока=1 Параллельнаяобласть 2 Номер потока=2 int num; int n=0; omp_set_num_threads(3); #pragmaomp parallel private(num) { num=omp_get_thread_num(); cout<<"Параллельнаяобласть 1 Номер потока="<<num<<endl; #pragmaomp barrier cout<<"Параллельнаяобласть 2 Номер потока="<<num<<endl; } Параллельное программирование с использованием технологии OpenMP Аксёнов С.В.

  5. Директива orderedопределяет блок внутри тела цикла, который должен выполняться в том порядке, в котором итерации идут в последовательном цикле. В параллельном цикле должна быть задана опция ordered. Нить, выполняющая первую итерацию цикла, выполняет операции данного блока. Нить, выполняющая любую следующую итерацию, должна сначала дождаться выполнения всех операций блока всеми нитями, выполняющими предыдущие итерации. Директива ordered Параллельное программирование с использованием технологии OpenMP Аксёнов С.В.

  6. Выполнение Номер потока=1 Итерация 2 Номер потока=3 Итерация 4 Номер потока=0 Итерация 0 Упорядоч. Номерпотока =0 Итерация 0 Номер потока=0 Итерация 1 Упорядоч. Номерпотока =0 Итерация 1 Упорядоч. Номерпотока =1 Итерация 2 Номер потока=2 Итерация 3 Упорядоч. Номерпотока =2 Итерация 3 Упорядоч. Номерпотока =3 Итерация 4 Директива ordered: пример inti, n; omp_set_num_threads(4); #pragmaompparallelprivate (i, n) { n=omp_get_thread_num(); #pragmaompforordered for (i=0; i<5; i++) { cout<<"Номерпотока="<<n<<"Итерация"<<i<<endl; #pragmaompordered cout<<"Упорядоч. Номерпотока="<<n<<"Итерация"<<i<<endl; } } Параллельное программирование с использованием технологии OpenMP Аксёнов С.В.

  7. Директива criticalоформляет критическую секцию программы. В каждый момент времени в критической секции может находиться не более одной нити. Если критическая секция уже выполняется какой-либо нитью, то все другие нити, выполнившие директиву для секции с данным именем, будут заблокированы, пока вошедшая нить не закончит выполнение данной критической секции. Как только работавшая нить выйдет из критической секции, одна из заблокированных на входе нитей войдет в неё. Если на входе в критическую секцию стояло несколько нитей, то случайным образом выбирается одна из них, а остальные заблокированные нити продолжают ожидание. Критические секции: critical Параллельное программирование с использованием технологии OpenMP Аксёнов С.В.

  8. intn; omp_set_num_threads(5); #pragmaompparallel { #pragmaompcritical { n=omp_get_thread_num(); cout<<"Номерпотока="<<n<<endl; } } Выполнение Номер потока=1 Номер потока=3 Номер потока=2 Номер потока=0 Номер потока=4 Критические секции: пример Параллельное программирование с использованием технологии OpenMP Аксёнов С.В.

  9. Директива atomic относится к идущему непосредственно за ней операторуприсваивания, гарантируя корректную работу с общей переменной, стоящей в его левой части. На время выполнения оператора блокируется доступ к данной переменной всем запущенным в данный моментнитям, кроме нити, выполняющей операцию. Атомарной является только работа с переменной в левой части оператора присваивания, при этом вычисления в правой части не обязаны быть атомарными. Директива atomic Параллельное программирование с использованием технологии OpenMP Аксёнов С.В.

  10. omp_set_num_threads(4); intcount = 0; #pragmaompparallel { #pragmaompatomic count++; } cout<<"Число нитей: "<<count; Пример atomic Параллельное программирование с использованием технологии OpenMP Аксёнов С.В.

  11. Один из вариантов синхронизации в OpenMP реализуется через механизмзамков. Замок может находиться в одном из трёх состояний: неинициализированный,разблокированный или заблокированный. Разблокированный замок можетбыть захвачен некоторой нитью. При этом он переходит в заблокированноесостояние. Нить, захватившая замок, и только она может его освободить, после чего замок возвращается в разблокированное состояние. Существует два типа замков: простые замки и множественные замки. Множественный замок может многократно захватываться одной нитью перед его освобождением, в то время как простой замок может быть захвачен только однажды. Замки Параллельное программирование с использованием технологии OpenMP Аксёнов С.В.

  12. Для инициализации простого или множественного замка используются соответственно функции voidomp_init_lock(omp_lock_t *lock); voidomp_init_nest_lock(omp_nest_lock_t *lock); Функции omp_destroy_lock() и omp_destroy_nest_lock() используются для переведения простого или множественного замка в неинициализированное состояние. Функции захватывания замка omp_set_lock() и omp_set_nest_lock(). Функции освобождения замка omp_unset_lock() и omp_unset_nest_lock(). Функции работы с замками Параллельное программирование с использованием технологии OpenMP Аксёнов С.В.

  13. Выполнение Началозаблокированнойсекции, Номер потока 2 Конецзаблокированнойсекции, Номер потока 2 Началозаблокированнойсекции, Номер потока 0 Конецзаблокированнойсекции, Номер потока 0 Началозаблокированнойсекции, Номер потока 1 Конецзаблокированнойсекции, Номер потока 1 omp_lock_tlock; intn; omp_set_num_threads(3); omp_init_lock(&lock); #pragmaompparallelprivate (n) { n=omp_get_thread_num(); omp_set_lock(&lock); printf("Началозаблокированнойсекции, Номер потока %d\n", n); Sleep(5); printf("Конец заблокированной секции, Номер потока %d\n", n); omp_unset_lock(&lock); } omp_destroy_lock(&lock); Пример использования замков 1 Параллельное программирование с использованием технологии OpenMP Аксёнов С.В.

  14. Выполнение НачалоЗС, Номер потока 2 Секция заблок-на, Номер п-ка 0 Секция заблок-на, Номер п-ка 1 Секция заблок-на, Номер п-ка 0 Секция заблок-на, Номер п-ка 1 Секция заблок-на, Номер п-ка 1 Секция заблок-на, Номер п-ка 0 КонецЗС, Номер потока 2 НачалоЗС, Номер потока 0 Секция заблок-на, Номер п-ка 1 Секция заблок-на, Номер п-ка 1 Секция заблок-на, Номер п-ка 1 КонецЗС, Номер потока 0 НачалоЗС, Номер потока 1 КонецЗС, Номер потока 1 omp_lock_tlock; intn; omp_set_num_threads(3); omp_init_lock(&lock); #pragmaompparallelprivate (n) { n=omp_get_thread_num(); while (!omp_test_lock (&lock)) { printf("Секция заблокирована, Номер потока %d\n", n); Sleep(2); } printf("Началозаблокированнойсекции, Номер потока %d\n", n); Sleep(5); printf("Конец заблокированной секции, Номер потока %d\n", n); omp_unset_lock(&lock); } omp_destroy_lock(&lock); Пример использования замков 2 Параллельное программирование с использованием технологии OpenMP Аксёнов С.В.

More Related