aleikin_artem_lab_5

This commit is contained in:
Артём Алейкин 2024-11-20 15:52:50 +04:00
parent 85147e5262
commit 664c94fb78
6 changed files with 125 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

View File

@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,99 @@
using System;
using System.Diagnostics;
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
// Размеры матриц
int[] sizes = { 100, 300, 500, 700, 1000 };
// Максимальное количество потоков
int maxThreads = 20;
foreach (var size in sizes)
{
Console.WriteLine($"\nРазмер матрицы: {size}x{size}");
// Генерация двух матриц
var matrixA = GenerateMatrix(size);
var matrixB = GenerateMatrix(size);
// Последовательное умножение
var stopwatch = Stopwatch.StartNew();
var resultSequential = MultiplyMatricesSequential(matrixA, matrixB);
stopwatch.Stop();
long timeSequential = stopwatch.ElapsedMilliseconds;
Console.WriteLine($"Последовательное умножение: {timeSequential} мс");
// Параллельное умножение с разным количеством потоков
Console.WriteLine("Параллельное умножение (время выполнения для каждого количества потоков):");
for (int threads = 1; threads <= maxThreads; threads++)
{
stopwatch.Restart();
var resultParallel = MultiplyMatricesParallel(matrixA, matrixB, threads);
stopwatch.Stop();
long timeParallel = stopwatch.ElapsedMilliseconds;
Console.WriteLine($"Потоков: {threads} — {timeParallel} мс");
}
}
}
// Генерация квадратной матрицы размером size x size
static double[,] GenerateMatrix(int size)
{
var random = new Random();
var matrix = new double[size, size];
for (int i = 0; i < size; i++)
for (int j = 0; j < size; j++)
matrix[i, j] = random.NextDouble();
return matrix;
}
// Последовательное умножение матриц
static double[,] MultiplyMatricesSequential(double[,] matrixA, double[,] matrixB)
{
int size = matrixA.GetLength(0);
var result = new double[size, size];
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
for (int k = 0; k < size; k++)
{
result[i, j] += matrixA[i, k] * matrixB[k, j];
}
}
}
return result;
}
// Параллельное умножение матриц
static double[,] MultiplyMatricesParallel(double[,] matrixA, double[,] matrixB, int threadCount)
{
int size = matrixA.GetLength(0);
var result = new double[size, size];
Parallel.For(0, threadCount, threadIndex =>
{
int rowsPerThread = size / threadCount;
int startRow = threadIndex * rowsPerThread;
int endRow = (threadIndex == threadCount - 1) ? size : startRow + rowsPerThread;
for (int i = startRow; i < endRow; i++)
{
for (int j = 0; j < size; j++)
{
for (int k = 0; k < size; k++)
{
result[i, j] += matrixA[i, k] * matrixB[k, j];
}
}
}
});
return result;
}
}

View File

@ -0,0 +1,16 @@
# Лабораторная работа 5 - Параллельное умножение матриц
## ПИбд-42 || Алейкин Артем
### Описание
В данной лабораторной работе мы вспоминали математику и работу с матрицами.
### Отчет
Написав алгоритм для перемножения матриц, как последовательно, так и в многопоточном режиме, получаю следующие графики времени.
![Матрицы 100х100 и 300х300](./Images/Отчет1.png)
![Матрицы 500х500 и 700х700](./Images/Отчет2.png)
![Матрица 1000х1000](./Images/Отчет3.png)
Выводы: последовательное выполнение выполняет вычисления довольно медленно.
В многопоточном формате каждый поток ускоряет вычисления по закону убывающей полезности.
Видео демонстрации работы: https://vk.com/video248424990_456239612?list=ln-mPzeO3z06S0FiqGXsz