100 lines
3.5 KiB
C#
100 lines
3.5 KiB
C#
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;
|
||
}
|
||
}
|