Compare commits
No commits in common. "volkov_rafael_lab_5" and "main" have entirely different histories.
volkov_raf
...
main
@ -1,30 +0,0 @@
|
|||||||
# Лабораторная работа №5
|
|
||||||
|
|
||||||
Задание:
|
|
||||||
|
|
||||||
Требуется сделать два алгоритма: обычный и параллельный. В параллельном алгоритме предусмотреть ручное задание количества потоков, каждый из которых будет выполнять умножение элементов матрицы в рамках своей зоны ответственности.
|
|
||||||
|
|
||||||
Сделать несколько бенчмарков последовательного и параллельного алгоритма на умножение двух матриц размером 100x100, 300x300, 500x500 элементов.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<div>Код программы</div>
|
|
||||||
<img src="screens/img1.png" width="650" title="Код программы">
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<div>Код программы</div>
|
|
||||||
<img src="screens/img2.png" width="650" title="Код программы">
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<div>Код программы</div>
|
|
||||||
<img src="screens/img3.png" width="650" title="Код программы">
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<div>Результат программы</div>
|
|
||||||
<img src="screens/img4.png" width="650" title="Результат программы">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
Вывод: Параллельный алгоритм не сильно ускорил работу программы, его стоит использовить при матрице большего размера например 10000х10000
|
|
||||||
|
|
||||||
# Видео
|
|
||||||
|
|
||||||
Видео с разбором лабораторной работы - [Видео](https://drive.google.com/file/d/1QazsGcupE0TkhUA3QUuc6_hL2K-p579R/view?usp=sharing)
|
|
Binary file not shown.
Before Width: | Height: | Size: 136 KiB |
Binary file not shown.
Before Width: | Height: | Size: 147 KiB |
Binary file not shown.
Before Width: | Height: | Size: 117 KiB |
Binary file not shown.
Before Width: | Height: | Size: 38 KiB |
@ -1,16 +0,0 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "volkov_rafael_lab_5", "volkov_rafael_lab_5\volkov_rafael_lab_5.csproj", "{02BDE79B-7993-4361-8AFA-E12E54B77931}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Any CPU = Debug|Any CPU
|
|
||||||
Release|Any CPU = Release|Any CPU
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{02BDE79B-7993-4361-8AFA-E12E54B77931}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{02BDE79B-7993-4361-8AFA-E12E54B77931}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{02BDE79B-7993-4361-8AFA-E12E54B77931}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{02BDE79B-7993-4361-8AFA-E12E54B77931}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
@ -1,124 +0,0 @@
|
|||||||
using System.Diagnostics;
|
|
||||||
|
|
||||||
class MatrixMultiplication
|
|
||||||
{
|
|
||||||
static void Main()
|
|
||||||
{
|
|
||||||
int[] matrixSizes = { 100, 300, 500 };
|
|
||||||
Console.Write("Введите количество потоков: ");
|
|
||||||
int numThreads = int.Parse(Console.ReadLine());
|
|
||||||
|
|
||||||
foreach (int size in matrixSizes)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Размер матрицы: {size}x{size}");
|
|
||||||
var (sequentialTime, parallelTime) = Benchmark(size, numThreads);
|
|
||||||
|
|
||||||
Console.WriteLine($"Время последовательного алгоритма: {sequentialTime:F6} секунд");
|
|
||||||
Console.WriteLine($"Время параллельного алгоритма ({numThreads} потоков): {parallelTime:F6} секунд");
|
|
||||||
|
|
||||||
Console.WriteLine(new string('=', 30));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static double[,] SequentialMatrixMultiply(double[,] matrixA, double[,] matrixB)
|
|
||||||
{
|
|
||||||
int rowsA = matrixA.GetLength(0);
|
|
||||||
int colsB = matrixB.GetLength(1);
|
|
||||||
int colsA = matrixA.GetLength(1);
|
|
||||||
|
|
||||||
double[,] result = new double[rowsA, colsB];
|
|
||||||
|
|
||||||
for (int i = 0; i < rowsA; i++)
|
|
||||||
{
|
|
||||||
for (int j = 0; j < colsB; j++)
|
|
||||||
{
|
|
||||||
for (int k = 0; k < colsA; k++)
|
|
||||||
{
|
|
||||||
result[i, j] += matrixA[i, k] * matrixB[k, j];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static double[,] ParallelMatrixMultiply(double[,] matrixA, double[,] matrixB, int numThreads)
|
|
||||||
{
|
|
||||||
int rowsA = matrixA.GetLength(0);
|
|
||||||
int colsB = matrixB.GetLength(1);
|
|
||||||
int colsA = matrixA.GetLength(1);
|
|
||||||
|
|
||||||
double[,] result = new double[rowsA, colsB];
|
|
||||||
|
|
||||||
int chunkSize = rowsA / numThreads;
|
|
||||||
|
|
||||||
ManualResetEventSlim[] events = new ManualResetEventSlim[numThreads];
|
|
||||||
|
|
||||||
for (int i = 0; i < numThreads; i++)
|
|
||||||
{
|
|
||||||
events[i] = new ManualResetEventSlim(false);
|
|
||||||
int startRow = i * chunkSize;
|
|
||||||
int endRow = (i + 1 == numThreads) ? rowsA : (i + 1) * chunkSize;
|
|
||||||
|
|
||||||
ThreadPool.QueueUserWorkItem(state =>
|
|
||||||
{
|
|
||||||
MultiplyChunk(startRow, endRow, matrixA, matrixB, result);
|
|
||||||
events[(int)state].Set();
|
|
||||||
}, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
WaitHandle.WaitAll(events.Select(e => (WaitHandle)e.WaitHandle).ToArray());
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void MultiplyChunk(int startRow, int endRow, double[,] matrixA, double[,] matrixB, double[,] result)
|
|
||||||
{
|
|
||||||
int colsA = matrixA.GetLength(1);
|
|
||||||
|
|
||||||
for (int i = startRow; i < endRow; i++)
|
|
||||||
{
|
|
||||||
for (int j = 0; j < result.GetLength(1); j++)
|
|
||||||
{
|
|
||||||
for (int k = 0; k < colsA; k++)
|
|
||||||
{
|
|
||||||
result[i, j] += matrixA[i, k] * matrixB[k, j];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static (double, double) Benchmark(int matrixSize, int numThreads)
|
|
||||||
{
|
|
||||||
double[,] matrixA = GenerateRandomMatrix(matrixSize, matrixSize);
|
|
||||||
double[,] matrixB = GenerateRandomMatrix(matrixSize, matrixSize);
|
|
||||||
|
|
||||||
// Замер времени для последовательного алгоритма
|
|
||||||
Stopwatch stopwatch = Stopwatch.StartNew();
|
|
||||||
double[,] sequentialResult = SequentialMatrixMultiply(matrixA, matrixB);
|
|
||||||
double sequentialTime = stopwatch.Elapsed.TotalSeconds;
|
|
||||||
|
|
||||||
// Замер времени для параллельного алгоритма
|
|
||||||
stopwatch.Restart();
|
|
||||||
double[,] parallelResult = ParallelMatrixMultiply(matrixA, matrixB, numThreads);
|
|
||||||
double parallelTime = stopwatch.Elapsed.TotalSeconds;
|
|
||||||
|
|
||||||
return (sequentialTime, parallelTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
static double[,] GenerateRandomMatrix(int rows, int cols)
|
|
||||||
{
|
|
||||||
double[,] matrix = new double[rows, cols];
|
|
||||||
Random random = new Random();
|
|
||||||
|
|
||||||
for (int i = 0; i < rows; i++)
|
|
||||||
{
|
|
||||||
for (int j = 0; j < cols; j++)
|
|
||||||
{
|
|
||||||
matrix[i, j] = random.Next(10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return matrix;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Content Include="..\README.md">
|
|
||||||
<Link>README.md</Link>
|
|
||||||
</Content>
|
|
||||||
<Content Include="..\screens\img1.png">
|
|
||||||
<Link>screens\img1.png</Link>
|
|
||||||
</Content>
|
|
||||||
<Content Include="..\screens\img2.png">
|
|
||||||
<Link>screens\img2.png</Link>
|
|
||||||
</Content>
|
|
||||||
<Content Include="..\screens\img3.png">
|
|
||||||
<Link>screens\img3.png</Link>
|
|
||||||
</Content>
|
|
||||||
<Content Include="..\screens\img4.png">
|
|
||||||
<Link>screens\img4.png</Link>
|
|
||||||
</Content>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
Loading…
Reference in New Issue
Block a user