POSIX Threads & OpenMP Общая память Сергей Петрович Нечаев, Сибирский Суперкомпьютерный центр
Что нужно: Создать поток Создать поток Уничтожить поток Уничтожить поток Обеспечить контроль доступа к общей памяти Обеспечить контроль доступа к общей памяти
Создание потока #include #include int pthread_create( pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void*), void * arg); thread – адрес, по которому находится переменная типа pthread_t (потока) attr – атрибуты потока. Можно передать NULL start_routine –указатель на функцию, которая будет исполняться потоком. Функция имеет сигнатуру void start_routine(void* param)
Завершение потока void pthread_exit(void* param) – завершить работу текущего потока void pthread_exit(void* param) – завершить работу текущего потока int pthread_join(pthread_t th, void **thread_return); int pthread_join(pthread_t th, void **thread_return); -- дождаться завершения работы потока th.
Мьютексы pthread_mutex_init –создать мьютекс pthread_mutex_init –создать мьютекс pthread_mutex_lock – заблокировать pthread_mutex_lock – заблокировать pthread_mutex_unlock – р а зблокировать pthread_mutex_unlock – р а зблокировать pthread_mutex_trylock pthread_mutex_trylock pthread_mutex_destroy pthread_mutex_destroy подробно –в man подробно –в man
Условия Отличия от мьютексов – мьютексом владеет не более одного потока, условия может ожидать более одного потока Отличия от мьютексов – мьютексом владеет не более одного потока, условия может ожидать более одного потока pthread_cond_init – инициализировать условие pthread_cond_init – инициализировать условие pthread_cond_wait – заблокироваться и ждать выполнения условия pthread_cond_wait – заблокироваться и ждать выполнения условия pthread_cond_broadcast оповестить всех о наступлении условия pthread_cond_broadcast оповестить всех о наступлении условия
OpenMP Существенно проще, чем POSIX Threads, но возможности ограничены Существенно проще, чем POSIX Threads, но возможности ограничены Модель fork/join Модель fork/join
Основное директивы препроцессору директивы препроцессору функции функции переменные окружения переменные окружения Описание стандарта Описание стандарта
Пример программы #include #include int main(int argc, char** argv) { #pragma omp parallel { printf("Hello, OpenMP! I am %d of %d\n", omp_get_thread_num(), omp_get_num_threads()); #include #include int main(int argc, char** argv) { #pragma omp parallel { printf("Hello, OpenMP! I am %d of %d\n", omp_get_thread_num(), omp_get_num_threads()); } return 0; } return 0;}
Разделение работ Распараллеливание итераций цикла Распараллеливание итераций цикла # pragma omp parallel for [clause-list ] new-line for- loop clause:private(list) |reduction(operator: list) |ordered |schedule(kind[, chunk_size]) |nowait # pragma omp parallel for [clause-list ] new-line for- loop clause:private(list) |reduction(operator: list) |ordered |schedule(kind[, chunk_size]) |nowait
Выделение параллельных секций #pragma omp parallel sections { #pragma omp section {... } #pragma omp section {... } } #pragma omp parallel sections { #pragma omp section {... } #pragma omp section {... } }
Это последний слайд Здесь нужно написать что-то типа «спасибо за внимание» или «пожалуйста, вопросы», или «удачи в параллельном мире», а, может быть, «приходите к нам еще», но я так и не определился и решил временно оставить так. Здесь нужно написать что-то типа «спасибо за внимание» или «пожалуйста, вопросы», или «удачи в параллельном мире», а, может быть, «приходите к нам еще», но я так и не определился и решил временно оставить так. И за полгода текст этого слайда не изменился И за полгода текст этого слайда не изменился