lecture1: introduction to parallel computing

38
Course Parallel Programming and Distributed Systems in Java 1

Upload: andrii-rodionov

Post on 22-Jun-2015

180 views

Category:

Education


3 download

DESCRIPTION

В первой лекции рассматриваются основные виды параллелизма и способы написания высокопроизводительных приложений. В конце рассматривается поддержка параллелизма в Java.

TRANSCRIPT

Page 1: Lecture1: Introduction to  Parallel Computing

Course

Parallel Programming and

Distributed Systems in Java

1

Page 2: Lecture1: Introduction to  Parallel Computing

Лекция 1

2

Introduction to

Parallel Computing

Page 3: Lecture1: Introduction to  Parallel Computing

Что позволяет делать более быстрый

компьютер?

Существующие задачи решаются быстрее

Уменьшается время вычисления сложных задач

Увеличивается отзывчивость интерактивных приложений

Улучшенные решения за то же время

Увеличивается детализация моделей

Позволяет строить более сложные модели

3

Page 4: Lecture1: Introduction to  Parallel Computing

Что такое параллельные вычисления?

Ускорение выполнения конкретной задачи путем:

1. Разделения задачи на подзадачи

2. Одновременного выполнения подзадач

4

Page 5: Lecture1: Introduction to  Parallel Computing

Бесплатный обед?

5

“Free Lunch Is Over”

– Herb Sutter

Page 6: Lecture1: Introduction to  Parallel Computing

Увеличение частоты невозможно

6

Проблемы вызываемые повышением частоты:

чрезмерное энергопотребление

выделение тепла

увеличение токов потерь

Энергопотребление критично в мобильных устройствах

Page 7: Lecture1: Introduction to  Parallel Computing

Есть ли решения кроме параллелизма?

Возможные оптимизации:

Instruction prefetching (предвыборка кода)

Instruction reordering (внеочередное исполнение)

Pipeline functional units (конвейерная обработка)

Branch prediction (предсказание переходов)

Hyper Threading

Недостатки:

Усложнение схем => накладные расходы и потери на

управление

7

Page 8: Lecture1: Introduction to  Parallel Computing

Устаревшие мифы

8

Параллельные компьютеры

дорогостоящие

Параллельные вычисления

не поставлены на поток

Количество параллельных систем

невелико

Никто не учится писать

параллельные программы

Параллельное программирование

сложное

Page 9: Lecture1: Introduction to  Parallel Computing

Многоядерные процессоры

