diff --git a/.gitignore b/.gitignore index 697082a..30c9ddf 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,6 @@ /dozorova_alena_lab_2/ConsoleApp2/.vs /dozorova_alena_lab_2/ConsoleApp2/bin /dozorova_alena_lab_2/ConsoleApp2/obj +/dozorova_alena_lab_5/ConsoleApp1/.vs +/dozorova_alena_lab_5/ConsoleApp1/bin +/dozorova_alena_lab_5/ConsoleApp1/obj diff --git a/dozorova_alena_lab_5/ConsoleApp1/ConsoleApp1.csproj b/dozorova_alena_lab_5/ConsoleApp1/ConsoleApp1.csproj new file mode 100644 index 0000000..74abf5c --- /dev/null +++ b/dozorova_alena_lab_5/ConsoleApp1/ConsoleApp1.csproj @@ -0,0 +1,10 @@ + + + + Exe + net6.0 + enable + enable + + + diff --git a/dozorova_alena_lab_5/ConsoleApp1/ConsoleApp1.sln b/dozorova_alena_lab_5/ConsoleApp1/ConsoleApp1.sln new file mode 100644 index 0000000..e182357 --- /dev/null +++ b/dozorova_alena_lab_5/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", "{FF70279D-C317-4A3D-B2C2-0FFD9FB4B22E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {FF70279D-C317-4A3D-B2C2-0FFD9FB4B22E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FF70279D-C317-4A3D-B2C2-0FFD9FB4B22E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FF70279D-C317-4A3D-B2C2-0FFD9FB4B22E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FF70279D-C317-4A3D-B2C2-0FFD9FB4B22E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1501FAF9-199B-40BA-9918-AC5952D318BE} + EndGlobalSection +EndGlobal diff --git a/dozorova_alena_lab_5/ConsoleApp1/Program.cs b/dozorova_alena_lab_5/ConsoleApp1/Program.cs new file mode 100644 index 0000000..0b99f9a --- /dev/null +++ b/dozorova_alena_lab_5/ConsoleApp1/Program.cs @@ -0,0 +1,84 @@ + +using System.Diagnostics; +internal class Program +{ + private static void Main(string[] args) + { + Console.WriteLine(""); + + var value = new int[] { 100, 300, 500 }; + + foreach (var i in value) + { + var a = Create(i, i); + var b = Create(i, i); + + List times = new() {}; + + for (int j = 1; j <= 10; j++) + { + var sw = new Stopwatch(); + sw.Start(); + + MultiplyCreateTask(a, b, j); + + sw.Stop(); + times.Add(sw.ElapsedMilliseconds); + } + Console.WriteLine("Результаты вычисления для количества потоков от 1 до 5 для матрицы cо стороной "+i+": "+string.Join("\t", times)); + } + + } + + private static int[,] Create(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 int[,] MultiplyCreateTask(int[,] matrix1, int[,] matrix2, int maxCount) + { + int[,] res = new int[matrix1.GetLength(0), matrix2.GetLength(1)]; + + var semaphore = new SemaphoreSlim(maxCount, maxCount); + + for (int i = 0; i < matrix1.GetLength(0); i++) + { + for (int j = 0; j < matrix2.GetLength(1); j++) + { + int ci = i; + int cj = j; + + var task = Task.Run(() => + { + try + { + semaphore.Wait(); + + res[ci, cj] = CalculateValue(matrix1, matrix2, ci, cj); + } + finally + { + semaphore.Release(); + } + }); + + } + } + semaphore.Wait(maxCount); + return res; + } + + private static int CalculateValue(int[,] matrix1, int[,] matrix2, int i, int j) + => Enumerable.Range(0, matrix1.GetLength(1)).Sum(k => matrix1[i, k] * matrix2[k, j]); +} \ No newline at end of file diff --git a/dozorova_alena_lab_5/README.md b/dozorova_alena_lab_5/README.md new file mode 100644 index 0000000..7b16850 --- /dev/null +++ b/dozorova_alena_lab_5/README.md @@ -0,0 +1,24 @@ +# Лабораторная работа 5 +В рамках этой работы проверяется скорость расчета умножения двух матриц в некоторое количество потоков +## Описание +Основной принцип умножения матриц: строки умножаются на столбцы, таким образом получаются элементы. Для распараллеливания этого процесса вычисление некоторых объектов матрицы выносят в отдельные потоки, которые работают параллельно + +## Запуск +Для проверки гипотезы и реализации параллельного умножения в консоли на языке c# был реализован тестовый контур: для каждого вида матриц (100*100, 300*300 и 500*500) запускался процесс вычисления произведения в количестве потоков от 1 до 5 с использованием SsemaphoreSlim, который контролировал выполнение в заданном количестве потоков. Для каждого вычисления засекалось время в миллисекундах. +## Результаты +Что мы получили +
+![Результаты вычислений 1](image.png) +
+Результаты спорные, так как при повышении количества потоков нельзя сказать, что повышается скорость вычислений. Это связано с тем, что работа с потоками сама по сбе требует ресурсов и времени. +Повысим количестов потоков до 10: +
+![Результаты вычислений 2](image-1.png) +
+Для небольшой матрицы видна разница в сравнении с прошлым результатом, но не так сильно, как для больших. Повышение количества потоков позволило существенно сократить время вычислений + +## Видеодемонстрация +Видедемонстрация по [адресу](https://drive.google.com/file/d/1YaQTg8OM5sVT6q4hkJvopGHFy-SM_Zjn/view?usp=sharing) + + + diff --git a/dozorova_alena_lab_5/image-1.png b/dozorova_alena_lab_5/image-1.png new file mode 100644 index 0000000..7c9f98c Binary files /dev/null and b/dozorova_alena_lab_5/image-1.png differ diff --git a/dozorova_alena_lab_5/image.png b/dozorova_alena_lab_5/image.png new file mode 100644 index 0000000..9c9a487 Binary files /dev/null and b/dozorova_alena_lab_5/image.png differ