forked from Alexey/DAS_2024_1
Merge pull request 'dozorova_alena_lab_5' (#67) from dozorova_alena_lab_5 into main
Reviewed-on: Alexey/DAS_2024_1#67
This commit is contained in:
commit
5fd241a980
5
.gitignore → dozorova_alena_lab_5/.gitignore
vendored
5
.gitignore → dozorova_alena_lab_5/.gitignore
vendored
@ -7,6 +7,9 @@
|
|||||||
/dozorova_alena_lab_2/ConsoleApp2/.vs
|
/dozorova_alena_lab_2/ConsoleApp2/.vs
|
||||||
/dozorova_alena_lab_2/ConsoleApp2/bin
|
/dozorova_alena_lab_2/ConsoleApp2/bin
|
||||||
/dozorova_alena_lab_2/ConsoleApp2/obj
|
/dozorova_alena_lab_2/ConsoleApp2/obj
|
||||||
|
/dozorova_alena_lab_5/ConsoleApp1/.vs
|
||||||
|
/dozorova_alena_lab_5/ConsoleApp1/bin
|
||||||
|
/dozorova_alena_lab_5/ConsoleApp1/obj
|
||||||
/dozorova_alena_lab_3/PostService/.vs
|
/dozorova_alena_lab_3/PostService/.vs
|
||||||
/dozorova_alena_lab_3/WorkerService/.vs
|
/dozorova_alena_lab_3/WorkerService/.vs
|
||||||
/dozorova_alena_lab_4/Receive/bin
|
/dozorova_alena_lab_4/Receive/bin
|
||||||
@ -32,4 +35,4 @@
|
|||||||
/dozorova_alena_lab_4/ConsumerSimple/obj
|
/dozorova_alena_lab_4/ConsumerSimple/obj
|
||||||
/dozorova_alena_lab_4/Publisher/.vs
|
/dozorova_alena_lab_4/Publisher/.vs
|
||||||
/dozorova_alena_lab_4/Publisher/bin
|
/dozorova_alena_lab_4/Publisher/bin
|
||||||
/dozorova_alena_lab_4/Publisher/obj
|
/dozorova_alena_lab_4/Publisher/objs
|
10
dozorova_alena_lab_5/ConsoleApp1/ConsoleApp1.csproj
Normal file
10
dozorova_alena_lab_5/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_5/ConsoleApp1/ConsoleApp1.sln
Normal file
25
dozorova_alena_lab_5/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", "{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
|
84
dozorova_alena_lab_5/ConsoleApp1/Program.cs
Normal file
84
dozorova_alena_lab_5/ConsoleApp1/Program.cs
Normal file
@ -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<long> 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]);
|
||||||
|
}
|
24
dozorova_alena_lab_5/README.md
Normal file
24
dozorova_alena_lab_5/README.md
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# Лабораторная работа 5
|
||||||
|
В рамках этой работы проверяется скорость расчета умножения двух матриц в некоторое количество потоков
|
||||||
|
## Описание
|
||||||
|
Основной принцип умножения матриц: строки умножаются на столбцы, таким образом получаются элементы. Для распараллеливания этого процесса вычисление некоторых объектов матрицы выносят в отдельные потоки, которые работают параллельно
|
||||||
|
|
||||||
|
## Запуск
|
||||||
|
Для проверки гипотезы и реализации параллельного умножения в консоли на языке c# был реализован тестовый контур: для каждого вида матриц (100*100, 300*300 и 500*500) запускался процесс вычисления произведения в количестве потоков от 1 до 5 с использованием SsemaphoreSlim, который контролировал выполнение в заданном количестве потоков. Для каждого вычисления засекалось время в миллисекундах.
|
||||||
|
## Результаты
|
||||||
|
Что мы получили
|
||||||
|
<br/>
|
||||||
|
![Результаты вычислений 1](image.png)
|
||||||
|
<br/>
|
||||||
|
Результаты спорные, так как при повышении количества потоков нельзя сказать, что повышается скорость вычислений. Это связано с тем, что работа с потоками сама по сбе требует ресурсов и времени.
|
||||||
|
Повысим количестов потоков до 10:
|
||||||
|
<br/>
|
||||||
|
![Результаты вычислений 2](image-1.png)
|
||||||
|
<br/>
|
||||||
|
Для небольшой матрицы видна разница в сравнении с прошлым результатом, но не так сильно, как для больших. Повышение количества потоков позволило существенно сократить время вычислений
|
||||||
|
|
||||||
|
## Видеодемонстрация
|
||||||
|
Видедемонстрация по [адресу](https://drive.google.com/file/d/1mxhCsjLPg2zY7lnCj7sLxr5lDJQJX9xr/view?usp=sharing)
|
||||||
|
|
||||||
|
|
||||||
|
|
BIN
dozorova_alena_lab_5/image-1.png
Normal file
BIN
dozorova_alena_lab_5/image-1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 24 KiB |
BIN
dozorova_alena_lab_5/image.png
Normal file
BIN
dozorova_alena_lab_5/image.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
Loading…
Reference in New Issue
Block a user