Производительность ~= (core frequency) * (# cores)

Стратегия:

Ограничить тактовую частоту и сложность архитектуры ядра

Расположить множество ядер на одном чипе

9

Page 10: Lecture1: Introduction to  Parallel Computing

Классификации

По Флинну

SISD SIMD MISD MIMD

10

Системы

Мультипроцессорные Мультикомпьютерные Гибридные

Page 11: Lecture1: Introduction to  Parallel Computing

Закон Амдала

11

α / p 10 100 1000

0 10 100 1000

10% 5.263 9.174 9.910

25% 3.077 3.883 3.988

40% 2.174 2.463 2.496

Sp – ускорение

p – количество ядер

α – доля последовательного кода

Page 12: Lecture1: Introduction to  Parallel Computing

Методы декомпозиции

По данным (domain decomposition)

По задачам (task decomposition)

Конвейер (pipelining)

12

Page 13: Lecture1: Introduction to  Parallel Computing

Распараллеливание по данным

Разделить блоки данных между ядрами

Затем определить, какую задачу каждое ядро должно

выполнять над блоком данных

Пример: сложение векторов

13

Page 14: Lecture1: Introduction to  Parallel Computing

Распараллеливание по данным

Поиск наибольшего элемента

14

Core 1 Core 2 Core 3 Core 4

Page 15: Lecture1: Introduction to  Parallel Computing

Распараллеливание по данным

Parallel Volume Rendering

15

Page 16: Lecture1: Introduction to  Parallel Computing

Распараллеливание по задачам

Сначала разделить задачу на независимые подзадачи

Затем определить блоки данных, к которым подзадача

будет иметь доступ (чтение/запись)

Пример: Обработчик событий GUI

16

Page 17: Lecture1: Introduction to  Parallel Computing

Распараллеливание по задачам

17

f()

g()

h() q()

r()

s()

Core 2

Core 1

Core 3

Page 18: Lecture1: Introduction to  Parallel Computing

Конвейер

3D Rendering pipeline

18

Page 19: Lecture1: Introduction to  Parallel Computing

Конвейер (множество ядер)

19

Page 20: Lecture1: Introduction to  Parallel Computing

Как находить параллельные задачи?

Работает ли программа с большим объемом данных?

Есть ли участки кода, которые не имеют общего

состояния и могут работать независимо?

Есть ли последовательность вычислений, которые не

взаимодействуют между собой, кроме входных и

выходных данных?

Более формальный метод: построить граф зависимостей

20

Page 21: Lecture1: Introduction to  Parallel Computing

Граф зависимостей

Граф:

Узлы

Ребра (стрелки)

Узлы представляют собой:

Присваивание значения (не учитывая индексы и счетчики)

Константы

Операторы или вызовы функций

Стрелки:

Потоки данных и потоки выполнения

21

Page 22: Lecture1: Introduction to  Parallel Computing

Граф зависимостей #1

for (i = 0; i < 3; i++) {

a[i] = b[i] / 2.0;

}

22

b[0] 2

/

a[0]

b[1] 2

/

a[1]

b[2] 2

/

a[2]

Распараллеливание по данным

возможно

Page 23: Lecture1: Introduction to  Parallel Computing

Граф зависимостей #2

for (i = 1; i < 4; i++) {

a[i] = a[i-1] * b[i];

}

23

a[0] b[1]

*

a[1]

b[2]

*

a[2]

b[3]

*

a[2]

Page 24: Lecture1: Introduction to  Parallel Computing

Граф зависимостей #3

for (i = 0; i < 3; i++) {

a[i] = a[i] / 2.0;

}

24

a[0] 2

/

a[0]

a[1] 2

/

a[1]

a[2] 2

/

a[2]

Распараллеливание по данным

возможно

Page 25: Lecture1: Introduction to  Parallel Computing

Граф зависимостей #4

for (i = 0; i < 3; i++) {

a[i] = a[i] / 2.0;

if(a[i] < 1.0) break;

}

25

a[0] 2.0

/

a[0]

a[1] 2.0

/

a[1]

a[2] 2.0

/

a[2] < <

1.0 1.0

Page 26: Lecture1: Introduction to  Parallel Computing

Возможно ли это распараллелить?

Масштабирование изображения

Поиск слова в документе

Обновление полей электронной таблицы

Компиляция программы

Индексирование веб страниц поисковым роботом

26

Page 27: Lecture1: Introduction to  Parallel Computing

Java и потоки

Потоки (Threads) – это части программы, которые могут выполняться параллельно

Java имеет встроенные средства для работы с потоками

Это достигается за счет того, что JVM иммет собственную реализацию потоков (JVM

Thread)

Потоки JVM отображаются на потоки ОС и тем самым используют системные ресурсы

27

JVM Thread

Heap

Method Area (допоміжні структури для класів, код конструкторів та методів тощо)

Регістр PC

(program Counter)

Stack

JVM Thread

Регістр PC

(program Counter)

Stack

JVM Thread

Регістр PC

(program Counter)

Stack

...

Структура JVM

Page 28: Lecture1: Introduction to  Parallel Computing

Потоки для Java-программы

Потоки для простой Java-программы:

Поток “Main” (с нем выполняется метод main)

Системные потоки (garbage collector, …)

28

Page 29: Lecture1: Introduction to  Parallel Computing

Мониторинг потоков

jConsole

jVisualVM

Jstack

29

Page 30: Lecture1: Introduction to  Parallel Computing

Понятие потока выполнения в Java

Каждый поток имеет свой стек и регистр указателя программы program counter

Могут выполнять один и тот же код (но каждый поток будет выполнять код со своим стеком)

Имеют доступ к одному и тому же адерсному пространству (JVM Heap) и могут манипулировать одними и теме же данными

Потоки Java – это экземпляры класса java.util.Thread

30

JVM Thread

Heap

Method Area (допоміжні структури для класів, код конструкторів та методів тощо)

Регістр PC

(program Counter)

Stack

JVM Thread

Регістр PC

(program Counter)

Stack

JVM Thread

Регістр PC

(program Counter)

Stack

...

Page 31: Lecture1: Introduction to  Parallel Computing

Запуск потока

1. Определить код который будет выполнять поток

2. Создать экземпляр потока и задать ему код для

выполнения

3. Запустить поток

Для старта потока используется метод start класса

java.util.Thread

31

Page 32: Lecture1: Introduction to  Parallel Computing

#1 Определение кода для выполнения

Определить код непосредственно в потоке. Для этого расширить класс java.lang.Thread

public class MyThread extends Thread {

@Override

public void run() {

System.out.println("MyThread");

}

}

Код в отдельном классе. Для этого реализовать интерфейс java.lang.Runnable

class MyRunnable implements Runnable {

@Override

public void run() {

System.out.println("MyRunnable");

}

}

Runnable – это лучший способ для задания кода потока поскольку позволяет отделить «полезную

работу», которую поток выполняет от деталей реализации управления

32

Page 33: Lecture1: Introduction to  Parallel Computing

#2. Создание экземпляра потока

если код в самом потоке

MyThread t = new MyThread();

если код определен в Runnable MyRunnable r = new MyRunnable(); Thread t = new Thread(r);

Один экземлпяр Runnable можно передать нескольким потокам MyRunnable r = new MyRunnable(); Thread t1 = new Thread(r); Thread t2 = new Thread(r); Thread t3 = new Thread(r);

33

Page 34: Lecture1: Introduction to  Parallel Computing

#3. Запуск потока

С помощью метода start()

public static void main(String[] args) {

MyRunnable r = new MyRunnable();

Thread t = new Thread(r);

t.start();

}

34

Page 35: Lecture1: Introduction to  Parallel Computing

Основные состояния потоков

После старта поток не не сразу получает системные ресурсы

Основные состояния: Готов к выполнению – переходит в это состояние после вызова start Выполняется – означает что потоку были выделены системные ресурсы

Заблокирован – выполнение этого потока было приостановлено

После завершения перезапусить тот же поток нельзя

Проверить состояние потока можно методом isAlive

35

„Готовий до виконання”

(Runnable)

„Виконується”

(Running)

start() run() завершено

„Заблокований”

(Blocked)

?

?

Page 36: Lecture1: Introduction to  Parallel Computing

Ожидание завершения. Join

public static void main(String[] args) { Thread t = new Thread(new NamedRunnable()); t.start(); ... // Ожидаем пока поток не завершит работу try { t.join(); } catch (InterruptedException e) { ... } ... }

36

Page 37: Lecture1: Introduction to  Parallel Computing

Остановка потока

Корректного метода принудительного завершения потока

извне – НЕТ

Метод stop() считается неподдерживаемым

(deprecated)

Метод interrupt() устанавливает флаг завершения, но

не завершает. Поток должен сам проверить этот флаг и

завершиться корректно

37

Page 38: Lecture1: Introduction to  Parallel Computing

Подытожим. Класс Thread

38

Основні методи static currentThread

static dumpStack

static getAllStackTraces

getId/setId

getName/setName

getPriority/setPriority

getState

interrupt

isAlive

isDaemon/setDaemon

join

run

sleep

start

yield

Конструктори Thread()

Thread(String name)

Thread(Runnable runnable)

Thread(Runnable runnable, String name)

Thread(ThreadGroup g, Runnable runnable)

Thread(ThreadGroup g, Runnable runnable, String name)

Thread(ThreadGroup g, String name)