2_Семинар OMP

Содержание

Слайд 2

Параллелизм в рамках узла. Многопоточность.

https://www.mkurnosov.net/teaching/docs/pct-spring-lec5.pdf

Параллелизм в рамках узла. Многопоточность. https://www.mkurnosov.net/teaching/docs/pct-spring-lec5.pdf

Слайд 3

Системные вызовы. Разделение ресурсов.

#include pid_t fork(void);

Создание процессах-потомка посредством копирования с разделением

Системные вызовы. Разделение ресурсов. #include pid_t fork(void); Создание процессах-потомка посредством копирования с
ресурсов:

Создание потомка с совместным использованием указанных ресурсов:

   /* Prototype for the glibc wrapper function */    #define _GNU_SOURCE
   #include    int clone(int (*fn)(void *), void *stack, int flags, void *arg, ...
   /* pid_t *parent_tid, void *tls, pid_t *child_tid */ );
   /* Prototype of the raw clone() system call, see NOTES */    #include  /* Definition of struct clone_args */
   #include  /* Definition of CLONE_* constants */
   #include  /* Definition of SYS_* constants */
   #include    long syscall(SYS_clone3, struct clone_args *cl_args, size_t size);

Слайд 4

Разделение ресурсов.

Процесс

Нативные потоки

Легкие потоки, сопрограммы и пр.

Разделение ресурсов. Процесс Нативные потоки Легкие потоки, сопрограммы и пр.

Слайд 5

Потоки POSIX.

pthread_t — идентификатор потока;
pthread_attr_t — перечень атрибутов потока
#include
int pthread_create(pthread_t *thread,

Потоки POSIX. pthread_t — идентификатор потока; pthread_attr_t — перечень атрибутов потока #include
const pthread_attr_t *attr,
  void *(*start)(void *), void *arg);
int pthread_join (pthread_t thread, void ** data);
int pthread_detach(pthread_t thread);
int pthread_cancel(pthread_t thread);

Слайд 6

Поддержка многопоточности в современном C++.

Поддержка многопоточности в современном C++.

Слайд 7

#include
#include
// N N+1 N+2 ... M
void thread_function(int N, int M,

#include #include // N N+1 N+2 ... M void thread_function(int N, int
int64_t *sum)
{
  std::cout << "Thread num " << std::this_thread::get_id() << " sum before is " << *sum << " N =" << N <<"; M = " << M << std::endl;
  for (auto i = N; i < M; ++i)
  {
  *sum += i;  
  }
  std::cout << "Thread num " << std::this_thread::get_id() << " sum after is " << *sum << std::endl;
}

//#define multiThread
int main()
{
  const int maxVal = 300000000;
#ifdef multiThread
  const int range1 = maxVal / 3;
  const int range2 = 2 * range1;
  int64_t sum1 = 0, sum2 = 0, sum3 = 0;
  std::thread tmpThread1(thread_function, 0, range1, &sum1);
  std::thread tmpThread2(thread_function, range1, range2, &sum2);
  std::thread tmpThread3(thread_function, range2, maxVal, &sum3);
tmpThread1.join();
  tmpThread2.join();
  tmpThread3.join();
  std::cout << "sum is " << sum1 + sum2 + sum3 << std::endl;  
#else
  int64_t sum = 0;
  thread_function(0, maxVal, &sum);
  std::cout << "sum is " << sum << std::endl;
#endif
  return 0;
}

Слайд 8

POSIX mutex

pthread_mutex_t
int pthread_mutex_init(pthread_mutex_t *mutex,
const pthread_mutexattr_t *attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t

POSIX mutex pthread_mutex_t int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); int pthread_mutex_destroy(pthread_mutex_t *mutex);
*mutex);

Слайд 9

OpenMP - высокоуровневый API для многопоточного программирования на C, C++ и Fortran
OpenMP

OpenMP - высокоуровневый API для многопоточного программирования на C, C++ и Fortran
1.0 - октябрь 1997
OpenMP 5.1 - ноябрь 2020
интерфейс для распараллеливания на CPU/GPU
поддерживается компиляторами GCC, LLVM, Intel, Nvidia (PGI), IBM
https://www.openmp.org/

https://www.openmp.org/wp-content/uploads/OpenMP-API-Specification-5-1.pdf

Слайд 10

Как это выглядит?

распараллеливание осуществляется с помощью директив компилятора:
#pragma omp
область

Как это выглядит? распараллеливание осуществляется с помощью директив компилятора: #pragma omp область
действия директивы - блок кода { … }

Пример. OpenMP Hello World.

Слайд 11

(не)последовательность исполнения в OpenMP

(не)последовательность исполнения в OpenMP

Слайд 12

Наиболее используемый функционал OpenMP

Tim Mattson, The OpenMP Common Core: A hands on

Наиболее используемый функционал OpenMP Tim Mattson, The OpenMP Common Core: A hands on exploration, Intel Corp.
exploration, Intel Corp.

Слайд 13

Пример 1. Последовательная сумма массива (редукция).

Пример 1. Последовательная сумма массива (редукция).

Слайд 14

Пример 2. Редукция с parallel for.

Пример 2. Редукция с parallel for.

Слайд 15

Пример 3. Редукция с parallel for и критической секцией.

Пример 3. Редукция с parallel for и критической секцией.

Слайд 16

Пример 4. Редукция с omp parallel for и reduction.

Пример 4. Редукция с omp parallel for и reduction.

Слайд 17

Сравнение производительности. Закон Амдала. Масштабируемость.

Сравнение производительности. Закон Амдала. Масштабируемость.

Слайд 18

Домашнее Задание 1. Параллельное умножение матриц (DGEMM)

Реализовать параллельную реализацию умножения матриц DGEMM

Домашнее Задание 1. Параллельное умножение матриц (DGEMM) Реализовать параллельную реализацию умножения матриц
(Double precision General Matrix Multiplication) из пакета BLAS с использованием OpenMP. (4 балла)
Привести анализ сильной/слабой масштабируемости параллельной реализации на суперкомпьютере Харизма. (2 балла)
Реализовать оптимизированную под узлы суперкомпьютера Харизма параллельную реализацию DGEMM, проанализировать характеристики ее сильной/слабой масштабируемости (2 балла).
Реализовать вычисление суммы ряда с использованием pthreads и поддержкой произвольного количества потоков.

https://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms

Слайд 19

Домашнее Задание 1. Замечания.

alpha = 1 и beta = 0;
элементы A,

Домашнее Задание 1. Замечания. alpha = 1 и beta = 0; элементы
B и C имеют тип double;
A, B и C хранятся в одномерных массивах в column-major порядке (https://en.wikipedia.org/wiki/Row-_and_column-major_order);
функция умножения матриц должна реализовывать следующий интерфейс:

Слайд 20

Домашнее Задание 1. Замечания.

ДЗ1 должно быть реализовано на языке C;
код должен быть

Домашнее Задание 1. Замечания. ДЗ1 должно быть реализовано на языке C; код
оформлен в соответствии с Linux kernel conding style https://www.kernel.org/doc/html/v4.10/process/coding-style.html
(за невыполнение этого критерия оценка за ДЗ1 будет снижена на 3 балла!);
комментарии должны объяснять неочевидные моменты (если таковые имеются), а не дублировать написанный код;
комментарии должны приводиться на английском языке;
на сдачу ДЗ1 дается вторая попытка при неудовлетворительной первой попытке;
дедлайн по ДЗ1 будет объявлен на Семинаре 3.
Имя файла: 2_Семинар-OMP.pptx
Количество просмотров: 28
Количество скачиваний: 0