Форум программистов, компьютерный форум CyberForum.ru

MPI. полный чайник. разбор ошибок - C++

Восстановить пароль Регистрация
 
Маринчик
 Аватар для Маринчик
0 / 0 / 0
Регистрация: 12.10.2012
Сообщений: 123
15.06.2016, 09:48     MPI. полный чайник. разбор ошибок #1
Еще код не дописан, ну запуталась как мне для матрицы правильно MPI_Scatterv передать... а точнее counts как.. у нас были примеры с массивами - мне наглядно их проще разбирать.. а с матрицей на практике - сложнее.. подскажите, как верно, пожалуйста.
само задание звучит так:
C++
1
Дана матрица размером MxN, где M - чётное. Определить максимальную сумму элементов чётных строк.
.. ну мне нужно для начала понять как counts прописать..а дальше разберусь..
больше чем уверена что не правильно делаю, а препода выловить немогу, чтоб разобраться((




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
#include "stdafx.h"
#include "mpi.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
 
int _tmain(int argc, char* argv[])
{  
    int size, rank,i,j, d,x,y; //sizeM,sizeN;
    int lengthM=0, lengthN=0, locallength=0;
    double *A, *localA;;
    int *displs, *counts;
    int localM=0, localN=0;
 
    double sum, localsum;
    double maxsum;
 
    //MPI_Status Status, Status2;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &size);//Определение количества процессов в параллельной программе 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);//определение ранга процесса
 
 
    if (!rank)
    {    //ввод размеров матрицы
        cout<<"N = "; cin>>lengthN;
        cout<<"vvedite chetnoe M = "; cin>>lengthM;
    if (lengthM%2==0)
     {
 
        A=new double[lengthM*lengthN];//динамическая матрица
        for ( i = 0; i < lengthM; i++)  
        for ( j = 0; j < lengthN; j++) 
        {*(A+i*lengthN+j)=rand() % 100;///задаем
        }
 
        for ( i = 0; i < lengthM; i++) // вывод 
        {for ( j = 0; j < lengthN; j++) 
        printf("%7.2f",*(A+i*lengthN+j));
        }
     }
    else {printf("Ne sootvetstvie zadaniyu.Vvedte dannie zanovo"); return 0;}
    }
    //операция рассылки
    
    MPI_Bcast(&(lengthM*lengthN), 1, MPI_INT, 0, MPI_COMM_WORLD);//строки
    MPI_Bcast(&lengthN, 1, MPI_INT, 0, MPI_COMM_WORLD);//столбцы
    //locallength=lengthM/size+ (rank<(lengthM%size));
    localA = new double[localM]; //динамический массив с строками
    displs = new int[size];//[sizeN];
    counts = new int[size];//[sizeN];
 
/// верх - правильно/ теперь нуужно прописать counts
    //int l=lengthM/2;
        for ( i = 0; i < size; i+=2)  
        {for (j = 0; j < size; j++)
          {*(counts+i*size+j) = (lengthM/size + (i<(lengthM%size))*size + lengthN/size);   // кол-во элементов на каждый процесс по строкам??????????????????????
              *(displs+i*size+j)=0;
           for (x=0;x<i;x++)
            for (y=0;y<j;y++)
                *(displs+x*j+y)=*(counts+i*size+j);
          }
 
        if (!rank)
        printf("counts[%d][%d]=%d; displs[%d][%d]=%d\n",i,j,*(counts+i*size+j),x,y,  *(displs+x*j+y));
        }
 
    MPI_Scatterv(A,counts, displs, MPI_FLOAT,localA, localM, MPI_FLOAT,0, MPI_COMM_WORLD);
    MPI_Scatterv(A,counts, displs, MPI_FLOAT,localA, localN, MPI_FLOAT,0, MPI_COMM_WORLD);
Добавлено через 46 минут
Скорее вопрос даже так поставить надо.. когда матрица с размерностью M*N , не квадратная как правильно ее передавать в counts,displs??
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.06.2016, 09:48     MPI. полный чайник. разбор ошибок
Посмотрите здесь:

разбор ошибок C++
C++ Решение системы методом Гаусса и разбор ошибок
C++ чайник
C++ C++ и чайник
Полный разбор JPEG в С++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
AlexVRud
413 / 142 / 36
Регистрация: 04.07.2014
Сообщений: 413
15.06.2016, 10:57     MPI. полный чайник. разбор ошибок #2
Маринчик,
  1. *(A+i*lengthN+j) - кто так учил? Пиши человеческим языком A[i*lengthN+j]
  2. MPI_Bcast(&(lengthM*lengthN), 1, MPI_INT, 0, MPI_COMM_WORLD); - первый параметр должен быть адресом переменной, а не бред какой-то
  3. localA = new double[localM]; - не верный размер. Я так понимаю ты хочешь "нарезать" матрицу A размером N*M на size полос.
    Скорее вопрос даже так поставить надо.. когда матрица с размерностью M*N , не квадратная как правильно ее передавать в counts,displs??
  4. Какая разница, квадратная она или нет. И зачем её передавать в counts,displs
Маринчик
 Аватар для Маринчик
0 / 0 / 0
Регистрация: 12.10.2012
Сообщений: 123
15.06.2016, 11:04  [ТС]     MPI. полный чайник. разбор ошибок #3
Цитата Сообщение от AlexVRud Посмотреть сообщение
Я так понимаю ты хочешь "нарезать" матрицу A размером N*M на size полос.
да...

Цитата Сообщение от AlexVRud Посмотреть сообщение
Какая разница, квадратная она или нет. И зачем её передавать в counts,displs
чтоб counts понималось количество элементов, которое пойдет на каждый процесс далее.. для Scatterv..
AlexVRud
413 / 142 / 36
Регистрация: 04.07.2014
Сообщений: 413
15.06.2016, 11:39     MPI. полный чайник. разбор ошибок #4
Маринчик, для начала переименуй переменные lengthM, lengthN в M и N соответственно. И задай их константами. Будет проще читать код. Разошли M и N используя MPI_Bcast (а то первый его вызов у тебя бред).

После на каждом процессе вычисли локальные localM и localN. И выдели память для матрицы localA размером localM*localN

Далее, для простоты проверяй, что M делится на цело на size. В этом случае можно воспользоваться функцией MPI_Scatter (без v на конце).
counts,displs - удали (их вернешь только когда всё заработает с MPI_Scatter и надо будет сделать вариант для произвольного случая с использованием MPI_Scatterv. Но при этом помни, что counts, displs создаются и заполняются только 0-ым процессом).

Добавлено через 38 секунд
Как всё напишешь код в студию для дальнейших комментариев
Маринчик
 Аватар для Маринчик
0 / 0 / 0
Регистрация: 12.10.2012
Сообщений: 123
15.06.2016, 15:21  [ТС]     MPI. полный чайник. разбор ошибок #5
Цитата Сообщение от AlexVRud Посмотреть сообщение
Как всё напишешь код в студию для дальнейших комментариев
получилось так
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
// lab3.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "mpi.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
 
int _tmain(int argc, char* argv[])
{   int M,N;
int size, rank,i,j;
int lengthM=0, lengthN=0;/*, locallength=0;*/
double *A, *localA;;
/*int *displs, *counts;*/
int localM=0, localN=0;
 
//double sum, localsum;
//double maxsum;
 
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);//Определение количества процессов в параллельной программе 
MPI_Comm_rank(MPI_COMM_WORLD, &rank);//определение ранга процесса
 
 
if (!rank)
{    //ввод размеров матрицы
    cout<<"N = "; cin>>N;
    cout<<"vvedite chetnoe M = "; cin>>M;
    if (M%2==0)
    {
        A=new double[M*N];//динамическая матрица
        for ( i = 0; i < M; i++)  
            for ( j = 0; j < N; j++) 
            {A[i*N+j]=rand() % 100;///задаем
        }
 
        //for ( i = 0; i < M; i++) // вывод 
        //{for ( j = 0; j < N; j++) 
        //printf("%7.2f",A[i*N+j]);
        //printf("\n");
        //}
    }
    else {printf("Ne sootvetstvie zadaniyu.Vvedte dannie zanovo"); return 0;}
}
//операция рассылки
 
MPI_Bcast(&M, 1, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD);
 
localM=M/size;//+ (rank<(M%size));
localN=N/size;//+ (rank<(N%size));
localA = new double[localM*localN]; 
cout<<"Scatter M ="<<localM<<endl;
cout<<"Scatter N ="<<localN<<endl;
 
MPI_Scatter(A,M*N,MPI_DOUBLE,localA,localM*localN,MPI_DOUBLE,0, MPI_COMM_WORLD);
//cout<<"Rank^"<< rank<<endl;
 
for (i=0; i<localM; i++)
    {for (j=0;j<localN; j++)
cout <<A[i*N+j]<<" ";
cout<<endl; 
printf("\n");
}
 
delete[]A;
delete[]localA;
/*delete[]displs;
delete[]counts;*/
MPI_Finalize();
 
system("pause");
return 0;
 
}
константами не стала прописывать. мне нужно чтоб размерность с клавы указывалась у матрицы.

Добавлено через 20 минут
там 62 строчка должна быть
C++
1
cout <<localA[i*N+j]<<" ";
AlexVRud
413 / 142 / 36
Регистрация: 04.07.2014
Сообщений: 413
15.06.2016, 16:51     MPI. полный чайник. разбор ошибок #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
52: localN=N - Делим на полосы, а не квадратиками

MPI_Scatter(A,localM*localN,MPI_DOUBLE,localA,localM*localN,MPI_DOUBLE,0, MPI_COMM_WORLD);
Второй параметр - по сколько отправляем каждому из потоков, а не размер исходного массива. http://rsusu1.rnd.runnet.ru/tutor/method/m2/page11.html

62: cout <<localA[i*localN+j]<<" ";

printf("\n") - никогда не мешай в одну кучу cout и printf.

Теперь в каждом из потоков можно вычислять максимальную сумму элементов в чётных строках матриц localA

Полученные числа обрабатываем через MPI_Reduce с параметром MPI_MAX http://rsusu1.rnd.runnet.ru/tutor/method/m2/page13.html
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2016, 15:25     MPI. полный чайник. разбор ошибок
Еще ссылки по теме:

ООП - задачка, понять и суметь. Разбор ошибок C++
Разбор ошибок C++
C++ очередной разбор ошибок. системы счисления

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

Или воспользуйтесь поиском по форуму:
Маринчик
 Аватар для Маринчик
0 / 0 / 0
Регистрация: 12.10.2012
Сообщений: 123
16.06.2016, 15:25  [ТС]     MPI. полный чайник. разбор ошибок #7
Цитата Сообщение от AlexVRud Посмотреть сообщение
Теперь в каждом из потоков можно вычислять максимальную сумму элементов в чётных строках матриц
благодаря вашей помощи, получается вот так
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
// lab3!.cpp: определяет точку входа для консольного приложения.
 
#include "stdafx.h"
#include "mpi.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
 
int _tmain(int argc, char* argv[])
{   int M,N;
int size, rank,i,j;
int lengthM=0, lengthN=0;/*, locallength=0;*/
double *A, *localA;;
/*int *displs, *counts;*/
int localM=0, localN=0;
 
double sum, localsum;
double maxsum;
 
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);//Определение количества процессов в параллельной программе 
MPI_Comm_rank(MPI_COMM_WORLD, &rank);//определение ранга процесса
 
 
if (!rank)
{    //ввод размеров матрицы
    cout<<"N = "; cin>>N;
    cout<<"vvedite chetnoe M = "; cin>>M;
    if (M%2==0)
    {
        A=new double[M*N];//динамическая матрица
        for ( i = 0; i < M; i++)  
         for ( j = 0; j < N; j++) 
          {A[i*N+j]=rand() % 100;///задаем
          }
 
        for ( i = 0; i < M; i++) // вывод 
        {for ( j = 0; j < N; j++) 
         printf("%7.2f",A[i*N+j]);
         printf("\n");
        }
    }
    else {printf("Ne sootvetstvie zadaniyu.Vvedte dannie zanovo"); return 0;}
}
//операция рассылки
 
MPI_Bcast(&M, 1, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD);
 
localM=M/size;//+ (rank<(M%size));
localN=N;//Делим на полосы, а не квадратиками
localA = new double[localM*localN]; 
 
MPI_Scatter(A,localM*localN,MPI_DOUBLE,localA,localM*localN,MPI_DOUBLE,0, MPI_COMM_WORLD);
 
for (i=0; i<localM; i++)
 {for (j=0;j<localN; j++)
  cout <<localA[i*localN+j]<<" ";
  cout <<"\n "<<endl; 
 }
 
 for (i=0; i<localM; i+=2)//показываем на четность строк.. 0, 2, 4 ...
   {sum=0;
   { for (j=0;j<localN; j++)
     {// if (i%2==0)
      sum+=localA[i*localN+j];// сумма элементов четных строк 
   } }
 }   maxsum=sum;
   
 
MPI_Reduce (&maxsum,&localsum, 1, MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD);//редукция
        if (!rank)
            printf("\n Maksimalnaya summa elementov chetnih  strok: %7.2f \n",localsum);
 
delete[]A;
delete[]localA;
/*delete[]displs;
delete[]counts;*/
MPI_Finalize();
 
system("pause");
return 0;
 
}
только вот не пойму,или мне уже кажется или и правда почему-то у меня по четным строкам не всегда максимальное из сумм вытягивает, если вручную просматривать..

Добавлено через 14 часов 51 минуту
А для Scatterv -как должно быть?? что не правильно делаю??

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
// lab3!.cpp: определяет точку входа для консольного приложения.
 
#include "stdafx.h"
#include "mpi.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
 
int _tmain(int argc, char* argv[])
{   int M,N;
int size, rank,i,j,x,y;
int lengthM=0, lengthN=0;/*, locallength=0;*/
double *A, *localA;;
int *displs, *counts;
int localM=0, localN=0;
 
double sum, localsum;
double maxsum;
 
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);//Определение количества процессов в параллельной программе 
MPI_Comm_rank(MPI_COMM_WORLD, &rank);//определение ранга процесса
 
 
if (!rank)
{    //ввод размеров матрицы
    cout<<"N = "; cin>>N;
    cout<<"vvedite chetnoe M = "; cin>>M;
    if (M%2==0)
    {
        A=new double[M*N];//динамическая матрица
        for ( i = 0; i < M; i++)  
         for ( j = 0; j < N; j++) 
          {A[i*N+j]=rand() % 100;///задаем
          }
 
        for ( i = 0; i < M; i++) // вывод 
        {for ( j = 0; j < N; j++) 
         printf("%7.2f",A[i*N+j]);
         printf("\n");
        }
    }
    else {printf("Ne sootvetstvie zadaniyu.Vvedte dannie zanovo"); return 0;}
}
//операция рассылки
 
MPI_Bcast(&M, 1, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD);
 
localM=M/size;//+ (rank<(M%size));
localN=N;//Делим на полосы, а не квадратиками
localA = new double[localM*localN]; 
counts= new int[size];
displs = new int [size];
//MPI_Scatter(A,localM*localN,MPI_DOUBLE,localA,localM*localN,MPI_DOUBLE,0, MPI_COMM_WORLD);
 
 
 
for (i=0; i<localM; i++)
 {for (j=0;j<localN; j++)
  cout <<localA[i*localN+j]<<" ";
  cout <<"\n "<<endl; 
 }
for (i=0; i<size; i++)
 for (j=0;j<size; j++)
   counts[i*size+j]=M/size+(i<(1%M/size));
{
   for (x=0; x<i; x++)
     for (y=0;y<j; y++)
      displs[x*j+y]=i/size+(x<(1%i/size));
}
MPI_Scatterv(A, counts, displs, MPI_DOUBLE, localA, localM*localN, MPI_DOUBLE, 0, MPI_COMM_WORLD);
 
 
 
for (i=0; i<localM; i+=2)//показываем на четность строк.. 0, 2, 4 ...
   {sum=0;
   { for (j=0;j<localN; j++)
     {// if (i%2==0)
      sum+=localA[i*localN+j];// сумма элементов четных строк 
   } }
 }   maxsum=sum;
   
 
MPI_Reduce (&maxsum,&localsum, 1, MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD);//редукция
        if (!rank)
            printf("\n Maksimalnaya summa elementov chetnih  strok: %7.2f \n",localsum);
 
delete[]A;
delete[]localA;
delete[]displs;
delete[]counts;
MPI_Finalize();
 
system("pause");
return 0;
 
}
Yandex
Объявления
16.06.2016, 15:25     MPI. полный чайник. разбор ошибок
Ответ Создать тему
Опции темы

Текущее время: 05:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru