https://github.com/everysoftware/hse-dc-lab1
Pthreads (distributed computations)
https://github.com/everysoftware/hse-dc-lab1
Last synced: about 1 year ago
JSON representation
Pthreads (distributed computations)
- Host: GitHub
- URL: https://github.com/everysoftware/hse-dc-lab1
- Owner: everysoftware
- License: mit
- Created: 2024-10-22T15:32:31.000Z (over 1 year ago)
- Default Branch: master
- Last Pushed: 2024-10-22T19:12:18.000Z (over 1 year ago)
- Last Synced: 2025-02-19T12:52:10.438Z (about 1 year ago)
- Language: C
- Size: 1.22 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Lab1 - Pthreads
| Выполнил | Стасевич Иван Александрович |
|------------|-------------------------------------------|
| Группа | 21ПИ-1 |
| Почта | iastasevich@edu.hse.ru |
| ОС | Windows 11 x64 |
| RAM | 16GB |
| CPU | Intel Core i5-12500H, 12 ядер, 16 потоков |
| Компилятор | GCC-MinGW |
## Условие
См. `task.pdf`
## 1. Вычисление ПИ
**Код:** `src/montecarlo`
**Алгоритм:** генерируем массив случайных точек и делим его на части, предоставляя каждому потоку указатель на свою
область
массива
и количество точек для обработки. Каждый поток проверяет условие
x^2 + y^2 <= 1 для своих точек и увеличивает счётчик точек, попавших в окружность. По завершении работы всех потоков мы
суммируем результаты и вычисляем значение числа ПИ на основе полученных данных.
**Результаты:**

**Выводы:** Использование многопоточности весьма эффективно в вычислениях. Увеличение числа потоков улучшает
производительность вычислений, с наибольшими улучшениями до 8
потоков. Эффективность многопоточности начинает уменьшаться после 4 потоков, вероятно, из-за накладных расходов на
управление потоками. Накладные расходы максимально заметны на маленьких данных, из-за чего использование многопоточности
на таких объемах становится неэффективно.
## 2. Множество Мандельброта
**Код:** `src/mandelbrot`
**Алгоритм:**
Определяем глобальные переменные для всех потоков: одна отслеживает количество найденных точек, а другая содержит
массив этих точек. Как только мы достигаем требуемого количества точек, все потоки прекращают работу. В начале мы
вычисляем `x_start` и `x_end`, ограничивая область поиска точек Мандельброта для каждого потока в зависимости от их
количества. Эти переменные рассчитаны так, чтобы потоки не обрабатывали одни и те же числа. Кроме того, при нахождении
точки поток блокирует мьютекс и обновляет глобальные переменные, изменяя количество точек и массив точек.
**Результаты:**

**Выводы:** Многопоточность значительно улучшает производительность при поиске множества Мандельброта, особенно на
больших данных. На них мы видим значительное улучшение производительности, но с уменьшением прироста после
4 потоков. На малых объемах данных создание и управление потоками может накладывать дополнительные затраты, что может
быть причиной незначительных улучшений при увеличении количества потоков.
Оптимальная эффективность достигается при использовании 6-8 потоков, при этом увеличение количества
потоков за эти пределы может не всегда быть оправданным из-за накладных расходов на управление потоками.
## 3. Read-write lock
**Код:** `src/rwlock`
**Алгоритм:**
**wrlock():**
Мы увеличиваем количество ожидающих писателей. Затем, если rwlock в данный момент блокируется читателем, мы ждем, пока
он не освободится. В противном случае, ждем, пока все читатели не прекратят чтение. Затем уменьшаем количество ожидающих
писателей и ставим флаг, что в данный момент есть один писатель
**rdlock():** Мы увеличиваем счетчик ожидающих читателей. Ждем, пока писатель освободит условную переменную. Затем
уменьшаем количество ожидающих читателей и увеличиваем счетчик читателей.
**unlock():** Если rwlock заблокирован писателем, то снимаем флаг блокировки писателя. Если количество ожидающих
писателей больше
нуля, я уведомляю их. Если ожидающих писателей нет, уведомляем всех ожидающих читателей. Если rwlock был заблокирован
читателем, то если этот читатель не последний, просто уменьшаем счетчик читателей. Если это последний читатель,
уведомляю писателей, что поток освобожден.
**Результаты:**
Тестирование проводилось с 75000 ключами, 1000 операциями и 0,5 коэфициентами операций поиска и вставки с количеством
потоков: 1, 4 и 8.
**1 поток (pthread)**
```text
Inserted 75000 keys in empty list
Rwlock implementation: pthread
Elapsed time = 4.758072e-01 seconds
Total ops = 1000
member ops = 536
insert ops = 464
delete ops = 0
```
**1 поток (my)**
```text
Inserted 75000 keys in empty list
Rwlock implementation: my
[MY] Elapsed time = 5.047100e-01 seconds
[MY] Total ops = 1000
[MY] member ops = 536
[MY] insert ops = 464
[MY] delete ops = 0
```
**4 потока (pthread)**
```text
Inserted 75000 keys in empty list
Rwlock implementation: pthread
Elapsed time = 4.312670e-01 seconds
Total ops = 1000
member ops = 494
insert ops = 506
delete ops = 0
```
**4 потока (my)**
```text
Inserted 75000 keys in empty list
Rwlock implementation: my
[MY] Elapsed time = 1.249099e-01 seconds
[MY] Total ops = 1000
[MY] member ops = 494
[MY] insert ops = 506
[MY] delete ops = 0
```
**8 потоков (pthread)**
```text
Inserted 75000 keys in empty list
Rwlock implementation: pthread
Elapsed time = 4.190049e-01 seconds
Total ops = 1000
member ops = 504
insert ops = 496
delete ops = 0
```
**8 потоков (my)**
```text
Inserted 75000 keys in empty list
Rwlock implementation: my
[MY] Elapsed time = 6.665707e-02 seconds
[MY] Total ops = 1000
[MY] member ops = 504
[MY] insert ops = 496
[MY] delete ops = 0
```
**Выводы:** Собственная реализация rwlock превосходит реализацию с использованием pthreads в многопоточных тестах,
демонстрируя
лучшую производительность и масштабируемость. Особенно заметны улучшения при увеличении числа потоков до 4 и 8.