Содержание
- 2. План Многопотоковые библиотеки Стандарт POSIX Создание потоков Синхронизация Стандарт OpenMP
- 3. Литература Учебное пособие по многопоточному программированию http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html Учебное пособие по OpenMP http://www.llnl.gov/computing/tutorials/openMP/
- 4. Многопотоковость Поток – последовательность команд, которые выполняются параллельно с другими потоками в одном адресном пространстве Все
- 5. Поддержка многопотоковости Существует несколько стандартов SUN threads – первая библиотека многопоточной работы Windows thread - M$
- 6. Стандарт POSIX Функции Создания потоков Завершения потоков Синхронизации между потоками Данные потоков
- 7. Создание потоков int pthread_create( pthread_t * thread, //идентификатор потока pthread_attr_t * attr, // атрибуты потока void
- 8. Завершение потоков Выход из функции потока Принудительное завершение из другого потока Не рекомендуется из-за сложности обработки
- 9. Пример #include #include void* thread_function(void* arg){ int num = (int) arg; int i; for (i=0; i
- 10. Пример выполнения [saa@cluster threads]$ gcc -pthread create.c [saa@cluster threads]$ ./a.out I am thread number 2 I
- 11. Функции потоков Функции должны правильно работать с общими ресурсами Должны корректно выполняться параллельно одна другой Быть
- 12. Пример нереентерабельной функции char* mem ; // общая переменная void* thread_function(void* arg){ int num = (int)
- 13. Реентерабельные версии библиотечных функций Функция форматирования даты в виде текстовой строки char *ctime(const time_t *timep); Использует
- 14. Пример использования #include #include #include #include void* thread_function(void* arg){ time_t t = time(0); char buf[30]; printf("time
- 15. Синхронизация Защита данных Обращение к общим переменным Гарантия, что при асинхронном завершении общие данные будут в
- 16. Защита данных Мьютексы Взаимоисключающие блокировки Типы Быстрый – обычный тип блокировки Рекурсивный – поддерживается счетчик захватов
- 17. Создание мьютексов Статическое создание pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; pthread_mutex_t errchkmutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
- 18. Блокировка - освобождение Блокировка int pthread_mutex_lock(pthread_mutex_t *mutex); Освобождение int pthread_mutex_unlock(pthread_mutex_t *mutex); Проверка int pthread_mutex_trylock(pthread_mutex_t *mutex); Аналогично
- 19. Пример программы без блокировки #include #include #include #include long counter = 0; // счетчик void* thread_function(void*
- 20. Выполнение программы без блокировок [saa@cluster threads]$ gcc -pthread mutex.c [saa@cluster threads]$ ./a.out thread # 1, counter=1320529
- 21. Пример той же программы с блокировками #include #include #include #include long counter = 0; pthread_mutex_t mutex
- 22. Семафоры Семафор – целочисленный атомарный счетчик с блокировкой Поддерживаются семафоры POSIX Отличия от семафоров UNIX Другие
- 23. Условные переменные Ожидание наступления некоторого условия Поток проверки Проверка условия Захват блокировки Установка на ожидание Повторить
- 24. Инициализация и удаление Статическая pthread_cond_t cond = PTHREAD_COND_INITIALIZER; Динамическая int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); Удаление (только
- 25. Условия Условие – некоторая переменная стала иметь некоторое значение Установлен флаг Счетчик стал достаточно большим Данные,
- 26. Проверка условия Захватить мьютекс связанный с условием Проверить условие, если не выполнено Вызвать функцию проверки int
- 27. Сигнал о выполнении условия Вызвать функцию для указанной условной переменной int pthread_cond_broadcast(pthread_cond_t *cond); Функция переводит в
- 28. Пример #include #include #include #include long counter = 0; int thr_count = 0; pthread_mutex_t mutex =
- 29. Синхронизация действий Ожидание окончания потока int pthread_join(pthread_t th, void **thread_return); Вызывающий поток ждет завершения потока th
- 30. Пример join #include #include #include #include long counter = 0; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void* thread_function(void*
- 31. Пример выполнения [saa@cluster threads]$ gcc -pthread join.c -g [saa@cluster threads]$ ./a.out thread # 2, counter=974887 thread
- 32. Данные связанные с потоками Все глобальные переменные общие для всех потоков Можно создать ключ – переменную,
- 33. Стандарт OpenMP Разработка параллельных программ с использованием многопотоковости требует стандартных действий и стандартных правил Некоторые структуры
- 34. Как распараллеливается Программа разбивается на параллельные участки, которые выполняются последовательно Fork-Join модель Каждый параллельный участок выполняется
- 35. Изменение программного кода Изменение кода выполняется путем указания компилятору какие участки и как распараллеливать Указания вводятся
- 36. Как вводятся директивы Фортран !$OMP PARALLEL [clause ...] IF (scalar_logical_expression) PRIVATE (list) SHARED (list) DEFAULT (PRIVATE
- 37. Типы директив Какие участки распараллеливать #pragma omp parallel Какие участки выполнять в разных потоках #pragma omp
- 38. Распараллеливание циклов for #pragma omp parallel for #include #include using namespace std; int main (void){ #pragma
- 39. Пример выполнения [saa@cluster omp]$ icc -openmp for.cpp for.cpp(7) : (col. 1) remark: OpenMP DEFINED LOOP WAS
- 40. Участи параллельного выполнения #pragma omp parallel sections #pragma omp section Каждая секция будет выполняться в своем
- 41. Пример выполнения [saa@cluster omp]$ icc -openmp section.cpp [saa@cluster omp]$ OMP_NUM_THREADS=4 ./a.out 05 1 2 3 4
- 42. Типы планирования Применяется совместно с for Shedule(тип, порция) Порция – количество итераций Типы Static – работа
- 43. Синхронизация Указывается для блока команд Critical – указание критического раздела Master – выполняется только master потоком
- 44. Пример critical #include #include using namespace std; int main (void){ #pragma omp parallel for for (int
- 45. Пример выполнения критического раздела Без critical [saa@cluster omp]$ OMP_NUM_THREADS=10 ./a.out 0756893241 С указанием critical [saa@cluster omp]$
- 46. Видимость данный Используется совместно с for, section или после определения данных SHARED (данные) – данные совместного
- 47. Пример частных и общих данных #include int alpha[10], beta[10], i; #pragma omp threadprivate(alpha) main () {
- 48. Пример выполнения [saa@cluster omp]$ icc -openmp ./threadprivate.c ./threadprivate.c(9) : (col. 1) remark: OpenMP DEFINED REGION WAS
- 49. Операции редукции Reduce(оператор:данные) Используется для указания параллельных блоков в котором выполняется операция редукции Опепраторы могут быть
- 50. Пример редукции #include #include using namespace std; int k=0,l=0; int main (void){ #pragma omp parallel for
- 51. Результат выполнения [saa@cluster omp]$ icc -openmp ./reduce.cpp ./reduce.cpp(7) : (col. 1) remark: OpenMP DEFINED LOOP WAS
- 53. Скачать презентацию