2 / 2 / 4
Регистрация: 26.05.2013
Сообщений: 126
1

Умножение матриц в многопоточной программе

22.03.2016, 16:32. Показов 1484. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
class Program
    {
        static int value = 50;
        static void Main(string[] args)
        {
            int[,] firstMatrix = new int[value, value];
            int[,] secondMatrix = new int[value, value];
            int[,] result = new int[value, value];
            Random r = new Random();
 
            for (int i = 0; i < value; i++)
                for (int j = 0; j < value; j++)
                {
                    firstMatrix[i, j] = r.Next(-5, 5);
                    secondMatrix[i, j] = r.Next(-5, 5);
                }
            for (int i = 0; i < value; i++)
            {
                Console.WriteLine();
                for (int j = 0; j < value; j++)
                    Console.Write(firstMatrix[i, j] + " ");
            }
            Console.WriteLine();
            for (int i = 0; i < value; i++)
            {
                Console.WriteLine();
                for (int j = 0; j < value; j++)
                    Console.Write(secondMatrix[i, j] + " ");
            }
 
            Thread t = new Thread(delegate ()
            {
                for (int i = 0; i < value; i++)
                    for (int j = 1; j < value; j += 2)
                        result[i, j] = Mul(firstMatrix, secondMatrix, 1)[i, j];
            });
            Thread t2 = new Thread(delegate ()
            {
                for (int i = 0; i < value; i++)
                    for (int j = 0; j < value; j += 2)
                        result[i, j] = Mul(firstMatrix, secondMatrix, 0)[i, j];
 
                Console.WriteLine();
                for (int i = 0; i < value; i++)
                {
                    Console.WriteLine();
                    for (int n = 0; n < value; n++)
                        Console.Write(result[i, n] + " ");
                }
            });
 
            Stopwatch sw = new Stopwatch();
            sw.Start();
            t.Start();
            t2.Start();
            t.Join();
            t2.Join();
            sw.Stop();
 
            Thread t3 = new Thread(delegate ()
            {
                Mul(firstMatrix, secondMatrix);
            });
 
            Stopwatch sw2 = new Stopwatch();
            sw2.Start();
            t3.Start();
            t3.Join();
            sw2.Stop();
 
            Console.WriteLine();
            TimeSpan ts = sw.Elapsed;
            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds,
                ts.Milliseconds / 10);
            Console.WriteLine("In 2 threads " + elapsedTime);
            ts = sw2.Elapsed;
            elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds,
                ts.Milliseconds / 10);
            Console.WriteLine("In 1 thread " + elapsedTime);
 
            Console.ReadKey();
        }
 
        public static int[,] Mul(int[,] firstMatrix, int[,] secondMatrix, int j)
        {
            int[,] result = new int[value, value];
            if (j == 0)
            {
                for (int i = 0; i < value; i++)
                    for (j = 0; j < value; j += 2)
                        for (int k = 0; k < value; k++)
                                result[i, j] += firstMatrix[i, k] * secondMatrix[k, j];
            }
            if (j == 1)
                for (int i = 0; i < value; i++)
                    for (j = 1; j < value; j += 2)
                        for (int k = 0; k < value; k++)
                                result[i, j] += firstMatrix[i, k] * secondMatrix[k, j];            
            return result;
        }
 
        public static void Mul(int[,] firstMatrix, int[,] secondMatrix)
        {
            int[,] result = new int[value, value];
            for (int i = 0; i < value; i++)
                for (int j = 0; j < value; j++)
                    for (int k = 0; k < value; k++)
                            result[i, j] += firstMatrix[i, k] * secondMatrix[k, j];
 
            Console.WriteLine();
            for (int i = 0; i < value; i++)
            {
                Console.WriteLine();
                for (int n = 0; n < value; n++)
                    Console.Write(result[i, n] + " ");
            }
        }
    }
Умножение матриц в одном потоке выполняется быстрее, чем в двух, почему так? Как решить эту проблему?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.03.2016, 16:32
Ответы с готовыми решениями:

Метод For в многопоточной программе
Почему данный код не компилируется и как исправить ошибку? using System; using...

Одновременный инкремент в многопоточной программе
Подпрограмма выполняется в многопоточном режиме. i, j - глобальные переменные. Каждый поток...

Назначение параметров в многопоточной программе
Ребят от чего зависит вот эти параметры в моей программе? Mythread t1 = new...

Медленная работа и ловля исключений в многопоточной программе
Здравствуйте. Сразу хочу предупредить, что это мой первый проект поэтому судите строго, но не...

2
70 / 57 / 31
Регистрация: 05.09.2013
Сообщений: 665
22.03.2016, 16:42 2
Увеличить количество элементов) При таком количестве потери времени на создание потоков и прочее довольно большие, а значит и выигрыша нет.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.03.2016, 17:32 3
xVIKx, ну тут много проблем Неэффективное использование кэша, малая размерность задачи, ручное создание потоков, неправильный замер времени...
0
22.03.2016, 17:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.03.2016, 17:32
Помогаю со студенческими работами здесь

Ошибка в многопоточной программе
Здравствуйте! Есть простая программа, которая выдает список всех папок в заданной папке (включая...

Перемножение матриц, умножение матриц на вектор, сложение матриц
Помогите пожалуйста написать программу, которая производит основные действия с матрицами...

Безопасный список в многопоточной программе
Итак, пусть есть некоторая программа. Предположим, что это игровой сервер. Необходимо вести в...

Функция с fprintf в многопоточной программе
Насколько я знаю, fprintf не многопоточен. Т.е. я не могу просто взять и использовать fprintf() в...

Устранение узкого места в многопоточной программе
Доброго времени суток, столкнулся с узким местом при разработке много поточной программы на питоне....

Умножение матриц с интерфейсом и возможность заполнения исходных матриц из файла
Здравствуйте. Я сделал программу, которая умножает матрицы с интерфейсом, только проблема в том что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru