SlideShare une entreprise Scribd logo
1  sur  43
Télécharger pour lire hors ligne
Smolensk Computer Science Club




     Введение в параллелизм




                       Свириденков Анатолий
План

   Введение в параллелизм

   Примитивы синхронизации (теория)

   Проблемы многопоточности (практика)

   Алгоритмы и структуры данных
Введение в параллелизм
   (сис++ и windows)
Классификация Флина

   SISD (Single Instruction Single Data) –
    классический процессор старой школы
   SIMD (Single Instruction Multiple Data) –
    MMX, SSE
   MISD (Multiple Instruction Single Data) – до
    конца не определено
   MIMD (Multiple Instruction Multiple Data) –
    многоядерные процессоры
   SIMT (Single Instruction Multiple Threads) –
    кастыли от NVIDIA
Закон Амдала




   a – доля последовательных вычислений
   N – количество потоков
Выгоды от многопоточности
Неочевидный параллелизм

   Много потоков на одном ядре
    (квазимногопоточность)

   Аппаратное ускорение: сопроцессоры, DMA,
    аппаратные прерывания.

   Кластеры

   Интернет
Примитивы синхронизации
Синхронизация, события

   Мьютекс

   Событие

   Приветсвие TCPIP
Мьютекс
   Mutex (mutual execution) – примитив
    исключающий совместный доступ к
    разделяемому ресурсу.


Семафор Дейкстры (1965):


P: while (s==0) sleep;     // вход
    s = s — 1;


V: s = s + 1;            // выход
Алгоритм Петерсона (1981)
shared int[2] = {0, 0};
shared int turn;


// вход в cs
ready[i] = 1;             // i — номер потока
turn = 1 — i;
while(ready[1 — i] && turn == 1-i);


// cs


ready[i] = 0;             // выход из cs
Событие

   События служат для информирования
    потоко о событии.

   Типичное применение событий:
    Производитель – Потребитель (Producer –
    Consumer)

   События нельзя применять для
    синхронизации доступа.
Приветсвие TCPIP
Трехтактное рукопожатие при установлении
TCPIP соединение это обмен событиями, с
учетом возможности потери последнего.
Ошибки многопоточности

   Гонки

   Взаимные блокировки

   Пересинхронизация
Возможно ли r1 = r2 = 0 ?
             int x = 0;
             int y = 0;
             int r1 = -1;
             int r2 = -1;

Поток 1:              Поток 2:

x=1                   y = 1;
r1 = y;               r2 = x;
volatile

   volatile – ключевое слово для работы с
    signals. Запрещает перемещение
    переменной в регистр.

   volatile – модификатор доступа, как и const.
    Могут быть volatile классы и функции.
    Снимается через const_cast<>;

   MS specific – к volatile атомарный доступ
Что тут в r1 и r2?
               volatile int x = 0;
               volatile int y = 0;
                  int r1 = 0;
                  int r2 = 0;

Поток 1:                   Поток 2:

x = -1                     y = -1;
r1 = y;                    r2 = x;
Гонки и атомарный доступ

    char * buffer[3] = {0}

   Поток 1: strcpy(buffer, ”11”);
   Поток 2: strcpy(buffer, ”22”);


    Итог: 11, 12, 21, 22
Атомарность в x86

   BYTE;

   WORD, DWORD выровненые на границу кеш
    линии;

   WORD, DWORD с сигналом LOCK на шине.
    В СС++ функции InterlockedXXXX.
Если все атомарно (r1 = r2 = 0)?
            volatile int x = 0;
            volatile int y = 0;
               int r1 = -1;
               int r2 = -1;

 Поток 1:               Поток 2:

 x=1                    y = 1;
 r1 = y;                r2 = x;
Типы процессоров

   Векторные;

   Скалярные;

   Суперскаляные;

   VLIW.
Суперскалярные процессоры
Стадии обработки команды:

   Выборка;

   Декодирование;

   Исполнение;

   Установка результата;
Без конвеера

  Такт   Выборка   Декод.   Выполнение   Запись


   1       К1


   2                К1


   3                            К1


   4                                      К1
С конвеером

Такт   Выборка   Декод.   Выполнение   Запись


 1       К1


 2       К2       К1


 3       К3       К2          К1


 4       К4       К3          К2        К1
Конфликты в конвеере

   Конфликты по данным – ввод одной
    инструкции зависит от вывода другой;

   Конфликты по управлению – переходы;

   Структурный конфликт – нехватка
    вычислительных модулей (ALU).
Модели памяти

   Строгая модель памяти – out-of-order
    выполнение запрещено;

   Слабая модель позволяет
    переупорядычивание операций;



    Intel® 64 Architecture Memory Ordering White Paper

    Foundations of the C++ Concurrency Memory Model
Барьеры памяти

    lfence — все операции загрузки должны
    быть заверены пока команда
    выполняется;
    sfence — все операции выгрузки
    должны быть заверешны пока команда
    выполняется;
    mfence — sfence + lfence;
    cpuid;
    interlocked операции.
Memory Ordering in Modern Microprocessors
Type                Alpha   ARMv7   POWER   x86   x86       AMD64   IA64
                                                  oostore

Loads reordered     y       y       y             y                 y
after Loads

Loads reordered     y       y       y             y                 y
after Stores

Stores reordered    y       y       y             y                 y
after Stores

Stores reordered    y       y       y       y     y         y       y
after Loads

Atomic reordered    y       y       y                               y
with Loads

Atomic reordered    y       y       y                               y
with Stores

Dependent Loads     y
reordered

Incoherent          y       y       y       y     y                 y
Instruction cache
pipeline
Как должно быть
               volatile int x = 0;
               volatile int y = 0;
                  int r1 = -1;
                  int r2 = -1;

Поток 1:                   Поток 2:
x=1                        y = 1;
mfence;                    mfence;
r1 = y;                    r2 = x;
Взаимоблокировка

              CRITICAL_SECTION r1, r2;



EnterCriticalSectio(&r1);    EnterCriticalSectio(&r2);
EnterCriticalSectio(&r2);    EnterCriticalSectio(&r1);
….                           ….
LeaveCriticalSection(&r2);   LeaveCriticalSection(&r1);
LeaveCriticalSection(&r1);   LeaveCriticalSection(&r2);
Взаимоблокировка
Deadlock detection

struct RTL_CRITICAL_SECTION
{
     PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
     LONG LockCount;
     LONG RecursionCount;
     HANDLE OwningThread;
     HANDLE LockSemaphore;
     ULONG_PTR SpinCount;
};
Deadlock detection

struct _RTL_CRITICAL_SECTION_DEBUG
{
    WORD Type;
    WORD CreatorBackTraceIndex;
    RTL_CRITICAL_SECTION *CriticalSection;
    LIST_ENTRY ProcessLocksList;
    DWORD EntryCount;
    DWORD ContentionCount;
    DWORD Spare[ 2 ];
}
Пересинхронизация

Ошибка в проектировании, когда работающие
потоки мешают друг другу. Обычно связано с:
   Общими ресурсами

   NUMA

   Кеш
Пересинхронизация на общем ресурсе

                           int sum = 0;
                           int array[SIZE];
                           CRITICAL_SECTION cs;

for(int i = 0; i < SIZE/2; i++)   for(int i = 0; i < SIZE/2; i++)
{                                 {
    EnterCriticalSectio(&cs);         EnterCriticalSectio(&cs);
    sum += array[i];                  sum += array[i + SIZE/2];
    LeaveCriticalSection(&cs);        LeaveCriticalSection(&cs);
}                                 }
Пересинхронизация и кеш

                      int array[SIZE] = {0};


for(int i = 0; i < SIZE/2; i++)   for(int i = 0; i < SIZE/2; i++)
{                                 {
    array[2*i] = i;                   array[2*i + 1] = i;
}
                                  }
Принципы на примере циклов

    Не распараллеленый:
    C[i] = A[i] + B[i];


    Распараллеленый
    C[N*i + k] = A[N*i + k] + B[N*i + k]

   N – количество потоков
   k – номер потока
Зависимость назад

    Не распараллеленый:
    A[i - 1] = A[i] + B[i];


    Распараллеленый
    AN = A
    A[N*i + k - 1] = AN[N*i + k] + B[N*i + k]

   N – количество потоков
   k – номер потока
Зависимость вперед

 Не распараллеленый:
 A[i + 1] = A[i] + B[i];


 Распараллеленый
 В общем случае не параллелится.
Некоторые приемы
   Пул потоков

   Асинхронное программирования

   Двойная проверка

   Map reduce

   Счетчик доступа
Данные и алгоритмы

   Блокировки – с явной синхронизацией;

   Obstruction-free (без препятствий) – поток
    завершит исполнение за
    детерменированное количество шагов;

   Lock-free (без блокировок) – на каждом шаге
    происходит прогресс в системе;

   Wait-free (без ожиданий) – нет ожиданий.
Приемы

   Read-only

   Атомарные операции

   Барьеры памяти
Вопросы ?

Contenu connexe

Tendances

Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Alexey Paznikov
 
ветвление.условный оператор.циклы
ветвление.условный оператор.циклыветвление.условный оператор.циклы
ветвление.условный оператор.циклыdasha2012
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2Eugeniy Tyumentcev
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3Eugeniy Tyumentcev
 
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...Alexey Paznikov
 
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++Mikhail Shcherbakov
 
Atomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithmsAtomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithmsAlexey Fyodorov
 
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3. Mikhail Shcherbakov
 
Когда в C# не хватает C++ . Часть 2.
Когда в C# не хватает C++. Часть 2.Когда в C# не хватает C++. Часть 2.
Когда в C# не хватает C++ . Часть 2.Mikhail Shcherbakov
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...Alexey Paznikov
 
Введение в Clojure (Никита Прокопов)
Введение в Clojure (Никита Прокопов)Введение в Clojure (Никита Прокопов)
Введение в Clojure (Никита Прокопов)mainstreamless
 
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...Alexey Paznikov
 
Модель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, ЯндексМодель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, ЯндексYandex
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиTatyanazaxarova
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x IntroductionFedor Vompe
 
020
020020
020JIuc
 

Tendances (20)

Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
 
ветвление.условный оператор.циклы
ветвление.условный оператор.циклыветвление.условный оператор.циклы
ветвление.условный оператор.циклы
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
 
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++
 
Atomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithmsAtomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithms
 
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3.
 
Когда в C# не хватает C++ . Часть 2.
Когда в C# не хватает C++. Часть 2.Когда в C# не хватает C++. Часть 2.
Когда в C# не хватает C++ . Часть 2.
 
5
55
5
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
 
Введение в Clojure (Никита Прокопов)
Введение в Clojure (Никита Прокопов)Введение в Clojure (Никита Прокопов)
Введение в Clojure (Никита Прокопов)
 
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
 
Модель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, ЯндексМодель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, Яндекс
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибки
 
Zagursky
ZagurskyZagursky
Zagursky
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
 
020
020020
020
 

En vedette

7 встреча — Программирование компьютерных сетей (А. Свириденков)
7 встреча — Программирование компьютерных сетей (А. Свириденков)7 встреча — Программирование компьютерных сетей (А. Свириденков)
7 встреча — Программирование компьютерных сетей (А. Свириденков)Smolensk Computer Science Club
 
12 встреча — Многопоточность-2 (А. Свириденков)
12 встреча — Многопоточность-2 (А. Свириденков)12 встреча — Многопоточность-2 (А. Свириденков)
12 встреча — Многопоточность-2 (А. Свириденков)Smolensk Computer Science Club
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)Smolensk Computer Science Club
 
2 встреча — Биоинформатика (А. Фединцев)
2 встреча — Биоинформатика (А. Фединцев)2 встреча — Биоинформатика (А. Фединцев)
2 встреча — Биоинформатика (А. Фединцев)Smolensk Computer Science Club
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)Smolensk Computer Science Club
 
3 встреча — Биоинформатика (продолжение) (А. Фединцев)
3 встреча — Биоинформатика (продолжение) (А. Фединцев)3 встреча — Биоинформатика (продолжение) (А. Фединцев)
3 встреча — Биоинформатика (продолжение) (А. Фединцев)Smolensk Computer Science Club
 
13 встреча — Сжатие данных (Р. Одинцов)
13 встреча — Сжатие данных (Р. Одинцов)13 встреча — Сжатие данных (Р. Одинцов)
13 встреча — Сжатие данных (Р. Одинцов)Smolensk Computer Science Club
 
सीमेंट एक महत्
सीमेंट एक महत्सीमेंट एक महत्
सीमेंट एक महत्Vikas Nema
 
Grammer book
Grammer bookGrammer book
Grammer bookasiajay17
 
Periodic table
Periodic tablePeriodic table
Periodic tableVicowe
 

En vedette (16)

7 встреча — Программирование компьютерных сетей (А. Свириденков)
7 встреча — Программирование компьютерных сетей (А. Свириденков)7 встреча — Программирование компьютерных сетей (А. Свириденков)
7 встреча — Программирование компьютерных сетей (А. Свириденков)
 
12 встреча — Многопоточность-2 (А. Свириденков)
12 встреча — Многопоточность-2 (А. Свириденков)12 встреча — Многопоточность-2 (А. Свириденков)
12 встреча — Многопоточность-2 (А. Свириденков)
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)
 
2 встреча — Биоинформатика (А. Фединцев)
2 встреча — Биоинформатика (А. Фединцев)2 встреча — Биоинформатика (А. Фединцев)
2 встреча — Биоинформатика (А. Фединцев)
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)
 
3 встреча — Биоинформатика (продолжение) (А. Фединцев)
3 встреча — Биоинформатика (продолжение) (А. Фединцев)3 встреча — Биоинформатика (продолжение) (А. Фединцев)
3 встреча — Биоинформатика (продолжение) (А. Фединцев)
 
13 встреча — Сжатие данных (Р. Одинцов)
13 встреча — Сжатие данных (Р. Одинцов)13 встреча — Сжатие данных (Р. Одинцов)
13 встреча — Сжатие данных (Р. Одинцов)
 
Ahsan CV
Ahsan CV Ahsan CV
Ahsan CV
 
सीमेंट एक महत्
सीमेंट एक महत्सीमेंट एक महत्
सीमेंट एक महत्
 
4b10 ppt
4b10 ppt4b10 ppt
4b10 ppt
 
Grammer book
Grammer bookGrammer book
Grammer book
 
Pecha kucha 1
Pecha kucha 1Pecha kucha 1
Pecha kucha 1
 
Ejercicios calcul
Ejercicios calculEjercicios calcul
Ejercicios calcul
 
The Human Brain
The Human BrainThe Human Brain
The Human Brain
 
Periodic table
Periodic tablePeriodic table
Periodic table
 
Mobilefist seminar
Mobilefist seminarMobilefist seminar
Mobilefist seminar
 

Similaire à 1 встреча — Параллельное программирование (А. Свириденков)

Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMTech Talks @NSU
 
Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)Victor_Cr
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail Kurnosov
 
Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actualYevgen Levik
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Platonov Sergey
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail Kurnosov
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3etyumentcev
 
Дмитрий Жестилевский — Yet another threading framework: асинхронная разработк...
Дмитрий Жестилевский — Yet another threading framework: асинхронная разработк...Дмитрий Жестилевский — Yet another threading framework: асинхронная разработк...
Дмитрий Жестилевский — Yet another threading framework: асинхронная разработк...Yandex
 
Развитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кодаРазвитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кодаPositive Hack Days
 
Продолжаем говорить про арифметику
Продолжаем говорить про арифметикуПродолжаем говорить про арифметику
Продолжаем говорить про арифметикуAndrey Akinshin
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Ontico
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Mikhail Kurnosov
 
Доклад на Highload-2012
Доклад на Highload-2012Доклад на Highload-2012
Доклад на Highload-2012Alex Tutubalin
 
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...Alexey Paznikov
 
Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Alex Tutubalin
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
 
Алексей Рагозин (Deutsche Bank)
Алексей Рагозин (Deutsche Bank)Алексей Рагозин (Deutsche Bank)
Алексей Рагозин (Deutsche Bank)Ontico
 

Similaire à 1 встреча — Параллельное программирование (А. Свириденков) (20)

Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)Legacy: как победить в гонке (Joker)
Legacy: как победить в гонке (Joker)
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actual
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
Дмитрий Жестилевский — Yet another threading framework: асинхронная разработк...
Дмитрий Жестилевский — Yet another threading framework: асинхронная разработк...Дмитрий Жестилевский — Yet another threading framework: асинхронная разработк...
Дмитрий Жестилевский — Yet another threading framework: асинхронная разработк...
 
Развитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кодаРазвитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кода
 
Step cpp0201
Step cpp0201Step cpp0201
Step cpp0201
 
Продолжаем говорить про арифметику
Продолжаем говорить про арифметикуПродолжаем говорить про арифметику
Продолжаем говорить про арифметику
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
 
Доклад на Highload-2012
Доклад на Highload-2012Доклад на Highload-2012
Доклад на Highload-2012
 
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
 
Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
лекция 14
лекция 14лекция 14
лекция 14
 
