Лекция 10 СОЗДАНИЕ ПАРАЛЛЕЛЬНЫХ ПРОГРАММ. Возможности Автопараллелизация. Использование директив. Языковые средства. CoArray для систем с распределенной.

Презентация:



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

Тема: «Понятие массива. Назначение. Тип. Размер. Размерность. Одномерный массив» :56:36.
Что такое структурный подход в программировании? Как он реализуется в ЯП Паскаль? Что такое процедура? Кто дает название процедуре? Где записывается процедура?
Одномерные массивы. Одномерный массив Статический массив – упорядоченная последовательность фиксированного количества переменных одного типа, имеющая.
OpenMP. Различие между тредами и процессами ПроцессыТреды.
Массив- совокупность однотипных данных, хранящихся в последовательных ячейках памяти и имеющих общее имя. Ячейка - это элемент массива. Номер элемента.
Массивы Материалы к урокам по программированию. МАССИВ это УПОРЯДОЧЕННАЯ последовательность данных ОДНОГО ТИПА. Массивы относятся к структурированным.
Двумерные массивы ( матрицы ) на языке PASCAL Каждый элемент имеет свой номер, как у одномерных массивов, но сейчас номер уже состоит из двух чисел – номера.
Массивы Заполнение и вывод на экран. ОПРЕДЕЛЕНИЕ Массив – это набор однородных данных (чисел, символов, слов), имеющий имя и последовательную нумерацию.
Лекция 8 МОДУЛИ. Если много параметров ? program prog... call sub1(X,Y,Z,X1,...,PAR)... call sub2(X,Y,Z,X1,...,PAR)... end subroutine sub1(A,B,C,D,...,ZW)
Цикл – это команда исполнителю многократно повторить указанную последовательность действий.
A[1,1]A[1,2]A[1,3]A[1,4]A[1,5] A[2,1]A[2,2]A[2,3]A[2,4]A[2,5] A[3,1]A[3,2]A[3,3]A[3,4]A[3,5] A[4,1]A[4,2]A[4,3]A[4,4]A[4,5] Двумерный массив можно представить.
Массивы Паскаль. Массивы - это Заранее известное число однотипных элементов Элементы (каждое данное массива) имеют общее имя(имя массива) и тип (тип элементов.
Радионик Рената 9Б. Массив – это обозначаемая одним именем последовательность однотипных элементов. Место каждого элемента в этой последовательности определяется.
Массивы 9 класс. Основные теоретические сведения Примеры решения задач.
Обработка линейных массивов. МассивМассив – совокупность однотипных данных, хранящихся в последовательных ячейках памяти и имеющих общее имя. элементами.
Шутилина Л.А., A[1,1]A[1,2]A[1,3]A[1,4]A[1,5] A[2,1]A[2,2]A[2,3]A[2,4]A[2,5] A[3,1]A[3,2]A[3,3]A[3,4]A[3,5] A[4,1]A[4,2]A[4,3]A[4,4]A[4,5]
Язык программирования Pascal Массивы А. Жидков. Массивы Массив – поименованный набор однотипных элементов, каждый из которых имеет свой номер, (индекс).
Программирование на современном Фортране Занимает лидирующее положение среди языков программирования, ориентированных на решение научно-технических задач,
Массив – упорядоченный набор одинаковых значений, объединенных одним именем. Примеры: А (14, 7, -5, 3, -10) – массив целых чисел, Зима (декабрь, январь,
Транксрипт:

Лекция 10 СОЗДАНИЕ ПАРАЛЛЕЛЬНЫХ ПРОГРАММ

Возможности Автопараллелизация. Использование директив. Языковые средства. CoArray для систем с распределенной памятью. Библиотеки MPI для систем с распределенной памятью. OpenMP для систем с общей памятью. Использование библиотек Intel-MKL. Сервис Intel Advisor, Intel Inspector.

Автопараллелизация Auto-parallelization функция компилятора Intel® автоматически переводящая последовательные части программы в эквивалентный многопоточный код.

Автопараллелизация Последовательный код subroutine serial(a, b, c) integer, dimension(100) :: a, b, c do i = 1,100 a(i) = a(i) + b(i) * c(i) enddo end subroutine serial Параллельный код subroutine sub_par(a, b, c) integer, dimension(100) :: a, b, c do i = 1,50 ! поток 1 a(i) = a(i) + b(i) * c(i) end do do i = 51,100 ! поток 2 a(i) = a(i) + b(i) * c(i) end do end subroutine par

Автопараллелизация Критерии параллелизации цикла Вычислимость количества итераций цикла во время компиляции. do ! вычисления if (условие) exit end do Отсутствие зависимостей по данным: потоковой ( FLOW, READ after WRITE ) антизависимости ( ANTI, WRITE after READ ) выходной ( OUTPUT, WRITE after WRITE )

Директивы Директива !DEC$ PARALLEL приводит к параллельному выполнению цикла. Следим за зависимостью данных, ответственность на разработчике ! !DEC$ PARALLEL [ALWAYS] выполнять параллельно, даже если это противоречит "решению" компилятора. !DEC$ PARALLEL [ALWAYS [ASSERT]] выдавать сообщение о невозможности распараллеливания цикла !DEC$ NOPARALLEL отмена автопараллелизации

Директивы program prog integer, parameter :: n = 100 integer x(n),a(n) !DEC$ NOPARALLEL do i = 1,n x(i) = i end do !DEC$ PARALLEL do i = 1,n a( x(i) ) = i end do end Пример использование директив !DEC$ PARALLEL, !DEC$ NOPARALLEL

DO CONCURRENT real Q do concurrent (k = 1:N) Q = B(k) + C(k) D(k) = Q + sin(Q) + 2 end do Организация параллельного выполнения цикла. Не должно быть зависимости по данным.

Модель PGAS ( Partitioned Global Address Space ) разделённое глобальное адресное пространство Глобальная адресуемая память представлена логическими разделами. У каждого процессора свой раздел. COARRAY CAF ( CoArray Fortran ) середина 90-х годов Поддержка компанией Cray Центр развития – Rice University

Простое расширение Fortran и чувствовать, как Fortran, а не как что-то другое. Небольшие требования к разработчикам. Очевидность локальности или удаленности ссылки. Обеспечение возможности для оптимизации связей. Легкая читаемость кода. Цели

Модель программирования Архитектура SPMD " Single program multiple data " "Одна программа много данных" Создаётся один экземпляр программы, который затем копируется несколько раз. Каждая копия выполняется параллельно, обрабатывает свои локальные данные. Данные распределенные между копиями программы объявляются как coarray переменные.

Подключение В свойствах проекта указать использование Coarrays, при необходимости Coarray Images.

Images Image - копия CAF - программы. Функция num_images() возвращает количество созданных копий программы. Количество копий программы как правило соответствует количеству имеющихся процессоров. В общем случае устанавливается в настройках проекта. Каждая копия имеет свой уникальный номер, возвращаемый функцией this_image().

COARRAY - переменные Данные распределенные между images объявляются как coarray переменные. тип имя [*] integer A[*] ! A[1] – переменная A ! в копии 1 ! A[2] – переменная A в копии 2 real С(N)[-1:*] ! С(N)[-1] – массив С ! в копии 1 ! С(N)[0] – массив С ! в копии 2 complex Y(50)[1:10,1:*] type (matrix) MS[*] real, allocatable :: W(:)[:]

COARRAY - переменные Пересылка данных – обращение к элементам coarrays. complex C(100,100)[*] Объявление копии массива для всех images. C(1:10,30:50)[2] = C(21:30,90:100)[3] Пересылка сечения массива из 3-й копии во 2-ю. Если без скобок то обращение к локальному, т.е. в первой копии программы пересылка массива А в k -ю копию A[k] = A равносильно A[k] = A[1]

COARRAY - переменные Для определения номера копии программы по индексам coarray используется функция image_index(). program CAF complex Y(50)[1,1:*] if (this_image() == 1) then ! == 2 write(*,*) "This is ", this_image(), & " copy of program " write(*,*) "Image index = ", & image_index(Y, [1,this_image()]) write(*,*) "Coordinates = ", this_image(Y) write(*,*) end if This is 1 copy of program Image index = 1 Coordinates = 1 1

Функция lcobound возвращает нижнюю границу coarray - переменной. Функция ucobound возвращает верхнюю границу coarray - переменной. type point integer x integer y end type point type (point) PS(10)[1,-2:*] ! num_images() = 4 ! 1 -2 write(*,*) "LCOBOUND = ", LCOBOUND (PS) write(*,*) "UCOBOUND = ", UCOBOUND (PS) ! 1 1 COARRAY - переменные

Пример (1) Всем images установить значения переменных. case(1) s1=10; s2=20 case(2) s1=40; s2=50 case(3) s1=-34; s2=-99 case(4) s1=0; s2=55 Image = 1 case(1) s1=10; s2=20 case(2) s1=40; s2=50 case(3) s1=-34; s2=-99 case(4) s1=0; s2=55 Image = 2 case(1) s1=10; s2=20 case(2) s1=40; s2=50 case(3) s1=-34; s2=-99 case(4) s1=0; s2=55 Image = 3 case(1) s1=10; s2=20 case(2) s1=40; s2=50 case(3) s1=-34; s2=-99 case(4) s1=0; s2=55 Image = 4 integer s1, s2 select case(this_image()) case(1); s1 = 10; s2 = 20 case(2); s1 = 40; s2 = 50 case(3); s1 =-34; s2 =-99 case(4); s1 = 0; s2 = 55 end select end

Пример (1) Всем images установить значения переменных. write(*,*) s1(1)+s2(1) Image = 1 program caf integer :: s1(4)=(/10,40,-34,0/), & s2(4)=(/20,50,-99,55/) write(*,*) s1(this_image())+s2(this_image()) end Image = 2 write(*,*) s1(2)+s2(2) Image = 3 write(*,*) s1(3)+s2(3) Image = 4 write(*,*) s1(4)+s2(4)

Пример (2) Две копии программы рисующие разные случайные геометрические фигуры. Первая – прямоугольники, Вторая – окружности.

program prog2 use ifqwin integer, parameter :: dx = 10, dy = 10 do call random_number(x); call random_number(y) call random_number(r); call random_number(g) call random_number(b) ires2 = setcolorrgb(rgbtointeger(int(r*255), & int(g*255), & int(b*255))) if (this_image() == 1) ires2 = rectangle(3,int2(x*800), & int2(y*600),int2(x*800)+dx, int2(y*600)+dy) if (this_image() == 2) ires2 = ellipse(3,int2(x*800), & int2(y*600),int2(x*800)+dx, int2(y*600)+dy) end do end Пример (2) Вариант программы.

SYNC ALL Барьерная синхронизация. Копии программы приостанавливаются на барьере до тех пор, пока на барьере не окажутся все копии программы. program CAF integer, parameter :: M = 100 real A(M,M)[*] if (this_image() == 1) then call random_number(A) A = real(int(A*10)) do k = 2,num_images() ! каждый узнал об изменении A[k] = A end do end if sync all...

Пример SYNC ALL integer :: i, k1, k2 integer(8) sum = 0, k[*] ! k - coarray-переменная if (this_image() == 1) then ! --- план для вычислений k1 = 1; k2 = 100 end if if (this_image() == 2) then k1 = 101; k2 = end if do i = k1,k2 ! --- расчет каждой копией программы k[this_image()] = k[this_image()] + i end do SYNC ALL ! дожидаемся всех, сколько каждая копия насчитала if (this_image() == 1) then ! --- сбор результатов do i = 1,num_images() sum = sum + k[i] end do write(*,*) sum ! end if end

SYNC IMAGES SYNC IMAGES(image_set) Синхронизация избранных копий программы, image_set – массив номеров копий программы или просто номер копии sync images(*) - означает все копии if (this_image() == 5) then ! image 5 ожидает других images, ! чтобы завершить использование данных. sync images(*) else sync images(5) ! Другие images ожидают image 5, ! чтобы установить данные, ! но не ожидают никакого другого image. end if

CRITICAL critical ! операторы, выполняемые в любой момент ! времени только одной копией программы end critical program CAF implicit none complex Y(50)[1,1:*] write(*,*) "This is ", this_image(), " copy of program " write(*,*) "Image index = ", image_index(Y,[1,this_image()]) write(*,*) "Coordinates = ", this_image(Y) write(*,*) end program CAF Результаты печати на экране "перепутаны" !

CRITICAL This is 1 copy of program This is 2 copy of program Index = 2 Coordinates = 1 2 Index = 1 Coordinates = 1 1 This is 2 copy of program This is 1 copy of program Index = 2 Coordinates = 1 2 Index = 1 Coordinates = 1 1 This is 2 copy of program This is 1 copy of program Index = 1 Coordinates = 1 1 Index = 2 Coordinates = 1 2

CRITICAL program CAF implicit none complex Y(50)[1,1:*] critical write(*,*) "This is ", this_image(), " copy of program " write(*,*) "Image index = ", image_index(Y,[1,this_image()]) write(*,*) "Coordinates = ", this_image(Y) write(*,*) end critical end program CAF Экран – критическая секция. This is 1 copy of program Image index = 1 Coordinates = 1 1 This is 2 copy of program Image index = 2 Coordinates = 1 2

Написать программу нахождения максимума в одномерном массиве. * З а д а н и я *