58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
||||||
1 | ||||||
Умножение матриц (g++)09.12.2020, 14:54. Показов 7976. Ответов 6
Метки нет (Все метки)
Имеется демонстрационный код (умножение матриц). Структура вида:
-Инициализация данных -Алгоритм без распараллеливания -Алгоритм с использованием директивы openMP (parallel for) После каждого из алгоритмов выводится время выполнения. Компилирую так: Код
$ g++ fileName -o -matrix -fopenmp $ ./matrix Кликните здесь для просмотра всего текста
0
|
09.12.2020, 14:54 | |
Ответы с готовыми решениями:
6
Умножение матриц с использованием OpenMP Ленточное умножение матриц с использованием MPI Перемножение матриц, умножение матриц на вектор, сложение матриц Процедуры. Умножение матриц, векторов. Скалярное умножение. Надо найти ошибку Транспонирование, умножение матриц, сложение матриц Реализовать в одной программере |
1566 / 1492 / 248
Регистрация: 19.02.2010
Сообщений: 4,048
|
|
09.12.2020, 16:54 | 2 |
Проблема совсем не в этом. Проблема в том, что пытаетесь распараллелить говнокод.
А именно - хреновый паттерн доступа к памяти (при обращении к элементам матрицы b). Перед перемножением транспонируйте матрицу b (т.е. в коде затем будет умножаться строка из a на строку из bT) - и перемножение ускорится в разы даже без распараллеливания. Для более быстрого проведения эксперимента можете даже не транспонировать - а предположить, что матрица b уже транспонирована, и просто переставить в умножающей строке индексы (будет *b[j][k]). Ждём-с цифр времени выполнения исходного варианта кода и предлагаемого транспонированного
1
|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
||||||
09.12.2020, 19:06 [ТС] | 3 | |||||
Да, встречал в одном примере такой эффект. Что-то про опережающее считывание в кэш процессора. Даже в этой программе пробовал. Сейчас написал еще раз, добавил двойной for для транспонирования, вынес за расчет времени выполнения. В этом случае - да, есть "минус" по времени. Параллельный код все еще жрет столько же, сколько нераспараллеленный.
Кликните здесь для просмотра всего текста
0
|
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
09.12.2020, 20:00 | 4 |
У меня твой код показывает
И в дебаге примерно такое же соотношение Добавлено через 37 секунд Ты наверное openmp не включил в опциях компилятора Добавлено через 4 минуты И где ты проверяешь, на локальном компе?
1
|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
|
09.12.2020, 20:07 [ТС] | 5 |
Все подключаемые опции привел в первом сообщении.
Да, на своем локальном и у сокурсника.
0
|
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
09.12.2020, 20:11 | 6 |
Ну, в Visual C++ всё работает нормально, я показал. Проверить на gcc возможности нет, но проблема, скорее всего не в коде
1
|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
|
09.12.2020, 22:53 [ТС] | 7 |
Проблема была в использованной библиотеке для подсчета времени выполнения. Как мне объяснили, clock() выдает суммарное время работы всех потоков. Заменили на chrono - все заработало.
0
|
09.12.2020, 22:53 | |
09.12.2020, 22:53 | |
Помогаю со студенческими работами здесь
7
Умножение матриц с интерфейсом и возможность заполнения исходных матриц из файла Написать программу, выполняющую функции калькулятора матриц (транспонирование матрицы, умножение матриц) Умножение треугольных матриц«Методы обработки разреженных матриц» Чтение матриц с внешнего файла, умножение матриц... Умножение матриц (не работает для неквадратных матриц) Сложение, вычитание, умножение матриц, умножение матрицы на число, сортировка элементов строк матрицы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |