From 6de5160da954df9836af21d93d711faf5418ffbd Mon Sep 17 00:00:00 2001 From: KuzarinM Date: Sun, 22 Sep 2024 22:14:00 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=A0=205=20=D0=B3=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kuzarin_maxim_lab_5/.gitignore | 484 ++++++++++++++++++ kuzarin_maxim_lab_5/Images/Resouts.png | Bin 0 -> 31524 bytes kuzarin_maxim_lab_5/MatrixMultiplication.sln | 25 + .../MatrixMultiplication.csproj | 10 + .../MatrixMultiplication/Program.cs | 117 +++++ kuzarin_maxim_lab_5/README.md | 20 + 6 files changed, 656 insertions(+) create mode 100644 kuzarin_maxim_lab_5/.gitignore create mode 100644 kuzarin_maxim_lab_5/Images/Resouts.png create mode 100644 kuzarin_maxim_lab_5/MatrixMultiplication.sln create mode 100644 kuzarin_maxim_lab_5/MatrixMultiplication/MatrixMultiplication.csproj create mode 100644 kuzarin_maxim_lab_5/MatrixMultiplication/Program.cs create mode 100644 kuzarin_maxim_lab_5/README.md diff --git a/kuzarin_maxim_lab_5/.gitignore b/kuzarin_maxim_lab_5/.gitignore new file mode 100644 index 0000000..104b544 --- /dev/null +++ b/kuzarin_maxim_lab_5/.gitignore @@ -0,0 +1,484 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from `dotnet new gitignore` + +# dotenv files +.env + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET +project.lock.json +project.fragment.lock.json +artifacts/ + +# Tye +.tye/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml +.idea + +## +## Visual studio for Mac +## + + +# globs +Makefile.in +*.userprefs +*.usertasks +config.make +config.status +aclocal.m4 +install-sh +autom4te.cache/ +*.tar.gz +tarballs/ +test-results/ + +# Mac bundle stuff +*.dmg +*.app + +# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# Vim temporary swap files +*.swp diff --git a/kuzarin_maxim_lab_5/Images/Resouts.png b/kuzarin_maxim_lab_5/Images/Resouts.png new file mode 100644 index 0000000000000000000000000000000000000000..55ce812dbba52ea7057784a1b2247592d98cb4e6 GIT binary patch literal 31524 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 literal 0 HcmV?d00001 diff --git a/kuzarin_maxim_lab_5/MatrixMultiplication.sln b/kuzarin_maxim_lab_5/MatrixMultiplication.sln new file mode 100644 index 0000000..7b9b107 --- /dev/null +++ b/kuzarin_maxim_lab_5/MatrixMultiplication.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.10.34916.146 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MatrixMultiplication", "MatrixMultiplication\MatrixMultiplication.csproj", "{EF2DB216-9BCD-4FEE-B9C8-4262A5B7CC30}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EF2DB216-9BCD-4FEE-B9C8-4262A5B7CC30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EF2DB216-9BCD-4FEE-B9C8-4262A5B7CC30}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EF2DB216-9BCD-4FEE-B9C8-4262A5B7CC30}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EF2DB216-9BCD-4FEE-B9C8-4262A5B7CC30}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {619485C2-FE35-496B-9E25-4F5465D0C1A1} + EndGlobalSection +EndGlobal diff --git a/kuzarin_maxim_lab_5/MatrixMultiplication/MatrixMultiplication.csproj b/kuzarin_maxim_lab_5/MatrixMultiplication/MatrixMultiplication.csproj new file mode 100644 index 0000000..2150e37 --- /dev/null +++ b/kuzarin_maxim_lab_5/MatrixMultiplication/MatrixMultiplication.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + diff --git a/kuzarin_maxim_lab_5/MatrixMultiplication/Program.cs b/kuzarin_maxim_lab_5/MatrixMultiplication/Program.cs new file mode 100644 index 0000000..2a5dc76 --- /dev/null +++ b/kuzarin_maxim_lab_5/MatrixMultiplication/Program.cs @@ -0,0 +1,117 @@ + +using System.Diagnostics; +internal class Program +{ + private static string[] _resTableColumnsNames = new string[] { "m*m", "1 t", "2 t", "3 t", "4 t", "5 t", "6 t", "7 t", "8 t" }; + + private static void Main(string[] args) + { + Console.WriteLine(string.Join("\t", _resTableColumnsNames)); + + for (int i = 10; i < 10000; i *= 2) + { + var a = CreateMatrix(i, i); + var b = CreateMatrix(i, i); + + List times = new() { i }; + + for (int j = 1; j <= 8; j++) + { + var sw = new Stopwatch(); + sw.Start(); + + MultiplyMatrix(a, b, j); + + sw.Stop(); + times.Add(sw.ElapsedMilliseconds); + } + Console.WriteLine(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 void PrintMatrix(int[,] mx) + { + for (int i = 0; i < mx.GetLength(0); i++) + { + for (int j = 0; j < mx.GetLength(1); j++) + { + Console.Write($"{mx[i, j].ToString("000")}\t"); + } + Console.WriteLine(); + } + } + + /// + /// Непосредственно умножение матриц + /// + /// + /// + /// + /// + private static int[,] MultiplyMatrix(int[,] a, int[,] b, int maxTask) + { + int[,] res = new int[a.GetLength(0), b.GetLength(1)]; + + var semaphore = new SemaphoreSlim(maxTask, maxTask); + + for (int i = 0; i < a.GetLength(0); i++) + { + for (int j = 0; j < b.GetLength(1); j++) + { + semaphore.Wait(); + int ci = i; + int cj = j; + _ = Task.Run(() => + { + try + { + res[ci, cj] = CalculateElement(a, b, ci, cj); + } + finally + { + semaphore.Release(); + } + }); + } + } + semaphore.Wait(maxTask); + return res; + } + + /// + /// Вычисление значение одного элемента + /// + /// + /// + /// + /// + /// + private static int CalculateElement(int[,] a, int[,] b, int i, int j) + => Enumerable.Range(0, a.GetLength(1)).Sum(k => a[i, k] * b[k, j]); +} \ No newline at end of file diff --git a/kuzarin_maxim_lab_5/README.md b/kuzarin_maxim_lab_5/README.md new file mode 100644 index 0000000..0fb394a --- /dev/null +++ b/kuzarin_maxim_lab_5/README.md @@ -0,0 +1,20 @@ +# Лабораторная работа 5 +Данная работа посвящена параллельному умножению больших матриц (чтобы это был побыстрее) +## Описание +Основной принцип умножения матриц: строки умножаются на столбцы, таким образом получаются элементы. И так как значения в строках/столбцах не меняется по ходу алгоритма, его достаточно легко можно распаралелить. + +## Запуск +Приложение представлет собой консольную программу на C#, которую можно скомпилировать и затем запустит exe файл. В результате в окне консоли появится таблица сравнения времени умножения 2-х квадратных матриц (размер указан в первой колонке) с использованием разного числа потоков(от 1 до 8). Чем больше размер, тем дольше будет идти расчёт. +## Результаты +Результаты одного из запусков программы представлены ниже. +
+![Resout](Images/Resouts.png) +
+Как можно заметить, на небольших размерах распаралеливание не приносит никакого выигрыша, а иногда даже удлиняет время работы. Это связана с тем, что работы с потоками (запуск, получение результата и т. п.) - требует дополнительного времени, а из-за малого числа операций в целом, получаем не прирост производительности, а её падение. +Противоположно обстоят дела в случае с большими матрицами. Так как там расчётов значительно больше, распаралеливание начинает значительно ускорять вычисление результата. Причём, часто можно видеть, что, например, увеличения числа потоков с 1 до 2 (в 2 раза) сокращает время в 2 раза. Но чем больше потоков, тем прирост меньше (так как вновь вступают в силу факторы, описанные ранее). И прирост производительности пусть и есть, но он очень небольшой. + +## Видеодемонстрация +Был записан видеоролик, демонстрирующий процесс запуска и работы системы. Он расположен по [адресу](https://drive.google.com/file/d/1dhA3JUAhhpDUh32xVW7jMuW1BKDX02eV/view?usp=sharing) + + +