From 1399a32c46669be758313f30bc5ae1ca65b47d0c Mon Sep 17 00:00:00 2001 From: YuriMikhailov Date: Sat, 6 Jan 2024 23:51:01 +0400 Subject: [PATCH] lab5 --- tasks/mikhailov-ys/Main/.gitignore | 454 ++++++++++++++++++++++++++++ tasks/mikhailov-ys/Main/Main.csproj | 14 + tasks/mikhailov-ys/Main/Program.cs | 173 +++++++++++ tasks/mikhailov-ys/README.md | 66 ++++ tasks/mikhailov-ys/pic.PNG | Bin 0 -> 34370 bytes 5 files changed, 707 insertions(+) create mode 100644 tasks/mikhailov-ys/Main/.gitignore create mode 100644 tasks/mikhailov-ys/Main/Main.csproj create mode 100644 tasks/mikhailov-ys/Main/Program.cs create mode 100644 tasks/mikhailov-ys/README.md create mode 100644 tasks/mikhailov-ys/pic.PNG diff --git a/tasks/mikhailov-ys/Main/.gitignore b/tasks/mikhailov-ys/Main/.gitignore new file mode 100644 index 0000000..2afa2e2 --- /dev/null +++ b/tasks/mikhailov-ys/Main/.gitignore @@ -0,0 +1,454 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# 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 +*.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 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/ + +# 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 + +## +## 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 + +# JetBrains Rider +.idea/ +*.sln.iml + +## +## Visual Studio Code +## +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json diff --git a/tasks/mikhailov-ys/Main/Main.csproj b/tasks/mikhailov-ys/Main/Main.csproj new file mode 100644 index 0000000..1260716 --- /dev/null +++ b/tasks/mikhailov-ys/Main/Main.csproj @@ -0,0 +1,14 @@ + + + + Exe + net6.0 + enable + enable + + + + + + + diff --git a/tasks/mikhailov-ys/Main/Program.cs b/tasks/mikhailov-ys/Main/Program.cs new file mode 100644 index 0000000..df7eaf6 --- /dev/null +++ b/tasks/mikhailov-ys/Main/Program.cs @@ -0,0 +1,173 @@ +using System; +using System.Diagnostics; +using System.Threading.Tasks; +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Running; + +public class MatrixMultiplication +{ + public static int[][] MultiplySequential(int[][] matrixA, int[][] matrixB) + { + int rowsA = matrixA.Length; + int colsA = matrixA[0].Length; + int colsB = matrixB[0].Length; + + int[][] result = new int[rowsA][]; + + for (int i = 0; i < rowsA; i++) + { + result[i] = new int[colsB]; + + for (int j = 0; j < colsB; j++) + { + for (int k = 0; k < colsA; k++) + { + result[i][j] += matrixA[i][k] * matrixB[k][j]; + } + } + } + + return result; + } + + public static int[][] MultiplyParallel(int[][] matrixA, int[][] matrixB, int numThreads) + { + int rowsA = matrixA.Length; + int colsA = matrixA[0].Length; + int colsB = matrixB[0].Length; + + int[][] result = new int[rowsA][]; + + Parallel.For(0, rowsA, new ParallelOptions { MaxDegreeOfParallelism = numThreads }, i => + { + result[i] = new int[colsB]; + + for (int j = 0; j < colsB; j++) + { + for (int k = 0; k < colsA; k++) + { + result[i][j] += matrixA[i][k] * matrixB[k][j]; + } + } + }); + + return result; + } + + [Benchmark] + public void MultiplySequential_100x100() + { + int[][] matrixA = GenerateRandomMatrix(100, 100); + int[][] matrixB = GenerateRandomMatrix(100, 100); + MultiplySequential(matrixA, matrixB); + } + + [Benchmark] + public void MultiplyParallel_100x100_4TH() + { + int[][] matrixA = GenerateRandomMatrix(100, 100); + int[][] matrixB = GenerateRandomMatrix(100, 100); + MultiplyParallel(matrixA, matrixB, 4); + } + [Benchmark] + public void MultiplyParallel_100x100_8TH() + { + int[][] matrixA = GenerateRandomMatrix(100, 100); + int[][] matrixB = GenerateRandomMatrix(100, 100); + MultiplyParallel(matrixA, matrixB, 8); + + } + [Benchmark] + public void MultiplyParallel_100x100_16TH() + { + int[][] matrixA = GenerateRandomMatrix(100, 100); + int[][] matrixB = GenerateRandomMatrix(100, 100); + MultiplyParallel(matrixA, matrixB, 16); + + } + + [Benchmark] + public void MultiplySequential_300x300() + { + int[][] matrixA = GenerateRandomMatrix(300, 300); + int[][] matrixB = GenerateRandomMatrix(300, 300); + MultiplySequential(matrixA, matrixB); + } + + [Benchmark] + public void MultiplyParallel_300x300_4TH() + { + int[][] matrixA = GenerateRandomMatrix(300, 300); + int[][] matrixB = GenerateRandomMatrix(300, 300); + MultiplyParallel(matrixA, matrixB, 4); + } + [Benchmark] + public void MultiplyParallel_300x300_8TH() + { + int[][] matrixA = GenerateRandomMatrix(300, 300); + int[][] matrixB = GenerateRandomMatrix(300, 300); + MultiplyParallel(matrixA, matrixB, 8); + } + [Benchmark] + public void MultiplyParallel_300x300_16TH() + { + int[][] matrixA = GenerateRandomMatrix(300, 300); + int[][] matrixB = GenerateRandomMatrix(300, 300); + MultiplyParallel(matrixA, matrixB, 16); + } + [Benchmark] + public void MultiplySequential_500x500() + { + int[][] matrixA = GenerateRandomMatrix(500, 500); + int[][] matrixB = GenerateRandomMatrix(500, 500); + MultiplySequential(matrixA, matrixB); + } + + [Benchmark] + public void MultiplyParallel_500x500_4TH() + { + int[][] matrixA = GenerateRandomMatrix(500, 500); + int[][] matrixB = GenerateRandomMatrix(500, 500); + MultiplyParallel(matrixA, matrixB, 4); + } + [Benchmark] + public void MultiplyParallel_500x500_8TH() + { + int[][] matrixA = GenerateRandomMatrix(500, 500); + int[][] matrixB = GenerateRandomMatrix(500, 500); + MultiplyParallel(matrixA, matrixB, 8); + } + [Benchmark] + public void MultiplyParallel_500x500_16TH() + { + int[][] matrixA = GenerateRandomMatrix(500, 500); + int[][] matrixB = GenerateRandomMatrix(500, 500); + MultiplyParallel(matrixA, matrixB, 16); + } + private static int[][] GenerateRandomMatrix(int rows, int cols) + { + int[][] matrix = new int[rows][]; + + Random rand = new Random(); + + for (int i = 0; i < rows; i++) + { + matrix[i] = new int[cols]; + for (int j = 0; j < cols; j++) + { + matrix[i][j] = rand.Next(1, 10); + } + } + + return matrix; + } +} + +class Program +{ + static void Main(string[] args) + { + var summary = BenchmarkRunner.Run(); + Console.ReadLine(); + } +} \ No newline at end of file diff --git a/tasks/mikhailov-ys/README.md b/tasks/mikhailov-ys/README.md new file mode 100644 index 0000000..f3d6331 --- /dev/null +++ b/tasks/mikhailov-ys/README.md @@ -0,0 +1,66 @@ +# Отчёт по лабораторной работе №5 + +Выполнил: студент гр. ИСЭбд-41 Михайлов Ю.С. + +## Запуск приложения + +Было выбрано консольное приложение, язык программирования - C#. + +Перемножение матриц обычным алгоритмом: +``` + public static int[][] MultiplySequential(int[][] matrixA, int[][] matrixB) + { + int rowsA = matrixA.Length; + int colsA = matrixA[0].Length; + int colsB = matrixB[0].Length; + + int[][] result = new int[rowsA][]; + + for (int i = 0; i < rowsA; i++) + { + result[i] = new int[colsB]; + + for (int j = 0; j < colsB; j++) + { + for (int k = 0; k < colsA; k++) + { + result[i][j] += matrixA[i][k] * matrixB[k][j]; + } + } + } + + return result; + } +``` + +Перемножение матриц параллельным алгоритмом: +``` + public static int[][] MultiplyParallel(int[][] matrixA, int[][] matrixB, int numThreads) + { + int rowsA = matrixA.Length; + int colsA = matrixA[0].Length; + int colsB = matrixB[0].Length; + + int[][] result = new int[rowsA][]; + + Parallel.For(0, rowsA, new ParallelOptions { MaxDegreeOfParallelism = numThreads }, i => + { + result[i] = new int[colsB]; + + for (int j = 0; j < colsB; j++) + { + for (int k = 0; k < colsA; k++) + { + result[i][j] += matrixA[i][k] * matrixB[k][j]; + } + } + }); + + return result; + } +``` + +## Результаты + +![](pic.PNG) +Вывод: если в матрице не слишком много элементов, обычный алгоритм работает быстрее. Параллельный алгоритм следует использовать для обработки большого количества данных. В сравнении с однопоточным алгоритмом, работа параллельного в несколько раз быстрее. \ No newline at end of file diff --git a/tasks/mikhailov-ys/pic.PNG b/tasks/mikhailov-ys/pic.PNG new file mode 100644 index 0000000000000000000000000000000000000000..f6dde4fced2ecc44456441446dfd5a61509ebae3 GIT binary patch literal 34370 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 literal 0 HcmV?d00001