С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/40: Рейтинг темы: голосов - 40, средняя оценка - 4.50
9 / 1 / 0
Регистрация: 10.12.2015
Сообщений: 41

Параллельное сложение матриц(двумерного массива) используя thread

28.10.2018, 20:37. Показов 7981. Ответов 4

Студворк — интернет-сервис помощи студентам
Здравствуйте, пытаюсь сделать параллельное сложение матриц.
объявлены 3 матрицы, допустим размерность матриц равна 4.
C#
1
static int[,] Mtrx1, Mtrx2, Mtrx3;
1 и 2 матрица заполнены, и далее я вызываю метод который содержит следующее:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
Thread[] threads = new Thread[4];
 
for (int t = 0; t < 4; t++)
{
      threads[t] = new Thread(() =>
      {
             for (int j = 0; j < 4; j++)
                   Mtrx3[t,j] = Mtrx1[t,j] + Mtrx2[t,j];
      });
}
 
foreach (Thread item in threads) item.Start();
foreach (Thread item in threads) item.Join();
При дебаге, и установке паузы на цикле for, в него передается t = 4, далее соответственно IndexOutOfRangeException, почему такое происходит? цикл же ограничен t < 4.
Если в матрицу передать значение на 1 меньше для строки, то сработает только последний поток для 4 строчки матрицы.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.10.2018, 20:37
Ответы с готовыми решениями:

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

Реализовать сложение матриц используя Абстрактый класс
Нужно реализовать сложение матриц используя Абстрактый клас, Виртуальность, полиморфизм. не понимаю как это работает #include...

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

4
 Аватар для PoPsa85
814 / 561 / 240
Регистрация: 01.07.2018
Сообщений: 1,818
28.10.2018, 22:44
iGNi7e, Может стоит посмотреть в сторону Parrallel.For
0
9 / 1 / 0
Регистрация: 10.12.2015
Сообщений: 41
28.10.2018, 23:04  [ТС]
Спасибо, смотрел, интересует именно этот метод, так как хочется рассмотреть 4 способа.
1) прямое сложение
2) с помощью Parrallel.For
3) с помощью Thread
4) с помощью класса задач Task.
Вот с последними двумя возникает проблема в цикле for
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
30.10.2018, 15:25
Лучший ответ Сообщение было отмечено iGNi7e как решение

Решение

iGNi7e, не нужно лишний раз при вызове лямбда-функции использовать замыкания.
Передали замыканием числа в лямбда-функцию и забываем вообще про запускач потока.
Вполне рабочий вариант для квадратных матриц. Можно переделать на вектор или прямоугольные матрицы.

Общий принцип - фронт работ нарезаем крупными ломтиками на M потоков,
полученное вещественное число округляем вверх, перемножаем на M.
Полученное число может быть больше K (размерности квадратной матрицы), тогда часть потоков не будем создавать.
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
using System;
using System.Threading;
 
namespace Question2341783
{
    class Program
    {
 
        private static int[,] Mtrx1, Mtrx2, Mtrx3;
        // Размер квадратной матрицы
        private static int k = 4;
        // Максимальное количество потоков. 
        private static int m = 3;
        // Массив потоков. 
        private static Thread[] threads;
 
        static void Main(string[] args)
        {
            InitMatrix();
            ShowMatrix(Mtrx1);
            ShowMatrix(Mtrx2);
            Job();
 
            ShowMatrix(Mtrx3);
            Console.ReadKey();
        }
 
        private static void InitMatrix()
        {
            Random random = new Random();
            Mtrx1 = new int[k, k];
            Mtrx2 = new int[k, k];
            Mtrx3 = new int[k, k];
 
            for (int i = 0; i < k; i++)
                for (int j = 0; j < k; j++)
                {
                    Mtrx1[i, j] = random.Next(1, 10);
                    Mtrx2[i, j] = random.Next(1, 10);
                }
        }
 
        // Вывести на экран квадратную матрицу
        private static void ShowMatrix(int[,] matrix)
        {
            for (int i = 0; i < k; i++)
            {
                for (int j = 0; j < k; j++)
                {
                    Console.Write($"{matrix[i, j],3}");
                }
                Console.WriteLine();
            }
            Console.WriteLine();
        }
 
        /// <summary>
        /// Для упрощения все M потоков должны охватить N строк матрицы
        /// </summary>
        private static void Job()
        {
            threads = new Thread[m];
 
            var range = (int)Math.Ceiling((double)k / m);
 
            for (int i = 0; i < m; i++)
            {
                int start = i * range,
                    end = start + range - 1;
 
                if (start > k - 1)
                    break;
                if (end > k - 1)
                    end = k - 1;
 
                threads[i] = new Thread(() => { SumRange(start, end); });
                threads[i].Start();
                threads[i].Join();
            }
        }
 
        private static void SumRange(int start, int end)
        {
            for (int i = start; i <= end; i++)
            {
                for (int j = 0; j < k; j++)
                {
                    Mtrx3[i, j] = Mtrx1[i, j] + Mtrx2[i, j];
                }
            }
        }
 
    }
}
2
9 / 1 / 0
Регистрация: 10.12.2015
Сообщений: 41
30.10.2018, 20:57  [ТС]
amr-now, спасибо за решение!
Я кстати сделал по другому:

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
int threadCount = 4;
Thread[] threads = new Thread[threadCount ];
part = dim / threadCount;
ost = dim % threadCount;
 
for (int t = 0; t < 4; t++)
     {
       threads[t] = new Thread( Iniz );
     }
 
int h = 0;
foreach ( Thread item in threads )
      {
        item.Start( h );
        h++;
       }
foreach (Thread item in threads) item.Join();
 
//это отдельный метод
//dim - размерность матрицы
private static void Iniz(object g)
        {
            for (int i = (int)g * part; i < ((int)g + 1) * part; i++)
                for (int j = 0; j < dim; j++)
                    Mtrx3[i, j] = Mtrx1[i, j] + Mtrx2[i, j];
            for ( int i = 1; i <= ost; i++ )
            {
                for ( int j = 0; j < dim; j++ )
                    Mtrx3[dim - i, j] = Mtrx1[dim - i, j] + Mtrx2[dim - i, j];
            }
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.10.2018, 20:57
Помогаю со студенческими работами здесь

Ошибка при передаче двумерного массива в функцию std::thread
Здравствуйте! Написал программу на потоки, теперь нужно передать туда двумерный массив. Пытаюсь передать по ссылке, но каждый раз...

Сложение элементов двумерного массива
Нужно создать два двумерных массива 5 на 5, заполнить их случайными числами от 1 до 4, сложить соответствующие элементы (мас1 и мас2,мас1 и...

Сложение и умножение двумерного массива
Добрый день,нужно написать программу на делфи: Двумерный массив сложение и умножение главных диагоналей.Поиск двумерного массива. Заранее...

Сложение цифр строке двумерного массива
Помогите пожалуйста, нужно просуммировать строки двумерного массива и вывести номер строки где число самое большое

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru