Форум программистов, компьютерный форум, киберфорум
MPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/40: Рейтинг темы: голосов - 40, средняя оценка - 4.83
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
1

MPI сложение массивов

27.11.2017, 22:23. Показов 8235. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер. Есть программа MPI, в которой для каждого процесса есть своя область работы над массивом. Например:

C++
1
int arr[16] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
Допустим у нас 3 рабочих процесса, тогда:

Код
процесс 1 работает с [0, 1, 2, 3, 4, 5, 6]
процесс 2 работает с [7, 8, 9, 10, 11, 12]
процесс 3 работает с [13, 14, 15]
В результате работы процессов у них получаются массивы из 16 элементов, но там где они не работали изначально 0-и, т.е.
Код
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 функция попарной суммы элементов, чтобы получился единый массив?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2017, 22:23
Ответы с готовыми решениями:

Сложение векторов (MPI)
Суть такая. Есть массив a и b c. Корды первого вектора это a a т.е. x1 y1 Корды второго вектора...

Сложение массивов
Произвести сложение двух массивов 5х3 по правилам сложения матриц.

сложение массивов
Напишите функцию, которая складывает поэлементно два массива, и записывает результ...

Сложение Массивов
Помогите у меня такая задача есть двумерный массив 225x225 это массив нужно разбить на другие...

12
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.11.2017, 23:22 2
Цитата Сообщение от darksector Посмотреть сообщение
есть в ли в MPI функция попарной суммы элементов, чтобы получился единый массив?
MPI_Reduce / MPI_Allreduce
0
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
28.11.2017, 00:34  [ТС] 3
Цитата Сообщение от avgoor Посмотреть сообщение
MPI_Reduce / MPI_Allreduce
Уже делал... Понял, что ошибка не в нем, а в непонятной мне "неведомой зверушке".

Прилагаю весь код, по нему производится разбиение на процессы операции умножения матриц.
Если брать пример выше, то на 4 процесса (0 - для ввода \ вывода) и матрицы 4*4 = 16, на каждый процесс (которых 3) будет не больше 6 вычислений значения конечной матрицы на ядро.

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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include <iostream>
#include <mpi.h>
#include <cstdlib>
 
using namespace std;
 
int* MatrixInit_Rand(int length)
{
    int* matrix = new int[length * length];
    int index = 1;
    for (int row = 0; row < length; row++)
    {
        for (int col = 0; col < length; col++)
        {
            //matrix[length * row + col] = rand();
            matrix[length * row + col] = index++;
        }
    }
 
    return matrix;
}
 
int* MatrixInit_Rand(int* matrix, int length)
{
    int index = 1;
    for (int row = 0; row < length; row++)
    {
        for (int col = 0; col < length; col++)
        {
            //matrix[length * row + col] = rand();
            matrix[length * row + col] = index++;
        }
    }
 
    return matrix;
}
 
int* MatrixInit_Zero(int length)
{
    int* matrix = new int[length * length];
 
    for (int row = 0; row < length; row++)
    {
        for (int col = 0; col < length; col++)
        {
            matrix[length * row + col] = 0;
        }
    }
 
    return matrix;
}
 
void MatrixDelete(int *matrix)
{
    free(matrix);
}
 
void MatrixPrint(int *matrix, int length)
{
    for (int row = 0; row < length; row++)
    {
        for (int col = 0; col < length; col++)
        {
            cout << matrix[length * row + col] << " ";
        }
 
        cout << endl;
    }
}
 
 
int* MatrixMultiplication(int* matrix_a, int* matrix_b, int thread, int count, int length)
{
    int* result = MatrixInit_Zero(length);
 
    int row_start = (thread - 1) * count / length;
    int col_start = (thread - 1) * count % length;
    bool col_complate = false;
 
    for (int row = row_start; (count > 0) && (row < length); row++)
    {
        for (int col = (!col_complate) ? col_start : 0; (count > 0) && (col < length); col++, count--)
        {
            result[length * row + col] = 0;
            for (int inner = 0; inner < length; inner++)
            {
                result[length * row + col] += matrix_a[length * row + inner] * matrix_b[length * inner + col];
            }
        }
        col_complate = true;
    }
 
    return result;
}
 
