DAS_2024_1/aleikin_artem_lab_5/MultiplyMatrix/Program.cs

100 lines
3.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Diagnostics;
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
// Размеры матриц
int[] sizes = { 100, 300, 500, 700, 1000 };
// Максимальное количество потоков
int maxThreads = 20;
foreach (var size in sizes)
{
Console.WriteLine($"\nРазмер матрицы: {size}x{size}");
// Генерация двух матриц
var matrixA = GenerateMatrix(size);
var matrixB = GenerateMatrix(size);
// Последовательное умножение
var stopwatch = Stopwatch.StartNew();
var resultSequential = MultiplyMatricesSequential(matrixA, matrixB);
stopwatch.Stop();
long timeSequential = stopwatch.ElapsedMilliseconds;
Console.WriteLine($"Последовательное умножение: {timeSequential} мс");
// Параллельное умножение с разным количеством потоков
Console.WriteLine("Параллельное умножение (время выполнения для каждого количества потоков):");
for (int threads = 1; threads <= maxThreads; threads++)
{
stopwatch.Restart();
var resultParallel = MultiplyMatricesParallel(matrixA, matrixB, threads);
stopwatch.Stop();
long timeParallel = stopwatch.ElapsedMilliseconds;
Console.WriteLine($"Потоков: {threads} — {timeParallel} мс");
}
}
}
// Генерация квадратной матрицы размером size x size
static double[,] GenerateMatrix(int size)
{
var random = new Random();
var matrix = new double[size, size];
for (int i = 0; i < size; i++)
for (int j = 0; j < size; j++)
matrix[i, j] = random.NextDouble();
return matrix;
}
// Последовательное умножение матриц
static double[,] MultiplyMatricesSequential(double[,] matrixA, double[,] matrixB)
{
int size = matrixA.GetLength(0);
var result = new double[size, size];
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
for (int k = 0; k < size; k++)
{
result[i, j] += matrixA[i, k] * matrixB[k, j];
}
}
}
return result;
}
// Параллельное умножение матриц
static double[,] MultiplyMatricesParallel(double[,] matrixA, double[,] matrixB, int threadCount)
{
int size = matrixA.GetLength(0);
var result = new double[size, size];
Parallel.For(0, threadCount, threadIndex =>
{
int rowsPerThread = size / threadCount;
int startRow = threadIndex * rowsPerThread;
int endRow = (threadIndex == threadCount - 1) ? size : startRow + rowsPerThread;
for (int i = startRow; i < endRow; i++)
{
for (int j = 0; j < size; j++)
{
for (int k = 0; k < size; k++)
{
result[i, j] += matrixA[i, k] * matrixB[k, j];
}
}
}
});
return result;
}
}