aleikin_artem_lab_5 #226
17
.gitignore
vendored
Normal file
17
.gitignore
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
################################################################################
|
||||||
|
# Данный GITIGNORE-файл был автоматически создан Microsoft(R) Visual Studio.
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
/.vs
|
||||||
|
/aleikin_artem_lab_3
|
||||||
|
/aleikin_artem_lab_4
|
||||||
|
/aleikin_artem_lab_5/MultiplyMatrix/.vs/MultiplyMatrix
|
||||||
|
/aleikin_artem_lab_5/MultiplyMatrix/bin/Debug/net8.0
|
||||||
|
/aleikin_artem_lab_5/MultiplyMatrix/obj
|
||||||
|
/aleikin_artem_lab_5/MultiplyMatrix/MultiplyMatrix.sln
|
||||||
|
/dozorova_alena_lab_2
|
||||||
|
/dozorova_alena_lab_3
|
||||||
|
/dozorova_alena_lab_4
|
||||||
|
/dozorova_alena_lab_5/ConsoleApp1/obj
|
||||||
|
/dozorova_alena_lab_5/ConsoleApp1/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs
|
||||||
|
/dozorova_alena_lab_6/ConsoleApp1/obj
|
BIN
aleikin_artem_lab_5/Images/Отчет1.png
Normal file
BIN
aleikin_artem_lab_5/Images/Отчет1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 61 KiB |
BIN
aleikin_artem_lab_5/Images/Отчет2.png
Normal file
BIN
aleikin_artem_lab_5/Images/Отчет2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 67 KiB |
BIN
aleikin_artem_lab_5/Images/Отчет3.png
Normal file
BIN
aleikin_artem_lab_5/Images/Отчет3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 35 KiB |
10
aleikin_artem_lab_5/MultiplyMatrix/MultiplyMatrix.csproj
Normal file
10
aleikin_artem_lab_5/MultiplyMatrix/MultiplyMatrix.csproj
Normal 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>
|
99
aleikin_artem_lab_5/MultiplyMatrix/Program.cs
Normal file
99
aleikin_artem_lab_5/MultiplyMatrix/Program.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
16
aleikin_artem_lab_5/readme.md
Normal file
16
aleikin_artem_lab_5/readme.md
Normal 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
|
Loading…
Reference in New Issue
Block a user