Крч сделал задачку: Реализовать два способа обработки элементов двумерных массивов
(матриц): последовательный и параллельный.
При последовательном способе элементы массива обрабатываются в одном
потоке, при параллельном – в m потоках (параметр m должен передаваться в
функцию обработки). При этом массив разбивается на m частей, и каждая часть
обрабатывается в отдельном потоке.
Операция обработки – 1) нахождение разности двух матриц
2)умножение получившейся матрицы на заданное число. Матрицы
одинакового размера с элементами типа int и запись значения разности в первую
матрицу. Матрицы размером 1000 столбцов на 1000 строк, должны заполняться
перед вызовом функции обработки случайными числами.
Время выполнения функции обработки должно измеряться нахождением
разницы между временем начала и временем окончания обработки.
Результаты тестирования должны показывать зависимость времени
выполнения операции обработки от параметра m (необходимо провести измерения
для m в диапазоне 1...8).
Так вот метод с параллельными вычислениями получился оч большой, да и вообще мне кажется я перемудрил.
Можете посоветовать как лучше сделать и как провести анализ последовательного и паралельного вычисления(я где то видел что визуалка может выводить график производительности, но как это сделать наглядно я не понимаю. мож ресурс в помощь какой нить)
class Program
{
static int number = 0; //число умноженное на матрицу
static void Main(string[] args)
{
Console.Write("Строки - ");
var str = Int32.Parse(Console.ReadLine());
Console.Write("Столбцы - ");
var column = Int32.Parse(Console.ReadLine());
Console.Write("Потоки - ");
var threadCount = Int32.Parse(Console.ReadLine());
int[,] oneMatrx = new int[str, column];
int[,] twoMatrx = new int[str, column];
ToMatrx(ref oneMatrx);
Console.WriteLine();
ToMatrx(ref twoMatrx);
Console.WriteLine();
// var startTime = System.Diagnostics.Stopwatch.StartNew();
DateTime dt1, dt2;
dt1 = DateTime.Now;
DifferenceMatrx(ref oneMatrx, twoMatrx);
Console.WriteLine();
MultiByNumber(oneMatrx, number);
dt2 = DateTime.Now;
TimeSpan sd = dt2 - dt1;
Console.WriteLine("Линейное" + sd.TotalMilliseconds);
//startTime.Stop(); //останавливаем счетчик
//var resultTime = startTime.Elapsed;
// Console.WriteLine(String.Format("{0:00}.{1:000}",
// resultTime.Seconds,
// resultTime.Milliseconds));
Console.WriteLine(ThreadMtrx(oneMatrx, twoMatrx, threadCount));
}
static void ToMatrx(ref int[,] array) // change length array
{
Random randomValue = new Random();
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
array[i, j] = randomValue.Next(1, 1000);
//Console.WriteLine($"value[{i},{j}] = {array[i, j]}");
}
}
}
static void DifferenceMatrx(ref int[,] oneArray, int[,] twoArray)
{
//Console.WriteLine("Matrix difference:");
for (int i = 0; i < oneArray.GetLength(0); i++)
{
for (int j = 0; j < twoArray.GetLength(1); j++)
{
oneArray[i, j] = oneArray[i, j] - twoArray[i, j];
//Console.WriteLine($"value[{i},{j}] = {oneArray[i, j]}");
}
}
}
static void MultiByNumber(int[,] oneArray, int number)
{
//Console.WriteLine($"Matrix multiplied by a {number}:");
for (int i = 0; i < oneArray.GetLength(0); i++)
{
for (int j = 0; j < oneArray.GetLength(1); j++)
{
oneArray[i, j] = oneArray[i, j] * number;
//Console.WriteLine($"value[{i},{j}] = {oneArray[i, j]}");
}
}
}
static double ThreadMtrx(int[,] oneMatrx, int[,] twoMatrx, int threadCount)
{
var each = oneMatrx.GetLength(0) / threadCount;
int last = oneMatrx.GetLength(0) % threadCount;
int iM = 0;
DateTime dt1, dt2;
dt1 = DateTime.Now;
Thread[] threads = new Thread[threadCount];
for (int i = 0; i < threadCount; i++)
{
int iBeg;
int iEnd;
if (i < last)
{
iBeg = iM;
iEnd = iM + each + 1;
iM += each + 1;
}
else
{
iBeg = iM;
iEnd = iM + each;
iM += each;
}
Random randomValue = new Random();
threads[i] = new Thread((obj) =>
{
for (int index = 0; index < oneMatrx.GetLength(0); index++)
{
for (int j = iBeg; j < iEnd; j++)
{
oneMatrx[index, j] = oneMatrx[index, j] - twoMatrx[index, j];
oneMatrx[index, j] = oneMatrx[index, j] * number;
// Console.WriteLine($"Поток:[{i}]value[{index},{j}] = {array[index, j]}");
}
}
});
threads[i].Start();
}
for (int i = 0; i < threadCount; i++)
threads[i].Join();
dt2 = DateTime.Now;
TimeSpan sw = dt2 - dt1;
return sw.TotalMilliseconds;
}
}