https://github.com/inanyan/uni-async-2
https://github.com/inanyan/uni-async-2
Last synced: 11 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/inanyan/uni-async-2
- Owner: InAnYan
- Created: 2025-03-11T13:55:37.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2025-05-13T10:46:24.000Z (about 1 year ago)
- Last Synced: 2025-05-13T11:38:59.732Z (about 1 year ago)
- Language: Java
- Size: 6.84 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Звіт з виконання Лабораторної роботи №2 з дисципліни 1-123-5
**Дисципліна**: Асинхронне і багатопотокове програмування.
**Роботу виконав**: Попов Руслан Олександрович, гр. КІ-23-1.
## Умови
Розробіть багатопотокову програму, яка виконує обчислення добутку матриць **A** (m×n) та **B** (n×k).
Елементи цієї матриці добутку **C = A×B** обчислюються паралельно розміром пулу потоків одночасними потоками.
- Якщо деякий потік вже обчислює елемент **C[jj]** матриці **C**, наступний потік, що приступає до обчислення, вибирає для розрахунку елемент **C[j+1][k]**, якщо **j < k**, і **C[i+1][k]**, якщо **j = k**.
- Виконання обчислення елемента матриці-добутку потік перевіряє, чи немає елемента, який ще не розрахований. Якщо такий елемент є, то потік починає його розрахунок.
- В іншому випадку передбачте користувачу повідомлення про завершення своєї роботи за умови її виконання.
- Головний потік, отримавши повідомлення про завершення обчислень всіх потоків, виводить результат на екран.
- Вивід на екран матриці добутку виконуйте форматовано.
Виконайте це завдання за допомогою одного з традиційних пулів потоків і за допомогою **VirtualThreads**.
Використайте **VirtualThreads** у двох варіантах:
1. **Без обмеження кількості віртуальних потоків.**
2. **З обмеженням кількості віртуальних потоків** до кількості традиційних kernel потоків, які ви використовували на першому етапі роботи, за допомогою **Semaphore**.
Приклад використання семафору:
[Документація Oracle](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html#GUID-E695A4C5-D335-4FA4-B886-FE88C73F23E)
Порівняйте швидкодію в обох випадках при роботі з великими матрицями за допомогою фреймворка **JMH**.
## Результати
Here's your data formatted as a markdown table:
| Benchmark | (size) | (threadCount) | Mode | Cnt | Score | Error | Units |
|-----------|--------|---------------|------|-----|-------|-------|-------|
| MyBenchmark.simplePool | 1000 | 4 | avgt | 10 | 659.449 | ± 454.090 | ms/op |
| MyBenchmark.simplePool | 1000 | 10 | avgt | 10 | 568.251 | ± 335.395 | ms/op |
| MyBenchmark.virtualThreadsBound | 1000 | 4 | avgt | 10 | 563.215 | ± 159.798 | ms/op |
| MyBenchmark.virtualThreadsBound | 1000 | 10 | avgt | 10 | 500.103 | ± 363.622 | ms/op |
| MyBenchmark.virtualThreadsUnbound | 1000 | 4 | avgt | 10 | 475.990 | ± 319.491 | ms/op |
| MyBenchmark.virtualThreadsUnbound | 1000 | 10 | avgt | 10 | 542.075 | ± 187.629 | ms/op |