diff --git a/volkov_rafael_lab_6/README.md b/volkov_rafael_lab_6/README.md new file mode 100644 index 0000000..3230b76 --- /dev/null +++ b/volkov_rafael_lab_6/README.md @@ -0,0 +1,31 @@ +# Лабораторная работа №6 + +Задание: + +Требуется сделать два алгоритма: обычный и параллельный. В параллельном алгоритме предусмотреть ручное задание количества потоков, каждый из которых будет выполнять нахождение отдельной группы множителей. + +Сделать несколько бенчмарков последовательного и параллельного алгоритма поиска детерминанта матрицы размером 100x100, 300x300, 500x500 элементов. Отразить свои наблюдения в readme-отчете. + +

+

Код приложения
+ +

+

+

Код приложения
+ +

+

+

Код приложения
+ +

+

+

Результат работы программы
+ +

+ +Вывод: Параллельный алгоритм не сильно ускорил работу программы, его стоит использовить при матрице большего размера например 10000х10000 + + +# Видео + +Видео с разбором лабораторной - [Видео](https://drive.google.com/file/d/1iRBMH7q0hDcnjJdc5xW9Fy3K8da1ioNi/view?usp=sharing) diff --git a/volkov_rafael_lab_6/screens/img1.png b/volkov_rafael_lab_6/screens/img1.png new file mode 100644 index 0000000..e3b2696 Binary files /dev/null and b/volkov_rafael_lab_6/screens/img1.png differ diff --git a/volkov_rafael_lab_6/screens/img2.png b/volkov_rafael_lab_6/screens/img2.png new file mode 100644 index 0000000..c3fa28f Binary files /dev/null and b/volkov_rafael_lab_6/screens/img2.png differ diff --git a/volkov_rafael_lab_6/screens/img3.png b/volkov_rafael_lab_6/screens/img3.png new file mode 100644 index 0000000..a49715c Binary files /dev/null and b/volkov_rafael_lab_6/screens/img3.png differ diff --git a/volkov_rafael_lab_6/screens/img4.png b/volkov_rafael_lab_6/screens/img4.png new file mode 100644 index 0000000..e2bd671 Binary files /dev/null and b/volkov_rafael_lab_6/screens/img4.png differ diff --git a/volkov_rafael_lab_6/volkov_rafael_lab_6.sln b/volkov_rafael_lab_6/volkov_rafael_lab_6.sln new file mode 100644 index 0000000..02e59eb --- /dev/null +++ b/volkov_rafael_lab_6/volkov_rafael_lab_6.sln @@ -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 diff --git a/volkov_rafael_lab_6/volkov_rafael_lab_6/Program.cs b/volkov_rafael_lab_6/volkov_rafael_lab_6/Program.cs new file mode 100644 index 0000000..4181047 --- /dev/null +++ b/volkov_rafael_lab_6/volkov_rafael_lab_6/Program.cs @@ -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 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)); + } + } +} diff --git a/volkov_rafael_lab_6/volkov_rafael_lab_6/volkov_rafael_lab_6.csproj b/volkov_rafael_lab_6/volkov_rafael_lab_6/volkov_rafael_lab_6.csproj new file mode 100644 index 0000000..53387b9 --- /dev/null +++ b/volkov_rafael_lab_6/volkov_rafael_lab_6/volkov_rafael_lab_6.csproj @@ -0,0 +1,28 @@ + + + + Exe + net8.0 + enable + enable + + + + + README.md + + + screens\img1.png + + + screens\img2.png + + + screens\img3.png + + + screens\img4.png + + + +