DAS_2024_1/aleikin_artem_lab_5/MultiplyMatrix/Program.cs

100 lines
3.5 KiB
C#
Raw Normal View History

2024-11-20 15:52:50 +04:00
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;
}
}