int main(int argc, char* argv[])
{
    int length = 0;
 
    MPI_Init(NULL, NULL);
 
    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);
 
    int world_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
 
    if (world_rank == 0)
    {
        cout << "Matrix length: ";
        cin >> length;
    }
 
    int *matrix_a = new int[length * length];
    int *matrix_b = new int[length * length];
    int *tmp_a = new int[length * length];
    int *tmp_b = new int[length * length];
    int *result = MatrixInit_Zero(length);
 
    if (world_rank == 0)
    {
        matrix_a = MatrixInit_Rand(matrix_a, length);
        matrix_b = MatrixInit_Rand(matrix_b, length);
    }
 
    MPI_Bcast(&length, 1, MPI_INT, 0, MPI_COMM_WORLD);
    MPI_Bcast(matrix_a, length * length, MPI_INT, 0, MPI_COMM_WORLD);
    MPI_Bcast(matrix_b, length * length, MPI_INT, 0, MPI_COMM_WORLD);
 
    // количество действий (в данном случае умножения) на ядро
    int count = ((length * length / (world_size - 1)) == 0) ? length * length / (world_size - 1) : length * length / (world_size - 1) + 1;
    MPI_Status st;
 
    if (world_rank != 0)
    {
        tmp_a = MatrixMultiplication(matrix_a, matrix_a, world_rank, count, length);
        tmp_b = MatrixMultiplication(matrix_b, matrix_b, world_rank, count, length);
    }
 
    // восстанавливаем матрицу
    // т.к. некоторые значения 0-вые, то будем использовать сумму
    
    MPI_Reduce(tmp_a, result, length * length, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
 
    if (world_rank == 0) MatrixPrint(result, length);
 
    //MatrixDelete(matrix_a);
    //MatrixDelete(matrix_b);
    //MatrixDelete(tmp_a);
    //MatrixDelete(tmp_b);
    //MatrixDelete(result);
 
    MPI_Finalize();
    
    return 0;
}
На примере я просто вывожу матрицу при N*N, при N = 4 во вторую степень
Код
int arr[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
Ответ получается не верным (только 1-е 2 числа)
-1221851126 -1221851116 110 120
202 228 254 280
314 356 398 440
426 484 542 600
А так же ошибки типа bad terminal:
Кликните здесь для просмотра всего текста
*** Error in `./main': free(): invalid next size (fast): 0x097cfa48 ***
*** Error in `./main': free(): invalid next size (fast): 0x0909fa48 ***
*** Error in `./main': free(): invalid next size (fast): 0x09610a48 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x67377)[0xb71ae377]
/lib/i386-linux-gnu/libc.so.6(+0x6d2f7)[0xb71b42f7]
/lib/i386-linux-gnu/libc.so.6(+0x6dc31)[0xb71b4c31]
/usr/lib/i386-linux-gnu/libmpich.so.12(MPIR_Comm_delete_internal+0x143)[0xb754b1a3]
/usr/lib/i386-linux-gnu/libmpich.so.12(MPIR_Comm_release_always+0x31)[0xb754b471]
/usr/lib/i386-linux-gnu/libmpich.so.12(MPID_Finalize+0x48)[0xb7599358]
/usr/lib/i386-linux-gnu/libmpich.so.12(PMPI_Finalize+0x170)[0xb7508520]
./main[0x8048fe8]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf7)[0xb715f637]
./main[0x8048901]
======= Memory map: ========
08048000-0804a000 r-xp 00000000 08:11 7361 /media/student-pmi/68B87AD1B87A9D6E/Параллельное программирование/labs/lab_3/main
0804a000-0804b000 r--p 00001000 08:11 7361 /media/student-pmi/68B87AD1B87A9D6E/Параллельное программирование/labs/lab_3/main
0804b000-0804c000 rw-p 00002000 08:11 7361 /media/student-pmi/68B87AD1B87A9D6E/Параллельное программирование/labs/lab_3/main
09601000-09626000 rw-p 00000000 00:00 0 [heap]
b5d14000-b5fc6000 rw-p 00000000 00:00 0
b5fc6000-b5fd1000 r-xp 00000000 08:01 10749535 /lib/i386-linux-gnu/libnss_files-2.23.so
b5fd1000-b5fd2000 r--p 0000a000 08:01 10749535 /lib/i386-linux-gnu/libnss_files-2.23.so
b5fd2000-b5fd3000 rw-p 0000b000 08:01 10749535 /lib/i386-linux-gnu/libnss_files-2.23.so
b5fd3000-b5fd9000 rw-p 00000000 00:00 0
b6f00000-b6f21000 rw-p 00000000 00:00 0
b6f21000-b7000000 ---p 00000000 00:00 0
b709a000-b709d000 rw-p 00000000 00:00 0
b709d000-b70a000======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x67377)[0xb71dc377]
/lib/i386-linux-gnu/libc.so.6(+0x6d2f7)[0xb71e22f7]
/lib/i386-linux-gnu/libc.so.6(+0x6dc31)[0xb71e2c31]
/usr/lib/i386-linux-gnu/libmpich.so.12(MPIR_Comm_delete_internal+0x143)[0xb75791a3]
/usr/lib/i386-linux-gnu/libmpich.so.12(MPIR_Comm_release_always+0x31)[0xb7579471]
/usr/lib/i386-linux-gnu/libmpich.so.12(MPID_Finalize+0x48)[0xb75c7358]
/usr/lib/i386-linux-gnu/libmpich.so.12(PMPI_Finalize+0x170)[0xb7536520]
./main[0x8048fe8]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf7)[0xb718d637]
./main[0x8048901]
======= Memory map: ========
08048000-0804a000 r-xp 00000000 08:11 7361 /media/student-pmi/68B87AD1B87A9D6E/Параллельное программирование/labs/lab_3/main
0804a000-0804b000 r--p 00001000 08:11 7361 /media/student-pmi/68B87AD1B87A9D6E/Параллельное программирование/labs/lab_3/main
0804b000-0804c000 rw-p 00002000 08:11 7361 /media/student-pmi/68B87AD1B87A9D6E/Параллельное программирование/labs/lab_3/main
097c0000-097e5000 rw-p 00000000 00:00 0 [heap]
b5d42000-b5ff4000 rw-p 00000000 00:00 0
b5ff4000-b5fff000 r-xp 00000000 08:01 10749535 /lib/i386-linux-gnu/libnss_files-2.23.so
b5fff000-b6000000 r--p 0000a000 08:01 10749535 /lib/i386-linux-gnu/libnss_files-2.23.so
b6000000-b6001000 rw-p 0000b000 08:01 10749535 /lib/i386-linux-gnu/libnss_files-2.23.so
b6001000-b6007000 rw-p 00000000 00:00 0
b6f00000-b6f21000 rw-p 00000000 00:00 0
b6f21000-b7000000 ---p 00000000 00:00 0
b70c8000-b70cb000 rw-p 00000000 00:00 0
b70cb000-b70ce000 r-xp 00000000 08:01 10749462 /lib/i386-linux-gnu/libdl-2.23.so
b70ce000-b70cf000 r--p 00002000 08:01 10749462 /lib/i386-linux-gnu/libdl-2.23.so
b70cf000-b70d0000 rw-p 00003000 08:01 10749462 /lib/i386-linux-gnu/libdl-2.23.so
b70d0000-b7123000 r-xp 00000000 08:01 10749508 /lib/i386-linux-gnu/libm-2.23.so
b7123000-b7124000 r--p 00052000 08:01 10749508 /lib/i386-linux-gnu/libm-2.23.so
b7124000-b7125000 rw-p 00053000 08:01 10749508 /lib/i386-linux-gnu/libm-2.23.so
b7125000-b7126000 rw-p 00000000 00:00 0
b7126000-b7142000 r-xp 00000000 08:01 10749476 /lib/i386-linux-gnu/libgcc_s.so.1
b7142000-b7143000 rw-p 0001b000 08:01 10749476 /lib/i386-linux-gnu/libgcc_s.so.1
b7143000-b715c000 r-xp 00000000 08:01 10749582 /lib/i386-linux-gnu/libpthread-2.23.so
b715c000-b715d000 r--p 00018000 08:01 10749582 /lib/i386-linux-gnu/libpthread-2.23.so
b715d000-b715e000 rw-p 00019000 08:01 10749582 /lib/i386-linux-gnu/libpthread-2.23.so
b715e000-b7160000 rw-p 00000000 00:00 0
b7160000-b7167000 r-xp 00000000 08:01 10749590 /lib/i386-linux-gnu/librt-2.23.so
b7167000-b7168000 r--p 00006000 08:01 10749590 /lib/i386-linux-gnu/librt-2.23.so
b7168000-b7169000 rw-p 00007000 08:01 10749590 /lib/i386-linux-gnu/librt-2.23.so
b7169000-b7172000 r-xp 00000000 08:01 15206563 /usr/lib/libcr.so.0.5.5
b7172000-b7173000 r--p 00008000 08:01 15206563 /usr/lib/libcr.so.0.5.5
b7173000-b7174000 rw-p 00009000 08:01 15206563 /usr/lib/libcr.so.0.5.5
b7174000-b7175000 rw-p 00000000 00:00 0
b7175000-b7325000 r-xp 00000000 08:01 10749438 /lib/i386-linux-gnu/libc-2.23.so
b7325000-b7327000 r--p 001af000 08:01 10749438 /lib/i386-linux-gnu/libc-2.23.so
b7327000-b7328000 rw-p 001b1000 08:01 10749438 /lib/i386-linux-gnu/libc-2.23.so
b7328000-b732b000 rw-p 00000000 00:00 0
b732b000-b7498000 r-xp 00000000 08:01 15204540 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.21
b7498000-b7499000 ---p 0016d000 08:01 15204540 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.21
b7499000-b749e000 r--p 0016d000 08:01 15204540 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.21
b749e000-b749f000 rw-p 00172000 08:01 15204540 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.21
b749f000-b74a2000 rw-p 00000000 00:00 0
b74a2000-b7721000 r-xp 00000000 08:01 15206608 /usr/lib/i386-linux-gnu/libmpich.so.12.1.0
b7721000-b7728000 r--p 0027e000 08:01 15206608 /usr/lib/i386-linux-gnu/libmpich.so.12.1.0
b7728000-b772a000 rw-p 00285000 08:01 15206608 /usr/lib/i386-linux-gnu/libmpich.so.12.1.0
b772a000-b7758000 rw-p 00000000 00:00 0
b776f000-b7772000 rw-p 00000000 00:00 0
b7772000-b7774000 r--p 00000000 00:00 0 [vvar]
b7774000-b7776000 r-xp 00000000 00:00 0 [vdso]
b7776000-b7798000 r-xp 00000000 08:01 10749410 /lib/i386-linux-gnu/ld-2.23.so
b7798000-b7799000 rw-p 00000000 00:00 0
b7799000-b779a000 r--p 00022000 08:01 10749410 /lib/i386-linux-gnu/ld-2.23.so
b779a000-b779b000 rw-p 00023000 08:01 10749410 /lib/i386-linux-gnu/ld-2.23.so
bf866000-bf887000 rw-p 00000000 00:00 0 [stack]
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x67377)[0xb723a377]
/lib/i386-linux-gnu/libc.so.6(+0x6d2f7)[0xb72402f7]
/lib/i386-linux-gnu/libc.so.6(+0x6dc31)[0xb7240c31]
/usr/lib/i386-linux-gnu/libmpich.so.12(MPIR_Comm_delete_internal+0x143)[0xb75d71a3]
/usr/lib/i386-linux-gnu/libmpich.so.12(MPIR_Comm_release_always+0x31)[0xb75d7471]
/usr/lib/i386-linux-gnu/libmpich.so.12(MPID_Finalize+0x48)[0xb7625358]
/usr/lib/i386-linux-gnu/libmpich.so.12(PMPI_Finalize+0x170)[0xb7594520]
./main[0x8048fe8]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf7)[0xb71eb637]
./main[0x8048901]
======= Memory map: ========
08048000-0804a000 r-xp 00000000 08:11 7361 /media/student-pmi/68B87AD1B87A9D6E/Параллельное программирование/labs/lab_3/main
0804a000-0804b000 r--p 00001000 08:11 7361 /media/student-pmi/68B87AD1B87A9D6E/Параллельное программирование/labs/lab_3/main
0804b000-0804c000 rw-p 00002000 08:11 7361 /media/student-pmi/68B87AD1B87A9D6E/Параллельное программирование/labs/lab_3/main
09090000-090b5000 rw-p 00000000 00:00 0 [heap]
b5da0000-b6052000 rw-p 00000000 00:00 0
b6052000-b605d000 r-xp 00000000 08:01 10749535 /lib/i386-linux-gnu/libnss_files-2.23.so
b605d000-b605e000 r--p 0000a000 08:01 10749535 /lib/i386-linux-gnu/libnss_files-2.23.so
b605e000-b605f000 rw-p 0000b000 08:01 10749535 /lib/i386-linux-gnu/libnss_files-2.23.so
b605f000-b6065000 rw-p 00000000 00:00 0
b7000000-b7021000 rw-p 00000000 00:00 0
b7021000-b7100000 ---p 00000000 00:00 0
b7126000-b7129000 rw-p 00000000 00:00 0
b7129000-b712c000 r-xp 00000000 08:01 10749462 /lib/i386-linux-gnu/libdl-2.23.so
b712c000-b712d000 r--p 00002000 08:01 10749462 /lib/i386-linux-gnu/libdl-2.23.so
b712d000-b712e000 rw-p 00003000 08:01 10749462 /lib/i386-linux-gnu/libdl-2.23.so
b712e000-b7181000 r-xp 00000000 08:01 10749508 /lib/i386-linux-gnu/libm-2.23.so
b7181000-b7182000 r--p 00052000 08:01 10749508 /lib/i386-linux-gnu/libm-2.23.so
b7182000-b7183000 rw-p 00053000 08:01 10749508 /lib/i386-linux-gnu/libm-2.23.so
b7183000-b7184000 rw-p 00000000 00:00 0
b7184000-b71a0000 r-xp 00000000 08:01 10749476 /lib/i386-linux-gnu/libgcc_s.so.1
b71a0000-b71a1000 rw-p 0001b000 08:01 10749476 /lib/i386-linux-gnu/libgcc_s.so.1
b71a1000-b71ba000 r-xp 00000000 08:01 10749582 /lib/i386-linux-gnu/libpthread-2.23.so
b71ba000-b71bb000 r--p 00018000 08:01 10749582 /lib/i386-linux-gnu/libpthread-2.23.so
b71bb000-b71bc000 rw-p 00019000 08:01 10749582 /lib/i386-linux-gnu/libpthread-2.23.so
b71bc000-b71be000 rw-p 00000000 00:00 0
b71be000-b71c5000 r-xp 00000000 08:01 10749590 /lib/i386-linux-gnu/librt-2.23.so
b71c5000-b71c6000 r--p 00006000 08:01 10749590 /lib/i386-linux-gnu/librt-2.23.so
b71c6000-b71c7000 rw-p 00007000 08:01 10749590 /lib/i386-linux-gnu/librt-2.23.so
b71c7000-b71d0000 r-xp 00000000 08:01 15206563 /usr/lib/libcr.so.0.5.5
b71d0000-b71d1000 r--p 00008000 08:01 15206563 /usr/lib/libcr.so.0.5.5
b71d1000-b71d2000 rw-p 00009000 08:01 15206563 /usr/lib/libcr.so.0.5.5
b71d2000-b71d3000 rw-p 00000000 00:00 0
b71d3000-b7383000 r-xp 00000000 08:01 10749438 /lib/i386-linux-gnu/libc-2.23.so
b7383000-b7385000 r--p 001af000 08:01 10749438 /lib/i386-linux-gnu/libc-2.23.so
b7385000-b7386000 rw-p 001b1000 08:01 10749438 /lib/i386-linux-gnu/libc-2.23.so
b7386000-b7389000 rw-p 00000000 00:00 0
b7389000-b74f6000 r-xp 00000000 08:01 15204540 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.21
b74f6000-b74f7000 ---p 0016d000 08:01 15204540 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.21
b74f7000-b74fc000 r--p 0016d000 08:01 15204540 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.21
b74fc000-b74fd000 rw-p 00172000 08:01 15204540 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.21
b74fd000-b7500000 rw-p 00000000 00:00 0
b7500000-b777f000 r-xp 00000000 08:01 15206608 /usr/lib/i386-linux-gnu/libmpich.so.12.1.0
b777f000-b7786000 r--p 0027e000 08:01 15206608 /usr/lib/i386-linux-gnu/libmpich.so.12.1.0
b7786000-b7788000 rw-p 00285000 08:01 15206608 /usr/lib/i386-linux-gnu/libmpich.so.12.1.0
b7788000-b77b6000 rw-p 00000000 00:00 0
b77cd000-b77d0000 rw-p 00000000 00:00 0
b77d0000-b77d2000 r--p 00000000 00:00 0 [vvar]
b77d2000-b77d4000 r-xp 00000000 00:00 0 [vdso]
b77d4000-b77f6000 r-xp 00000000 08:01 10749410 /lib/i386-linux-gnu/ld-2.23.so
b77f6000-b77f7000 rw-p 00000000 00:00 0
b77f7000-b77f8000 r--p 00022000 08:01 10749410 /lib/i386-linux-gnu/ld-2.23.so
b77f8000-b77f9000 rw-p 00023000 08:01 10749410 /lib/i386-linux-gnu/ld-2.23.so
bf90e000-bf92f000 rw-p 00000000 00:00 0 [stack]
0 r-xp 00000000 08:01 10749462 /lib/i386-linux-gnu/libdl-2.23.so
b70a0000-b70a1000 r--p 00002000 08:01 10749462 /lib/i386-linux-gnu/libdl-2.23.so
b70a1000-b70a2000 rw-p 00003000 08:01 10749462 /lib/i386-linux-gnu/libdl-2.23.so
b70a2000-b70f5000 r-xp 00000000 08:01 10749508 /lib/i386-linux-gnu/libm-2.23.so
b70f5000-b70f6000 r--p 00052000 08:01 10749508 /lib/i386-linux-gnu/libm-2.23.so
b70f6000-b70f7000 rw-p 00053000 08:01 10749508 /lib/i386-linux-gnu/libm-2.23.so
b70f7000-b70f8000 rw-p 00000000 00:00 0
b70f8000-b7114000 r-xp 00000000 08:01 10749476 /lib/i386-linux-gnu/libgcc_s.so.1
b7114000-b7115000 rw-p 0001b000 08:01 10749476 /lib/i386-linux-gnu/libgcc_s.so.1
b7115000-b712e000 r-xp 00000000 08:01 10749582 /lib/i386-linux-gnu/libpthread-2.23.so
b712e000-b712f000 r--p 00018000 08:01 10749582 /lib/i386-linux-gnu/libpthread-2.23.so
b712f000-b7130000 rw-p 00019000 08:01 10749582 /lib/i386-linux-gnu/libpthread-2.23.so
b7130000-b7132000 rw-p 00000000 00:00 0
b7132000-b7139000 r-xp 00000000 08:01 10749590 /lib/i386-linux-gnu/librt-2.23.so
b7139000-b713a000 r--p 00006000 08:01 10749590 /lib/i386-linux-gnu/librt-2.23.so
b713a000-b713b000 rw-p 00007000 08:01 10749590 /lib/i386-linux-gnu/librt-2.23.so
b713b000-b7144000 r-xp 00000000 08:01 15206563 /usr/lib/libcr.so.0.5.5
b7144000-b7145000 r--p 00008000 08:01 15206563 /usr/lib/libcr.so.0.5.5
b7145000-b7146000 rw-p 00009000 08:01 15206563 /usr/lib/libcr.so.0.5.5
b7146000-b7147000 rw-p 00000000 00:00 0
b7147000-b72f7000 r-xp 00000000 08:01 10749438 /lib/i386-linux-gnu/libc-2.23.so
b72f7000-b72f9000 r--p 001af000 08:01 10749438 /lib/i386-linux-gnu/libc-2.23.so
b72f9000-b72fa000 rw-p 001b1000 08:01 10749438 /lib/i386-linux-gnu/libc-2.23.so
b72fa000-b72fd000 rw-p 00000000 00:00 0
b72fd000-b746a000 r-xp 00000000 08:01 15204540 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.21
b746a000-b746b000 ---p 0016d000 08:01 15204540 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.21
b746b000-b7470000 r--p 0016d000 08:01 15204540 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.21
b7470000-b7471000 rw-p 00172000 08:01 15204540 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.21
b7471000-b7474000 rw-p 00000000 00:00 0
b7474000-b76f3000 r-xp 00000000 08:01 15206608 /usr/lib/i386-linux-gnu/libmpich.so.12.1.0
b76f3000-b76fa000 r--p 0027e000 08:01 15206608 /usr/lib/i386-linux-gnu/libmpich.so.12.1.0
b76fa000-b76fc000 rw-p 00285000 08:01 15206608 /usr/lib/i386-linux-gnu/libmpich.so.12.1.0
b76fc000-b772a000 rw-p 00000000 00:00 0
b7741000-b7744000 rw-p 00000000 00:00 0
b7744000-b7746000 r--p 00000000 00:00 0 [vvar]
b7746000-b7748000 r-xp 00000000 00:00 0 [vdso]
b7748000-b776a000 r-xp 00000000 08:01 10749410 /lib/i386-linux-gnu/ld-2.23.so
b776a000-b776b000 rw-p 00000000 00:00 0
b776b000-b776c000 r--p 00022000 08:01 10749410 /lib/i386-linux-gnu/ld-2.23.so
b776c000-b776d000 rw-p 00023000 08:01 10749410 /lib/i386-linux-gnu/ld-2.23.so
bfa17000-bfa38000 rw-p 00000000 00:00 0 [stack]

================================================================================ ===
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= PID 10253 RUNNING AT studentp-mi-MS-1727
= EXIT CODE: 134
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
================================================================================ ===
YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Aborted (signal 6)
This typically refers to a problem with your application.
Please see the FAQ page for debugging suggestions
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
28.11.2017, 01:22 4
darksector, Ошибки связаны с тем, что память выделенную new[] надо освобождать delete[], а не free.

Запустите этот код, и убедитесь, что проблема не в MPI_Reduce():
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
#include "mpi.h"
#include <iostream>
 
int main(int argc, char *argv[])
{
    int rank, size;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
 
    if (!rank)
        std::cout << size << std::endl;
 
    int *from = new int[size];
    int *to = new int[size];
    for (int i = 0; i < size; i++)
        from[i] = 0;
    from[rank] = 1;
 
    MPI_Reduce(from, to, size, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
 
    if (!rank) {
        for (int i = 0; i < size; i++)
            std::cout << to[i] << " ";
        std::cout << std::endl;
    }
    
    for (int i = 0; i < size; i++) {
        from[i] = 10;
    }
 
    MPI_Reduce(from, to, size, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
 
    if (!rank) {
        for (int i = 0; i < size; i++)
            std::cout << to[i] << " ";
        std::cout << std::endl;
    }
 
    MPI_Finalize();
    delete[] from;
    delete[] to;
}
1
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
28.11.2017, 01:45  [ТС] 5
Цитата Сообщение от avgoor Посмотреть сообщение
darksector, Ошибки связаны с тем, что память выделенную new[] надо освобождать delete[], а не free.
Да, есть такое, но сути не меняет.

Цитата Сообщение от avgoor Посмотреть сообщение
Запустите этот код, и убедитесь, что проблема не в MPI_Reduce():
Я знаю, это я и написал чуть выше.

Я не понимаю, почему у меня в result массиве первые два числа получаются отрицательными. Если "поспамить", то можно заметить, что эти числа не статичные...

Добавлено через 11 минут
Причем проблема уходит если length (длина квадратной матрицы) > 5
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
28.11.2017, 01:51 6
Цитата Сообщение от darksector Посмотреть сообщение
Я не понимаю, почему у меня в result
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
Цитата Сообщение от avgoor Посмотреть сообщение
1) Память выделяется в строках 114-118, а length бродкстится только в 126 строке. Перенесите 126 строку до 114.
Да, это косяк который я не заметил, спасибо.

Цитата Сообщение от avgoor Посмотреть сообщение
2) Собственно в этих же строках tmp_a не обнуляется там мусор.
А вот тут не верно, т.к. в 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]
Добавлено через 32 секунды
Цитата Сообщение от avgoor Посмотреть сообщение
Ну и замените free(matrix) на delete[] matrix.
Да, добавил. Спасибо. Теперь на MPI_Finalize не ругается.
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
28.11.2017, 02:06 8
Цитата Сообщение от darksector Посмотреть сообщение
в tmp_a всех процессов как на нулевые матрицы от MatrixInit_Zero изменяются конкретные значения
Во всех ли? (см. стр 134) + там еще и утечка памяти.
0
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
28.11.2017, 02:09  [ТС] 9
Цитата Сообщение от avgoor Посмотреть сообщение
Во всех ли? (см. стр 134) + там еще и утечка памяти.
Ну, 0-ой процесс я использую только для ввода и вывода.
Хм... не вижу утечки...
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
28.11.2017, 02:22 10
Цитата Сообщение от darksector Посмотреть сообщение
Хм... не вижу утечки...
Рассмотрим 2й блок.
В 116 строке tmp_a=new int[...
В 136 строке tmp_a=Matrix... Внутри которой result=MatrixInitZero внутри которой matrix = new...
После возврата из умножения в tmp_a будет адрес памяти, выделенной в InitZero. Предыдущая память, выделенная в 116 строке потеряется...

Об этом много написано. Просто запомните, что если вы управляете памятью, вы всегда должны понимать, кто ей владеет. Самый простой подход: где выделили - там и удаляем. Выделяйте память только в main в функции передавайте указатель. У вас, например, перегружена функция InitRand. Одна выделяет, другая не выделяет - там черт ногу сломит. Вы сами запутались где и что выделяется.

Цитата Сообщение от darksector Посмотреть сообщение
Ну, 0-ой процесс я использую только для ввода и вывода.
Но tmp_a то из него суммируется с остальными и при этом не обнуляется.
1
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
28.11.2017, 02:29  [ТС] 11
Цитата Сообщение от avgoor Посмотреть сообщение
Об этом много написано. Просто запомните, что если вы управляете памятью, вы всегда должны понимать, кто ей владеет. Самый простой подход: где выделили - там и удаляем. Выделяйте память только в main в функции передавайте указатель. У вас, например, перегружена функция InitRand. Одна выделяет, другая не выделяет - там черт ногу сломит. Вы сами запутались где и что выделяется.
А... это. Просто понятия не имею, каким образом реализован этот MPI, многое остается за кадром и загадками. Не думал, что он так сильно привязан к определенным адресам.

Так или иначе все это пишется для больших матриц, а матрицы размера меньше 6*6 (т.е. с 5), где и появляется баги... Да и бог с ним. Смысла от многопоточности нету.

Спасибо за помощь.
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
28.11.2017, 02:32 12
Цитата Сообщение от darksector Посмотреть сообщение
А... это. Просто понятия не имею, каким образом реализован этот MPI
При чем тут MPI?
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2017, 15:46
Помогаю со студенческими работами здесь

Сложение массивов
#include &lt;iostream&gt; using namespace std; int Sum (char n1, int l1, char n2, int l2) { int...

Сложение и присвоение массивов
Помогите пожалуйста! Ввод-два массива одной длинны.Необходимо их поэлементно сложить и записать в...

Сложение двух массивов.
Что то я не как не пойму если я пишу вот такой код #include &quot;stdafx.h&quot; #include &quot;conio.h&quot; ...

Сложение двух массивов
Вот условие задачи: Your friend is the person who does not like any limitations in the life. And...


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

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