118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
|
||||||
1 | ||||||
MPI сложение массивов27.11.2017, 22:23. Показов 8235. Ответов 12
Метки нет (Все метки)
Добрый вечер. Есть программа MPI, в которой для каждого процесса есть своя область работы над массивом. Например:
Код
процесс 1 работает с [0, 1, 2, 3, 4, 5, 6] процесс 2 работает с [7, 8, 9, 10, 11, 12] процесс 3 работает с [13, 14, 15] Код
1- [0, 1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0] 2- [0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 0, 0, 0] 3- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 15]
0
|
27.11.2017, 22:23 | |
Ответы с готовыми решениями:
12
Сложение векторов (MPI) Сложение массивов сложение массивов Сложение Массивов |
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
27.11.2017, 23:22 | 2 |
0
|
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
|
||||||
28.11.2017, 00:34 [ТС] | 3 | |||||
Уже делал... Понял, что ошибка не в нем, а в непонятной мне "неведомой зверушке".
Прилагаю весь код, по нему производится разбиение на процессы операции умножения матриц. Если брать пример выше, то на 4 процесса (0 - для ввода \ вывода) и матрицы 4*4 = 16, на каждый процесс (которых 3) будет не больше 6 вычислений значения конечной матрицы на ядро.
Код
int arr[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; Кликните здесь для просмотра всего текста
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
||||||
28.11.2017, 01:22 | 4 | |||||
darksector, Ошибки связаны с тем, что память выделенную new[] надо освобождать delete[], а не free.
Запустите этот код, и убедитесь, что проблема не в MPI_Reduce():
1
|
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
|
|
28.11.2017, 01:45 [ТС] | 5 |
Да, есть такое, но сути не меняет.
Я знаю, это я и написал чуть выше. Я не понимаю, почему у меня в result массиве первые два числа получаются отрицательными. Если "поспамить", то можно заметить, что эти числа не статичные... Добавлено через 11 минут Причем проблема уходит если length (длина квадратной матрицы) > 5
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
28.11.2017, 01:51 | 6 |
1) Память выделяется в строках 114-118, а length бродкстится только в 126 строке. Перенесите 126 строку до 114.
2) Собственно в этих же строках tmp_a не обнуляется там мусор. Добавлено через 55 секунд Ну и замените free(matrix) на delete[] matrix.
1
|
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
|
|
28.11.2017, 02:01 [ТС] | 7 |
Да, это косяк который я не заметил, спасибо.
А вот тут не верно, т.к. в tmp_a всех процессов как раз нулевые матрицы от MatrixInit_Zero изменяются конкретные значения, которые попадают в диапазон вычисления матрицы. Т.е. там априори не может быть ничего подобного. Т.к. каждый раз при умножении это новая нулевая матрица для каждого процесса. Код
1- [0, 1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0] 2- [0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 0, 0, 0] 3- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 15] Да, добавил. Спасибо. Теперь на MPI_Finalize не ругается.
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
28.11.2017, 02:06 | 8 |
0
|
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
|
|
28.11.2017, 02:09 [ТС] | 9 |
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
28.11.2017, 02:22 | 10 |
Рассмотрим 2й блок.
В 116 строке tmp_a=new int[... В 136 строке tmp_a=Matrix... Внутри которой result=MatrixInitZero внутри которой matrix = new... После возврата из умножения в tmp_a будет адрес памяти, выделенной в InitZero. Предыдущая память, выделенная в 116 строке потеряется... Об этом много написано. Просто запомните, что если вы управляете памятью, вы всегда должны понимать, кто ей владеет. Самый простой подход: где выделили - там и удаляем. Выделяйте память только в main в функции передавайте указатель. У вас, например, перегружена функция InitRand. Одна выделяет, другая не выделяет - там черт ногу сломит. Вы сами запутались где и что выделяется. Но tmp_a то из него суммируется с остальными и при этом не обнуляется.
1
|
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
|
|
28.11.2017, 02:29 [ТС] | 11 |
А... это. Просто понятия не имею, каким образом реализован этот MPI, многое остается за кадром и загадками. Не думал, что он так сильно привязан к определенным адресам.
Так или иначе все это пишется для больших матриц, а матрицы размера меньше 6*6 (т.е. с 5), где и появляется баги... Да и бог с ним. Смысла от многопоточности нету. Спасибо за помощь.
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
28.11.2017, 02:32 | 12 |
0
|
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
|
|
28.11.2017, 15:46 [ТС] | 13 |
Ошибка в сложении была в том, что tmp_a и tmp_b не обнулялись в 0-ом процессе после выделения памяти и при сумме через MPI_Reduce приводило к этому "мусору".
0
|
28.11.2017, 15:46 | |
28.11.2017, 15:46 | |
Помогаю со студенческими работами здесь
13
Сложение массивов Сложение и присвоение массивов Сложение двух массивов. Сложение двух массивов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |