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

542 views

Published on

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

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
542
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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

  1. 1. Smolensk Computer Science Club Введение в параллелизм Свириденков Анатолий
  2. 2. План Введение в параллелизм Примитивы синхронизации (теория) Проблемы многопоточности (практика) Алгоритмы и структуры данных
  3. 3. Введение в параллелизм (сис++ и windows)
  4. 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. 5. Закон Амдала a – доля последовательных вычислений N – количество потоков
  6. 6. Выгоды от многопоточности
  7. 7. Неочевидный параллелизм Много потоков на одном ядре (квазимногопоточность) Аппаратное ускорение: сопроцессоры, DMA, аппаратные прерывания. Кластеры Интернет
  8. 8. Примитивы синхронизации
  9. 9. Синхронизация, события Мьютекс Событие Приветсвие TCPIP
  10. 10. Мьютекс Mutex (mutual execution) – примитив исключающий совместный доступ к разделяемому ресурсу.Семафор Дейкстры (1965):P: while (s==0) sleep; // вход s = s — 1;V: s = s + 1; // выход
  11. 11. Алгоритм Петерсона (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
  12. 12. Событие События служат для информирования потоко о событии. Типичное применение событий: Производитель – Потребитель (Producer – Consumer) События нельзя применять для синхронизации доступа.
  13. 13. Приветсвие TCPIPТрехтактное рукопожатие при установленииTCPIP соединение это обмен событиями, сучетом возможности потери последнего.
  14. 14. Ошибки многопоточности Гонки Взаимные блокировки Пересинхронизация
  15. 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. 16. volatile volatile – ключевое слово для работы с signals. Запрещает перемещение переменной в регистр. volatile – модификатор доступа, как и const. Могут быть volatile классы и функции. Снимается через const_cast<>; MS specific – к volatile атомарный доступ
  17. 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. 18. Гонки и атомарный доступ char * buffer[3] = {0} Поток 1: strcpy(buffer, ”11”); Поток 2: strcpy(buffer, ”22”); Итог: 11, 12, 21, 22
  19. 19. Атомарность в x86 BYTE; WORD, DWORD выровненые на границу кеш линии; WORD, DWORD с сигналом LOCK на шине. В СС++ функции InterlockedXXXX.
  20. 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. 21. Типы процессоров Векторные; Скалярные; Суперскаляные; VLIW.
  22. 22. Суперскалярные процессорыСтадии обработки команды: Выборка; Декодирование; Исполнение; Установка результата;
  23. 23. Без конвеера Такт Выборка Декод. Выполнение Запись 1 К1 2 К1 3 К1 4 К1
  24. 24. С конвееромТакт Выборка Декод. Выполнение Запись 1 К1 2 К2 К1 3 К3 К2 К1 4 К4 К3 К2 К1
  25. 25. Конфликты в конвеере Конфликты по данным – ввод одной инструкции зависит от вывода другой; Конфликты по управлению – переходы; Структурный конфликт – нехватка вычислительных модулей (ALU).
  26. 26. Модели памяти Строгая модель памяти – out-of-order выполнение запрещено; Слабая модель позволяет переупорядычивание операций; Intel® 64 Architecture Memory Ordering White Paper Foundations of the C++ Concurrency Memory Model
  27. 27. Барьеры памяти lfence — все операции загрузки должны быть заверены пока команда выполняется; sfence — все операции выгрузки должны быть заверешны пока команда выполняется; mfence — sfence + lfence; cpuid; interlocked операции.
  28. 28. 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
  29. 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. 30. Взаимоблокировка CRITICAL_SECTION r1, r2;EnterCriticalSectio(&r1); EnterCriticalSectio(&r2);EnterCriticalSectio(&r2); EnterCriticalSectio(&r1);…. ….LeaveCriticalSection(&r2); LeaveCriticalSection(&r1);LeaveCriticalSection(&r1); LeaveCriticalSection(&r2);
  31. 31. Взаимоблокировка
  32. 32. Deadlock detectionstruct RTL_CRITICAL_SECTION{ PRTL_CRITICAL_SECTION_DEBUG DebugInfo; LONG LockCount; LONG RecursionCount; HANDLE OwningThread; HANDLE LockSemaphore; ULONG_PTR SpinCount;};
  33. 33. Deadlock detectionstruct _RTL_CRITICAL_SECTION_DEBUG{ WORD Type; WORD CreatorBackTraceIndex; RTL_CRITICAL_SECTION *CriticalSection; LIST_ENTRY ProcessLocksList; DWORD EntryCount; DWORD ContentionCount; DWORD Spare[ 2 ];}
  34. 34. ПересинхронизацияОшибка в проектировании, когда работающиепотоки мешают друг другу. Обычно связано с: Общими ресурсами NUMA Кеш
  35. 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. 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. 37. Принципы на примере циклов Не распараллеленый: C[i] = A[i] + B[i]; Распараллеленый C[N*i + k] = A[N*i + k] + B[N*i + k] N – количество потоков k – номер потока
  38. 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. 39. Зависимость вперед Не распараллеленый: A[i + 1] = A[i] + B[i]; Распараллеленый В общем случае не параллелится.
  40. 40. Некоторые приемы Пул потоков Асинхронное программирования Двойная проверка Map reduce Счетчик доступа
  41. 41. Данные и алгоритмы Блокировки – с явной синхронизацией; Obstruction-free (без препятствий) – поток завершит исполнение за детерменированное количество шагов; Lock-free (без блокировок) – на каждом шаге происходит прогресс в системе; Wait-free (без ожиданий) – нет ожиданий.
  42. 42. Приемы Read-only Атомарные операции Барьеры памяти
  43. 43. Вопросы ?

×