лекция 14
лекция 14лекция 14
лекция 14
 
Алексей Рагозин (Deutsche Bank)
Алексей Рагозин (Deutsche Bank)Алексей Рагозин (Deutsche Bank)
Алексей Рагозин (Deutsche Bank)
 

1 встреча — Параллельное программирование (А. Свириденков)

  • 1. Smolensk Computer Science Club Введение в параллелизм Свириденков Анатолий
  • 2. План  Введение в параллелизм  Примитивы синхронизации (теория)  Проблемы многопоточности (практика)  Алгоритмы и структуры данных
  • 4. Классификация Флина  SISD (Single Instruction Single Data) – классический процессор старой школы  SIMD (Single Instruction Multiple Data) – MMX, SSE  MISD (Multiple Instruction Single Data) – до конца не определено  MIMD (Multiple Instruction Multiple Data) – многоядерные процессоры  SIMT (Single Instruction Multiple Threads) – кастыли от NVIDIA
  • 5. Закон Амдала  a – доля последовательных вычислений  N – количество потоков
  • 7. Неочевидный параллелизм  Много потоков на одном ядре (квазимногопоточность)  Аппаратное ускорение: сопроцессоры, DMA, аппаратные прерывания.  Кластеры  Интернет
  • 9. Синхронизация, события  Мьютекс  Событие  Приветсвие TCPIP
  • 10. Мьютекс  Mutex (mutual execution) – примитив исключающий совместный доступ к разделяемому ресурсу. Семафор Дейкстры (1965): P: while (s==0) sleep; // вход s = s — 1; V: s = s + 1; // выход
  • 11. Алгоритм Петерсона (1981) shared int[2] = {0, 0}; shared int turn; // вход в cs ready[i] = 1; // i — номер потока turn = 1 — i; while(ready[1 — i] && turn == 1-i); // cs ready[i] = 0; // выход из cs
  • 12. Событие  События служат для информирования потоко о событии.  Типичное применение событий: Производитель – Потребитель (Producer – Consumer)  События нельзя применять для синхронизации доступа.
  • 13. Приветсвие TCPIP Трехтактное рукопожатие при установлении TCPIP соединение это обмен событиями, с учетом возможности потери последнего.
  • 14. Ошибки многопоточности  Гонки  Взаимные блокировки  Пересинхронизация
  • 15. Возможно ли r1 = r2 = 0 ? int x = 0; int y = 0; int r1 = -1; int r2 = -1; Поток 1: Поток 2: x=1 y = 1; r1 = y; r2 = x;
  • 16. volatile  volatile – ключевое слово для работы с signals. Запрещает перемещение переменной в регистр.  volatile – модификатор доступа, как и const. Могут быть volatile классы и функции. Снимается через const_cast<>;  MS specific – к volatile атомарный доступ
  • 17. Что тут в r1 и r2? volatile int x = 0; volatile int y = 0; int r1 = 0; int r2 = 0; Поток 1: Поток 2: x = -1 y = -1; r1 = y; r2 = x;
  • 18. Гонки и атомарный доступ char * buffer[3] = {0}  Поток 1: strcpy(buffer, ”11”);  Поток 2: strcpy(buffer, ”22”); Итог: 11, 12, 21, 22
  • 19. Атомарность в x86  BYTE;  WORD, DWORD выровненые на границу кеш линии;  WORD, DWORD с сигналом LOCK на шине. В СС++ функции InterlockedXXXX.
  • 20. Если все атомарно (r1 = r2 = 0)? volatile int x = 0; volatile int y = 0; int r1 = -1; int r2 = -1; Поток 1: Поток 2: x=1 y = 1; r1 = y; r2 = x;
  • 21. Типы процессоров  Векторные;  Скалярные;  Суперскаляные;  VLIW.
  • 22. Суперскалярные процессоры Стадии обработки команды:  Выборка;  Декодирование;  Исполнение;  Установка результата;
  • 23. Без конвеера Такт Выборка Декод. Выполнение Запись 1 К1 2 К1 3 К1 4 К1
  • 24. С конвеером Такт Выборка Декод. Выполнение Запись 1 К1 2 К2 К1 3 К3 К2 К1 4 К4 К3 К2 К1
  • 25. Конфликты в конвеере  Конфликты по данным – ввод одной инструкции зависит от вывода другой;  Конфликты по управлению – переходы;  Структурный конфликт – нехватка вычислительных модулей (ALU).
  • 26. Модели памяти  Строгая модель памяти – out-of-order выполнение запрещено;  Слабая модель позволяет переупорядычивание операций; Intel® 64 Architecture Memory Ordering White Paper Foundations of the C++ Concurrency Memory Model
  • 27. Барьеры памяти  lfence — все операции загрузки должны быть заверены пока команда выполняется;  sfence — все операции выгрузки должны быть заверешны пока команда выполняется;  mfence — sfence + lfence;  cpuid;  interlocked операции.
  • 28. Memory Ordering in Modern Microprocessors Type Alpha ARMv7 POWER x86 x86 AMD64 IA64 oostore Loads reordered y y y y y after Loads Loads reordered y y y y y after Stores Stores reordered y y y y y after Stores Stores reordered y y y y y y y after Loads Atomic reordered y y y y with Loads Atomic reordered y y y y with Stores Dependent Loads y reordered Incoherent y y y y y y Instruction cache pipeline
  • 29. Как должно быть volatile int x = 0; volatile int y = 0; int r1 = -1; int r2 = -1; Поток 1: Поток 2: x=1 y = 1; mfence; mfence; r1 = y; r2 = x;
  • 30. Взаимоблокировка CRITICAL_SECTION r1, r2; EnterCriticalSectio(&r1); EnterCriticalSectio(&r2); EnterCriticalSectio(&r2); EnterCriticalSectio(&r1); …. …. LeaveCriticalSection(&r2); LeaveCriticalSection(&r1); LeaveCriticalSection(&r1); LeaveCriticalSection(&r2);
  • 32. Deadlock detection struct RTL_CRITICAL_SECTION { PRTL_CRITICAL_SECTION_DEBUG DebugInfo; LONG LockCount; LONG RecursionCount; HANDLE OwningThread; HANDLE LockSemaphore; ULONG_PTR SpinCount; };
  • 33. Deadlock detection struct _RTL_CRITICAL_SECTION_DEBUG { WORD Type; WORD CreatorBackTraceIndex; RTL_CRITICAL_SECTION *CriticalSection; LIST_ENTRY ProcessLocksList; DWORD EntryCount; DWORD ContentionCount; DWORD Spare[ 2 ]; }
  • 34. Пересинхронизация Ошибка в проектировании, когда работающие потоки мешают друг другу. Обычно связано с:  Общими ресурсами  NUMA  Кеш
  • 35. Пересинхронизация на общем ресурсе int sum = 0; int array[SIZE]; CRITICAL_SECTION cs; for(int i = 0; i < SIZE/2; i++) for(int i = 0; i < SIZE/2; i++) { { EnterCriticalSectio(&cs); EnterCriticalSectio(&cs); sum += array[i]; sum += array[i + SIZE/2]; LeaveCriticalSection(&cs); LeaveCriticalSection(&cs); } }
  • 36. Пересинхронизация и кеш int array[SIZE] = {0}; for(int i = 0; i < SIZE/2; i++) for(int i = 0; i < SIZE/2; i++) { { array[2*i] = i; array[2*i + 1] = i; } }
  • 37. Принципы на примере циклов Не распараллеленый: C[i] = A[i] + B[i]; Распараллеленый C[N*i + k] = A[N*i + k] + B[N*i + k]  N – количество потоков  k – номер потока
  • 38. Зависимость назад Не распараллеленый: A[i - 1] = A[i] + B[i]; Распараллеленый AN = A A[N*i + k - 1] = AN[N*i + k] + B[N*i + k]  N – количество потоков  k – номер потока
  • 39. Зависимость вперед Не распараллеленый: A[i + 1] = A[i] + B[i]; Распараллеленый В общем случае не параллелится.
  • 40. Некоторые приемы  Пул потоков  Асинхронное программирования  Двойная проверка  Map reduce  Счетчик доступа
  • 41. Данные и алгоритмы  Блокировки – с явной синхронизацией;  Obstruction-free (без препятствий) – поток завершит исполнение за детерменированное количество шагов;  Lock-free (без блокировок) – на каждом шаге происходит прогресс в системе;  Wait-free (без ожиданий) – нет ожиданий.
  • 42. Приемы  Read-only  Атомарные операции  Барьеры памяти