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

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

on

  • 628 views

2 встреча Smolensk Computer Science Club ...

2 встреча Smolensk Computer Science Club
Анатолий Свириденков про параллельное программирование
ВКонтакте: http://vk.com/scsc1

Statistics

Views

Total Views
628
Views on SlideShare
627
Embed Views
1

Actions

Likes
1
Downloads
1
Comments
0

1 Embed 1

https://twitter.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NonCommercial LicenseCC Attribution-NonCommercial License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

  • 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;// вход в csready[i] = 1; // i — номер потокаturn = 1 — i;while(ready[1 — i] && turn == 1-i);// csready[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 MicroprocessorsType Alpha ARMv7 POWER x86 x86 AMD64 IA64 oostoreLoads reordered y y y y yafter LoadsLoads reordered y y y y yafter StoresStores reordered y y y y yafter StoresStores reordered y y y y y y yafter LoadsAtomic reordered y y y ywith LoadsAtomic reordered y y y ywith StoresDependent Loads yreorderedIncoherent y y y y y yInstruction cachepipeline
  • Как должно быть 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 detectionstruct RTL_CRITICAL_SECTION{ PRTL_CRITICAL_SECTION_DEBUG DebugInfo; LONG LockCount; LONG RecursionCount; HANDLE OwningThread; HANDLE LockSemaphore; ULONG_PTR SpinCount;};
  • Deadlock detectionstruct _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 Атомарные операции Барьеры памяти
  • Вопросы ?