Ответы пользователя по тегу Параллельные вычисления
  • Как уменьшить метод и улучшить код?

    @porev44067
    Скорее всего, нужно вывести затраченное время для каждого количества потоков в диапазоне 1...8. Для тестов компилируй в Release и запускай исполняемый файл напрямую.
    using System;
    using System.Threading;
    
    namespace MatrixTest
    {
        class Program
        {
            static void GenerateMatrix(ref int[,] matrix)
            {
                Random random = new Random();
    
                for (int i = 0; i < matrix.GetLength(0); i++)
                {
                    for (int j = 0; j < matrix.GetLength(1); j++)
                        matrix[i, j] = random.Next(1, 1000);
                }
            }
    
            static int[,] ProcessMatrix(int[,] matrix1, int[,] matrix2, int number, out double elapsedTime)
            {
                DateTime startTime = DateTime.Now;
    
                for (int i = 0; i < matrix1.GetLength(0); i++)
                {
                    for (int j = 0; j < matrix2.GetLength(1); j++)
                    {
                        matrix1[i, j] -= matrix2[i, j];
                        matrix1[i, j] *= number;
                    }
                }
    
                elapsedTime = (DateTime.Now - startTime).TotalMilliseconds;
    
                return matrix1;
            }
    
            static int[,] ProcessMatrixParallel(int[,] matrix1, int[,] matrix2, int number, int threadCount, out double elapsedTime)
            {
                int length = matrix1.GetLength(0);
                int each = length / threadCount;
                int last = length % threadCount;
    
                var threads = new Thread[threadCount];
    
                for (int t = 0; t < threadCount; t++)
                {
                    int start = t * each;
                    int end = start + each;
                    if (t == threadCount - 1)
                        end += last;
    
                    threads[t] = new Thread((obj) =>
                    {
                        for (int i = start; i < end; i++)
                        {
                            for (int j = 0; j < length; j++)
                            {
                                matrix1[i, j] -= matrix2[i, j];
                                matrix1[i, j] *= number;
                            }
                        }
                    });
                }
    
                DateTime startTime = DateTime.Now;
    
                for (int i = 0; i < threads.Length; i++)
                    threads[i].Start();
    
                for (int i = 0; i < threads.Length; i++)
                    threads[i].Join();
    
                elapsedTime = (DateTime.Now - startTime).TotalMilliseconds;
    
                return matrix1;
            }
    
            static void Main()
            {
                int rows, cols;
                rows = cols = 1000;
    
                //Console.Write("Строки - ");
                //var rows = int.Parse(Console.ReadLine());
    
                //Console.Write("Столбцы - ");
                //var cols = int.Parse(Console.ReadLine());
    
                Console.Write("Число - ");
                int number = int.Parse(Console.ReadLine());
                //int number = new Random().Next();
    
                //Console.Write("Потоки - ");
                //var threads = int.Parse(Console.ReadLine());
    
                int[,] matrix1 = new int[rows, cols];
                int[,] matrix2 = new int[rows, cols];
    
                GenerateMatrix(ref matrix1);
                GenerateMatrix(ref matrix2);
    
                ProcessMatrix(matrix1, matrix2, number, out double elapsedTime);
    
                Console.WriteLine($"Последовательный метод: {elapsedTime} мс.");
    
                for (int i = 1; i <= 8; i++)
                {
                    ProcessMatrixParallel(matrix1, matrix2, number, i, out double elapsedTimeParallel);
                    Console.WriteLine($"Параллельный метод ({i} п.): {elapsedTimeParallel} мс.");
                }
    
    #if RELEASE
                Console.ReadLine();
    #endif
            }
        }
    }
    Ответ написан