An open API service indexing awesome lists of open source software.

https://github.com/inanyan/uni-async-2


https://github.com/inanyan/uni-async-2

Last synced: 11 months ago
JSON representation

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 |