- Оценить стоимость запуска одного потока операционной системой. Изменяя количество операций (можно использовать любую арифметическую операцию), которые исполняет функция потока, определить такое их количество, чтобы порождение потока было оправданным.
- Разработать программу, которая обеспечивает параллельное применение заданной функции к каждому элементу массива. Размер массива, применяемая функция и количество потоков задаются динамически.
Создать упрощенный HTTP-сервер, отвечающий на любой запрос клиента (например, браузера) строкой «Request number <номер запроса> has been processed», где под номером запроса понимается порядковый номер, присвоенный запросу сервером. Нумерация начинается с единицы.
- Доработать однопоточную версию сервера. Обработка каждого запроса выполняется в отдельном потоке: при получении запроса создается новый поток для его обработки, после отправки результата клиенту поток завершает свою работу. Соединение с клиентом закрывается сразу после обработки запроса.
- Оценить производительность сервера с помощью утилиты ab, входящей в комплект поставки веб-сервера Apache.
- Оценить максимальное количество потоков, с которым может работать сервер, для различных размеров стека по умолчанию (2 Мбайт, 1 Мбайт, 512 Кбайт).
- Добавить в обработчик запроса от клиента запуск простейшего PHP-скрипта, возвращающего версию PHP (<?php echo phpversion();?>).
Вернуть номер версии клиенту. Оценить изменение производительности сервера с помощью утилиты ab.
- Добавить в пример 4 вывод информации о том, какой поток какую задачу взял на исполнение, а также некоторое достаточно продолжительное вычисление в функцию do_task(). Проверить, что все задачи выполняются, причем каждая – не более одного раза. Отключить вызовы функций pthread_mutex_lock() и pthread_mutex_unlock() и убедиться, что при отсутствии мьютекса некоторые задачи будут выполняться дважды, тогда как другие не выполнятся ни разу.
- Сравнить скорости работы примитивов синхронизации – мьютекса и спинлока. Выяснить, как количество потоков, одновременно обращающихся к ресурсу, защищенному примитивом синхронизации, влияет на скорость исполнения программы.
- Реализовать условную переменную с помощью мьютекса и цикла ожидания.
- Реализовать функцию для выполнения вычислений по модели MapReduce. Подробную информацию можно найти в электронном документе: Калита Р. MapReduce. В качестве параметров функция должна принимать массив данных для обработки, имена функций map и reduce, количество разрешенных потоков. В качестве реализации параллельного применения функции map к каждому элементу массива использовать результаты пункта 2 порядка выполнения лабораторной работы № 1. Реализовать параллельное применение функции reduce к списку, полученному в результате работы функции map.
Пул потоков – это набор потоков, которые могут использоваться для решения различных задач.
Задачи помещаются в общую очередь. Свободный поток (поток, который не решает в настоящий момент никакую задачу) обращается к очереди для получения очередной задачи, выполняет ее, после чего запрашивает в очереди следующую задачу. В результате исполнения некоторой задачи могут появляться новые задачи. Они также добавляются в очередь. Программа завершается, когда в очереди не остается задач и все потоки оказываются свободными.
Необходимо реализовать пул потоков и на его основе решить задачу: генерации простых чисел с помощью алгоритма
«Решето Эратосфена».
- Модифицируйте программу, из примера 19, заменив a[i] = b[i] в теле цикла на a[i] = f(b[i]), где f – некоторая чистая функция, задающая достаточно сложное вычисление, чтобы время ее работы составляло порядка 1 секунды. Запустите в терминальном окне программу top, перейдите в режим отображения загрузки отдельных ядер вычислительной системы, нажав клавишу «1». В другом окне скомпилируйте модифицированную программу с игнорированием директив OpenMP и запустите ее. Проанализируйте загрузку ядер, отображаемую программой top.
- Скомпилируйте программу с поддержкой OpenMP. Запустите программу. Проанализируйте отличие в загрузке ядер в программе top.
- Проведите эксперименты с исключением опции reduction из примера 2, вынесением переменной id из класса частных в класс разделяемых переменных. Проанализируйте возникающие ошибочные ситуации.
- Перепишите программу из примера 2 без использования опции reduction, но с применением директивы critical.
На основании примеров и пояснений в теоретической части разработайте программу для решения задачи:
фильтрация изображений.
Освоить методы распараллеливания численных алгоритмов на регулярных сетках на примере реализации метода Якоби в трехмерной области.
Подробное описание в методическом указании.
Реализовать аналоги функций MPI_Send и MPI_Recv с помощью операций с сокетами. Реализовать задачу умножения матрицы на вектор, используя новые функции, сравнить с MPI-реализацией.