diff --git a/dozorova_alena_lab_6/.gitignore b/dozorova_alena_lab_6/.gitignore new file mode 100644 index 0000000..0e58087 --- /dev/null +++ b/dozorova_alena_lab_6/.gitignore @@ -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 diff --git a/dozorova_alena_lab_6/ConsoleApp1/ConsoleApp1.csproj b/dozorova_alena_lab_6/ConsoleApp1/ConsoleApp1.csproj new file mode 100644 index 0000000..74abf5c --- /dev/null +++ b/dozorova_alena_lab_6/ConsoleApp1/ConsoleApp1.csproj @@ -0,0 +1,10 @@ + + + + Exe + net6.0 + enable + enable + + + diff --git a/dozorova_alena_lab_6/ConsoleApp1/ConsoleApp1.sln b/dozorova_alena_lab_6/ConsoleApp1/ConsoleApp1.sln new file mode 100644 index 0000000..5701d5a --- /dev/null +++ b/dozorova_alena_lab_6/ConsoleApp1/ConsoleApp1.sln @@ -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 diff --git a/dozorova_alena_lab_6/ConsoleApp1/Extention.cs b/dozorova_alena_lab_6/ConsoleApp1/Extention.cs new file mode 100644 index 0000000..86e8b29 --- /dev/null +++ b/dozorova_alena_lab_6/ConsoleApp1/Extention.cs @@ -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; + } + } +} diff --git a/dozorova_alena_lab_6/ConsoleApp1/Program.cs b/dozorova_alena_lab_6/ConsoleApp1/Program.cs new file mode 100644 index 0000000..b64687b --- /dev/null +++ b/dozorova_alena_lab_6/ConsoleApp1/Program.cs @@ -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 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; + } +} \ No newline at end of file diff --git a/dozorova_alena_lab_6/README.md b/dozorova_alena_lab_6/README.md new file mode 100644 index 0000000..c72aff4 --- /dev/null +++ b/dozorova_alena_lab_6/README.md @@ -0,0 +1,18 @@ +# Лабораторная работа 6 +В рамках данной работы мы изучаем выигрыш при распаралелливании процесса вычисления определителя матрицы +## Описание +Для вычисления определителя мы используем следующую формулу: +![alt text](image.png) +где ![alt text](image-1.png) - определитель матрицы, полученной из исходной вырезанием 1 строки и j столбца. + +## Запуск +По опыту прошлой лабораторной работы, в консольном приложении был реализован алгоритм вычисление детерминанта и запущено сравнение затраченного времени (в тиках) для 5 и 10 потоков. +## Результаты +Результаты: +
+![Результат](image-2.png) +
+Как мы видим, подтверждаются выводы прошлой лабораторной работы: для небольших матриц выигрыш несущественнен из-за затраты времени на работу с потоком, а для больших эта разница в скорости уже существенна + +## Видеодемонстрация +Видеодемонстрация по [адресу](https://drive.google.com/file/d/1dOMaRcTRiPwhn2E4ok1WUOeh_dD9NyDQ/view?usp=sharing) diff --git a/dozorova_alena_lab_6/image-1.png b/dozorova_alena_lab_6/image-1.png new file mode 100644 index 0000000..64f1452 Binary files /dev/null and b/dozorova_alena_lab_6/image-1.png differ diff --git a/dozorova_alena_lab_6/image-2.png b/dozorova_alena_lab_6/image-2.png new file mode 100644 index 0000000..4593b4a Binary files /dev/null and b/dozorova_alena_lab_6/image-2.png differ diff --git a/dozorova_alena_lab_6/image.png b/dozorova_alena_lab_6/image.png new file mode 100644 index 0000000..65f78f3 Binary files /dev/null and b/dozorova_alena_lab_6/image.png differ