lab 6 is ready
This commit is contained in:
parent
60ef5724cd
commit
064fbfe890
31
volkov_rafael_lab_6/README.md
Normal file
31
volkov_rafael_lab_6/README.md
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# Лабораторная работа №6
|
||||||
|
|
||||||
|
Задание:
|
||||||
|
|
||||||
|
Требуется сделать два алгоритма: обычный и параллельный. В параллельном алгоритме предусмотреть ручное задание количества потоков, каждый из которых будет выполнять нахождение отдельной группы множителей.
|
||||||
|
|
||||||
|
Сделать несколько бенчмарков последовательного и параллельного алгоритма поиска детерминанта матрицы размером 100x100, 300x300, 500x500 элементов. Отразить свои наблюдения в readme-отчете.
|
||||||
|
|
||||||
|
<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/1iRBMH7q0hDcnjJdc5xW9Fy3K8da1ioNi/view?usp=sharing)
|
BIN
volkov_rafael_lab_6/screens/img1.png
Normal file
BIN
volkov_rafael_lab_6/screens/img1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 73 KiB |
BIN
volkov_rafael_lab_6/screens/img2.png
Normal file
BIN
volkov_rafael_lab_6/screens/img2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 90 KiB |
BIN
volkov_rafael_lab_6/screens/img3.png
Normal file
BIN
volkov_rafael_lab_6/screens/img3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 142 KiB |
BIN
volkov_rafael_lab_6/screens/img4.png
Normal file
BIN
volkov_rafael_lab_6/screens/img4.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 34 KiB |
16
volkov_rafael_lab_6/volkov_rafael_lab_6.sln
Normal file
16
volkov_rafael_lab_6/volkov_rafael_lab_6.sln
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "volkov_rafael_lab_6", "volkov_rafael_lab_6\volkov_rafael_lab_6.csproj", "{220726F0-CFF1-4C4A-B032-1B558BC62238}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{220726F0-CFF1-4C4A-B032-1B558BC62238}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{220726F0-CFF1-4C4A-B032-1B558BC62238}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{220726F0-CFF1-4C4A-B032-1B558BC62238}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{220726F0-CFF1-4C4A-B032-1B558BC62238}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
102
volkov_rafael_lab_6/volkov_rafael_lab_6/Program.cs
Normal file
102
volkov_rafael_lab_6/volkov_rafael_lab_6/Program.cs
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static double[,] GenerateRandomMatrix(int size)
|
||||||
|
{
|
||||||
|
Random random = new Random();
|
||||||
|
double[,] matrix = new double[size, size];
|
||||||
|
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < size; j++)
|
||||||
|
{
|
||||||
|
matrix[i, j] = random.Next(0, 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return matrix;
|
||||||
|
}
|
||||||
|
|
||||||
|
static double SequentialMatrixDeterminant(double[,] matrix)
|
||||||
|
{
|
||||||
|
int size = matrix.GetLength(0);
|
||||||
|
double det = 1;
|
||||||
|
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
det *= matrix[i, i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return det;
|
||||||
|
}
|
||||||
|
|
||||||
|
static double ParallelMatrixDeterminant(double[,] matrix, int numThreads)
|
||||||
|
{
|
||||||
|
int size = matrix.GetLength(0);
|
||||||
|
int chunkSize = size / numThreads;
|
||||||
|
|
||||||
|
double[] determinants = new double[numThreads];
|
||||||
|
object lockObject = new object();
|
||||||
|
|
||||||
|
Parallel.For(0, numThreads, threadIndex =>
|
||||||
|
{
|
||||||
|
int startRow = threadIndex * chunkSize;
|
||||||
|
int endRow = (threadIndex == numThreads - 1) ? size : (threadIndex + 1) * chunkSize;
|
||||||
|
|
||||||
|
double threadDeterminant = 1;
|
||||||
|
for (int i = startRow; i < endRow; i++)
|
||||||
|
{
|
||||||
|
threadDeterminant *= matrix[i, i];
|
||||||
|
}
|
||||||
|
|
||||||
|
lock (lockObject)
|
||||||
|
{
|
||||||
|
determinants[threadIndex] = threadDeterminant;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
double resultDeterminant = 1;
|
||||||
|
foreach (var det in determinants)
|
||||||
|
{
|
||||||
|
resultDeterminant *= det;
|
||||||
|
}
|
||||||
|
|
||||||
|
return resultDeterminant;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Tuple<double, double> Benchmark(int matrixSize, int numThreads)
|
||||||
|
{
|
||||||
|
double[,] matrix = GenerateRandomMatrix(matrixSize);
|
||||||
|
|
||||||
|
// Замер времени для последовательного алгоритма
|
||||||
|
Stopwatch stopwatch = Stopwatch.StartNew();
|
||||||
|
double sequentialResult = SequentialMatrixDeterminant(matrix);
|
||||||
|
double sequentialTime = stopwatch.Elapsed.TotalSeconds;
|
||||||
|
|
||||||
|
// Замер времени для параллельного алгоритма
|
||||||
|
stopwatch.Restart();
|
||||||
|
double parallelResult = ParallelMatrixDeterminant(matrix, numThreads);
|
||||||
|
double parallelTime = stopwatch.Elapsed.TotalSeconds;
|
||||||
|
|
||||||
|
return Tuple.Create(sequentialTime, parallelTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Main()
|
||||||
|
{
|
||||||
|
int[] matrixSizes = { 100, 300, 500 }; // Для демонстрации используем небольшие матрицы
|
||||||
|
Console.Write("Введите количество потоков: ");
|
||||||
|
int numThreads = int.Parse(Console.ReadLine());
|
||||||
|
|
||||||
|
foreach (var size in matrixSizes)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Matrix size: {size}x{size}");
|
||||||
|
var times = Benchmark(size, numThreads);
|
||||||
|
|
||||||
|
Console.WriteLine($"Sequential algorithm time: {times.Item1:F6} seconds");
|
||||||
|
Console.WriteLine($"Parallel algorithm time ({numThreads} threads): {times.Item2:F6} seconds");
|
||||||
|
|
||||||
|
Console.WriteLine(new string('=', 30));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
<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