From fb15f8716002c069948f3d1d22bd3f64d48b9072 Mon Sep 17 00:00:00 2001 From: AnnZhimol Date: Tue, 22 Oct 2024 18:23:30 +0300 Subject: [PATCH] lab 5 complete --- zhimolostnova_anna_lab_5/README.md | 75 ++++++++++++++++++++++ zhimolostnova_anna_lab_5/images/img.png | Bin 0 -> 51010 bytes zhimolostnova_anna_lab_5/images/img_1.png | Bin 0 -> 14096 bytes zhimolostnova_anna_lab_5/parallel.go | 72 +++++++++++++++++++++ zhimolostnova_anna_lab_5/regular.go | 45 +++++++++++++ zhimolostnova_anna_lab_5/util/matrix.go | 17 +++++ 6 files changed, 209 insertions(+) create mode 100644 zhimolostnova_anna_lab_5/README.md create mode 100644 zhimolostnova_anna_lab_5/images/img.png create mode 100644 zhimolostnova_anna_lab_5/images/img_1.png create mode 100644 zhimolostnova_anna_lab_5/parallel.go create mode 100644 zhimolostnova_anna_lab_5/regular.go create mode 100644 zhimolostnova_anna_lab_5/util/matrix.go diff --git a/zhimolostnova_anna_lab_5/README.md b/zhimolostnova_anna_lab_5/README.md new file mode 100644 index 0000000..ed266a5 --- /dev/null +++ b/zhimolostnova_anna_lab_5/README.md @@ -0,0 +1,75 @@ +# Отчет по лабораторной работе №5 + +## Описание задачи + +В лабораторной работе необходимо реализовать два алгоритма для умножения квадратных матриц: +последовательный и параллельный. Параллельный алгоритм должен поддерживать настройку количества потоков, +что позволит гибко распределять нагрузку. Бенчмарки проводились на матрицах размером 100x100, 300x300 +и 500x500 для анализа производительности каждого алгоритма. + +## Структура проекта + +Проект состоит из двух файлов с реализацией алгоритмов: + +- regular.go — реализация последовательного умножения матриц. +- parallel.go — реализация параллельного умножения матриц с заданным количеством потоков. +- matrix.go (в папке util) — вспомогательные функции для создания матриц. + +## Результаты + +### Последовательное умножение + +![img_1.png](images%2Fimg_1.png) + +| Размер матрицы | Время выполнения | +|-----------------|------------------| +| 100x100 | 2.1442ms | +| 300x300 | 59.4206ms | +| 500x500 | 382.7277ms | + +### Параллельное умножение + +![img.png](images%2Fimg.png) + +| Размер матрицы | Количество потоков | Время выполнения | +|----------------|--------------------|------------------| +| 100x100 | 2 | 1.1137ms | +| 100x100 | 4 | 524.1µs | +| 100x100 | 6 | 546.2µs | +| 100x100 | 8 | 527.6µs | +| 300x300 | 2 | 41.6503ms | +| 300x300 | 4 | 25.7563ms | +| 300x300 | 6 | 19.4356ms | +| 300x300 | 8 | 15.0006ms | +| 500x500 | 2 | 216.1878ms | +| 500x500 | 4 | 119.4361ms | +| 500x500 | 6 | 98.5036ms | +| 500x500 | 8 | 76.9725ms | + +## Анализ полученных данных + +1. Последовательное умножение: + - Время выполнения линейно увеличивается с ростом размера матрицы. Это связано с тем, + что алгоритм работает с комплексностью O(n³), где n — размер матрицы. + - Для больших матриц (500x500) время выполнения становится заметно больше, что подчеркивает + ограниченность этого метода при работе с большими объемами данных. +2. Параллельное умножение: + - Параллельный алгоритм показал значительное улучшение времени выполнения по сравнению с + последовательным, особенно при увеличении количества потоков. + - Например, для матриц 100x100 время выполнения снизилось с 1.6ms до 524.1µs при использовании + 4 потоков. + - Для матриц большего размера (500x500) прирост производительности также существенный: + с 393.65ms (последовательное умножение) до 76.97ms при 8 потоках. + - Однако, начиная с 6 потоков, улучшения становятся менее значительными. Это связано с накладными + расходами на синхронизацию потоков и передачу данных между ними. При небольших размерах матриц такие накладные расходы могут нивелировать прирост производительности. +3. Заключение: + - Параллельный алгоритм значительно превосходит последовательный при увеличении размера + матриц и количества потоков. Однако для небольших матриц с увеличением количества потоков, прирост + производительности не всегда оправдан из-за накладных расходов на управление потоками. + - Оптимальное количество потоков зависит от размера матриц: для небольших матриц 4 потока дают + значительное улучшение, а для матриц большего размера (500x500) лучше использовать 8 потоков для + максимальной эффективности. + +## Демонстрационное видео + +Видеозапись доступна по адресу: [https://vk.com/video193898050_456240873](https://vk.com/video193898050_456240873) \ No newline at end of file diff --git a/zhimolostnova_anna_lab_5/images/img.png b/zhimolostnova_anna_lab_5/images/img.png new file mode 100644 index 0000000000000000000000000000000000000000..96221f476aa8c6c9fc382fc70d7e3ddde8fda900 GIT binary patch literal 51010 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 cgH`ZKL(N+ETaiTMhDmH=t0uk81MF0Q* literal 0 HcmV?d00001 diff --git a/zhimolostnova_anna_lab_5/images/img_1.png b/zhimolostnova_anna_lab_5/images/img_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b8a44e56075306c111c9e733e9938f1718b7968e GIT binary patch literal 14096 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 R<9E6d+|$(8C{wcz`#=7s*S7!w literal 0 HcmV?d00001 diff --git a/zhimolostnova_anna_lab_5/parallel.go b/zhimolostnova_anna_lab_5/parallel.go new file mode 100644 index 0000000..715ccff --- /dev/null +++ b/zhimolostnova_anna_lab_5/parallel.go @@ -0,0 +1,72 @@ +package main + +import ( + "fmt" + "strconv" + "sync" + "time" + "zhimolostnova_anna_lab_5/util" +) + +// Параллельное умножение матриц +func multiplyMatricesParallel(a, b [][]int, threads int) [][]int { + size := len(a) + result := make([][]int, size) + for i := range result { + result[i] = make([]int, size) + } + + // Функция для обработки части работы потока + worker := func(startRow, endRow int, wg *sync.WaitGroup) { + defer wg.Done() + for i := startRow; i < endRow; i++ { + for j := 0; j < size; j++ { + for k := 0; k < size; k++ { + result[i][j] += a[i][k] * b[k][j] + } + } + } + } + + // Запуск потоков + var wg sync.WaitGroup + rowsPerThread := size / threads + for i := 0; i < threads; i++ { + startRow := i * rowsPerThread + endRow := startRow + rowsPerThread + if i == threads-1 { + endRow = size + } + wg.Add(1) + go worker(startRow, endRow, &wg) + } + + wg.Wait() + return result +} + +func benchmarkMatrixMultiplication(sizes []int, threadsList []int) { + for _, size := range sizes { + for _, threads := range threadsList { + matrixA := util.CreateMatrix(size) + matrixB := util.CreateMatrix(size) + + start := time.Now() + _ = multiplyMatricesParallel(matrixA, matrixB, threads) + elapsed := time.Since(start) + + fmt.Printf("Parallel multiplication of matrix %sx%s with %d threads took %s\n", strconv.Itoa(size), strconv.Itoa(size), threads, elapsed) + } + } +} + +func main() { + // Список размерностей матриц + sizes := []int{100, 300, 500} + + // Список количества потоков для тестирования + threadsList := []int{2, 4, 6, 8} + + // Запуск бенчмарка + benchmarkMatrixMultiplication(sizes, threadsList) +} diff --git a/zhimolostnova_anna_lab_5/regular.go b/zhimolostnova_anna_lab_5/regular.go new file mode 100644 index 0000000..2a4d43b --- /dev/null +++ b/zhimolostnova_anna_lab_5/regular.go @@ -0,0 +1,45 @@ +package main + +import ( + "fmt" + "strconv" + "time" + "zhimolostnova_anna_lab_5/util" +) + +// Последовательное умножение двух квадратных матриц +func multiplyMatricesSequential(a, b [][]int) [][]int { + size := len(a) + result := make([][]int, size) + for i := range result { + result[i] = make([]int, size) + for j := 0; j < size; j++ { + for k := 0; k < size; k++ { + result[i][j] += a[i][k] * b[k][j] + } + } + } + return result +} + +// Функция для бенчмарка последовательного умножения +func benchmarkMatrixMultiplicationSequential(sizes []int) { + for _, size := range sizes { + matrixA := util.CreateMatrix(size) + matrixB := util.CreateMatrix(size) + + start := time.Now() + _ = multiplyMatricesSequential(matrixA, matrixB) + elapsed := time.Since(start) + + fmt.Printf("Sequential multiplication of matrix %sx%s took %s\n", strconv.Itoa(size), strconv.Itoa(size), elapsed) + } +} + +func main() { + // Список размерностей матриц + sizes := []int{100, 300, 500} + + // Запуск бенчмарка + benchmarkMatrixMultiplicationSequential(sizes) +} diff --git a/zhimolostnova_anna_lab_5/util/matrix.go b/zhimolostnova_anna_lab_5/util/matrix.go new file mode 100644 index 0000000..5162b41 --- /dev/null +++ b/zhimolostnova_anna_lab_5/util/matrix.go @@ -0,0 +1,17 @@ +package util + +import ( + "math/rand" +) + +// CreateMatrix Функция для создания квадратной матрицы заданного размера +func CreateMatrix(size int) [][]int { + matrix := make([][]int, size) + for i := range matrix { + matrix[i] = make([]int, size) + for j := range matrix[i] { + matrix[i][j] = rand.Intn(25) // Заполняем случайными числами от 0 до 25 + } + } + return matrix +}