forked from Alexey/DAS_2024_1
Merge pull request 'dozorova_alena_lab_6' (#76) from dozorova_alena_lab_6 into main
Reviewed-on: Alexey/DAS_2024_1#76
This commit is contained in:
commit
f46724e5cf
12
dozorova_alena_lab_6/.gitignore
vendored
Normal file
12
dozorova_alena_lab_6/.gitignore
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
/dozorova_alena_lab_2/.vs
|
||||||
|
/dozorova_alena_lab_2/ConsoleApp1/.vs
|
||||||
|
/dozorova_alena_lab_2/ConsoleApp1/bin
|
||||||
|
/dozorova_alena_lab_2/ConsoleApp1/obj
|
||||||
|
/dozorova_alena_lab_2/ConsoleApp1/Properties/PublishProfiles
|
||||||
|
/dozorova_alena_lab_2/ConsoleApp2/.vs
|
||||||
|
/dozorova_alena_lab_2/ConsoleApp2/bin
|
||||||
|
/dozorova_alena_lab_2/ConsoleApp2/obj
|
||||||
|
/dozorova_alena_lab_6/ConsoleApp1/.vs
|
||||||
|
/dozorova_alena_lab_6/ConsoleApp1/bin
|
||||||
|
/dozorova_alena_lab_6/ConsoleApp1/obj
|
10
dozorova_alena_lab_6/ConsoleApp1/ConsoleApp1.csproj
Normal file
10
dozorova_alena_lab_6/ConsoleApp1/ConsoleApp1.csproj
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
25
dozorova_alena_lab_6/ConsoleApp1/ConsoleApp1.sln
Normal file
25
dozorova_alena_lab_6/ConsoleApp1/ConsoleApp1.sln
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.10.35004.147
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp1", "ConsoleApp1.csproj", "{29269567-7466-4C99-BEEF-F5766BDDFB24}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{29269567-7466-4C99-BEEF-F5766BDDFB24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{29269567-7466-4C99-BEEF-F5766BDDFB24}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{29269567-7466-4C99-BEEF-F5766BDDFB24}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{29269567-7466-4C99-BEEF-F5766BDDFB24}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {EDED6E1D-0A86-43F9-94EA-6ADCC1FA1B42}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
55
dozorova_alena_lab_6/ConsoleApp1/Extention.cs
Normal file
55
dozorova_alena_lab_6/ConsoleApp1/Extention.cs
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Numerics;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace ConsoleApp1
|
||||||
|
{
|
||||||
|
public static class Extention
|
||||||
|
{
|
||||||
|
public static int[,] CreateMatrixWithoutColumn(this int[,] matrix, int column)
|
||||||
|
{
|
||||||
|
var result = new int[matrix.GetLength(0), matrix.GetLength(1) - 1];
|
||||||
|
for (int i = 0; i < matrix.GetLength(0); i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < matrix.GetLength(1) - 1; j++)
|
||||||
|
{
|
||||||
|
result[i, j] = j < column ? matrix[i, j] : matrix[i, j + 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int[,] CreateMatrixWithoutRow(this int[,] matrix, int row)
|
||||||
|
{
|
||||||
|
var result = new int[matrix.GetLength(0) - 1, matrix.GetLength(1)];
|
||||||
|
for (int i = 0; i < matrix.GetLength(0) - 1; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < matrix.GetLength(1); j++)
|
||||||
|
{
|
||||||
|
result[i, j] = i < row ? matrix[i, j] : matrix[i + 1, j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double CalculateDeterminant(this int[,] matrix)
|
||||||
|
{
|
||||||
|
if (matrix.GetLength(0) == 2)
|
||||||
|
{
|
||||||
|
return matrix[0, 0] * matrix[1, 1] - matrix[0, 1] * matrix[1, 0];
|
||||||
|
}
|
||||||
|
double result = 0;
|
||||||
|
for (var j = 0; j < matrix.GetLength(0); j++)
|
||||||
|
{
|
||||||
|
result += (j % 2 == 1 ? 1 : -1) * matrix[1, j] *
|
||||||
|
matrix.CreateMatrixWithoutColumn(j).CreateMatrixWithoutRow(1).CalculateDeterminant();
|
||||||
|
}
|
||||||
|
//Console.WriteLine("Ко мне пришли с размером " + matrix.GetLength(0));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
87
dozorova_alena_lab_6/ConsoleApp1/Program.cs
Normal file
87
dozorova_alena_lab_6/ConsoleApp1/Program.cs
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
|
||||||
|
using ConsoleApp1;
|
||||||
|
using System.Data.Common;
|
||||||
|
using System.Diagnostics;
|
||||||
|
internal class Program
|
||||||
|
{
|
||||||
|
private static void Main(string[] args)
|
||||||
|
{
|
||||||
|
var value = new int[3] {100, 300, 500 };
|
||||||
|
|
||||||
|
foreach(var i in value)
|
||||||
|
{
|
||||||
|
var a = CreateMatrix(i, i);
|
||||||
|
var b = CreateMatrix(i, i);
|
||||||
|
|
||||||
|
List<long> times = new() {};
|
||||||
|
Console.WriteLine("Для пяти потоков: ");
|
||||||
|
for (int j = 1; j <= 5; j++)
|
||||||
|
{
|
||||||
|
var sw = new Stopwatch();
|
||||||
|
sw.Start();
|
||||||
|
|
||||||
|
Calculate(a, j);
|
||||||
|
|
||||||
|
sw.Stop();
|
||||||
|
times.Add(sw.ElapsedTicks);
|
||||||
|
}
|
||||||
|
Console.WriteLine("Количество тиков для вычисления матрицы стороной "+i+": "+string.Join("\t", times));
|
||||||
|
|
||||||
|
Console.WriteLine("Для десяти потоков: ");
|
||||||
|
for (int j = 1; j <= 10; j++)
|
||||||
|
{
|
||||||
|
var sw = new Stopwatch();
|
||||||
|
sw.Start();
|
||||||
|
|
||||||
|
Calculate(a, j);
|
||||||
|
|
||||||
|
sw.Stop();
|
||||||
|
times.Add(sw.ElapsedTicks);
|
||||||
|
}
|
||||||
|
Console.WriteLine("Количество тиков для вычисления матрицы стороной " + i + ": " + string.Join("\t", times));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int[,] CreateMatrix(int x, int y)
|
||||||
|
{
|
||||||
|
var rnd = new Random();
|
||||||
|
|
||||||
|
var res = new int[y, x];
|
||||||
|
|
||||||
|
for (int i = 0; i < y; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < x; j++)
|
||||||
|
{
|
||||||
|
res[i, j] = rnd.Next(0, 100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static double Calculate(int[,] matrix, int maxTask)
|
||||||
|
{
|
||||||
|
double res = 0;
|
||||||
|
|
||||||
|
var semaphore = new SemaphoreSlim(maxTask, maxTask);
|
||||||
|
|
||||||
|
for (var j = 0; j < matrix.GetLength(0) - 1; j++)
|
||||||
|
{
|
||||||
|
_ = Task.Run(() =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
semaphore.Wait();
|
||||||
|
res += (j % 2 == 1 ? 1 : -1) * matrix[1, j] *
|
||||||
|
matrix.CreateMatrixWithoutColumn(j).
|
||||||
|
CreateMatrixWithoutRow(1).CalculateDeterminant();
|
||||||
|
}
|
||||||
|
finally { semaphore.Release(); }
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
semaphore.Wait(maxTask);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
18
dozorova_alena_lab_6/README.md
Normal file
18
dozorova_alena_lab_6/README.md
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# Лабораторная работа 6
|
||||||
|
В рамках данной работы мы изучаем выигрыш при распаралелливании процесса вычисления определителя матрицы
|
||||||
|
## Описание
|
||||||
|
Для вычисления определителя мы используем следующую формулу:
|
||||||
|
![alt text](image.png)
|
||||||
|
где ![alt text](image-1.png) - определитель матрицы, полученной из исходной вырезанием 1 строки и j столбца.
|
||||||
|
|
||||||
|
## Запуск
|
||||||
|
По опыту прошлой лабораторной работы, в консольном приложении был реализован алгоритм вычисление детерминанта и запущено сравнение затраченного времени (в тиках) для 5 и 10 потоков.
|
||||||
|
## Результаты
|
||||||
|
Результаты:
|
||||||
|
<br/>
|
||||||
|
![Результат](image-2.png)
|
||||||
|
<br/>
|
||||||
|
Как мы видим, подтверждаются выводы прошлой лабораторной работы: для небольших матриц выигрыш несущественнен из-за затраты времени на работу с потоком, а для больших эта разница в скорости уже существенна
|
||||||
|
|
||||||
|
## Видеодемонстрация
|
||||||
|
Видеодемонстрация по [адресу](https://drive.google.com/file/d/1dOMaRcTRiPwhn2E4ok1WUOeh_dD9NyDQ/view?usp=sharing)
|
BIN
dozorova_alena_lab_6/image-1.png
Normal file
BIN
dozorova_alena_lab_6/image-1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 556 B |
BIN
dozorova_alena_lab_6/image-2.png
Normal file
BIN
dozorova_alena_lab_6/image-2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 67 KiB |
BIN
dozorova_alena_lab_6/image.png
Normal file
BIN
dozorova_alena_lab_6/image.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.3 KiB |
Loading…
Reference in New Issue
Block a user