Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 423
#1

[MPI] Пользовательский тип данных и его передача - C++

17.05.2013, 16:41. Просмотров 454. Ответов 0

Добрый день, форумчане!
Сразу по существу: есть матрица matrix[N][N], я описываю 3 типа данных для:
1) Элементов над главной диагональю
2) Элементов под главной диагональю
3) Элементов главной диагонали

Но никак не могу понять, как теперь равномерно разослать это все через MPI_Scatter и принять в остальных процессах...

Вот привожу то, что у меня уже есть:
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
using namespace std;
#include <stdlib.h>
#include <Windows.h>
#include <stdio.h>
#include <time.h>
#include "mpi.h"
#include <vector>
 
#define PMAX 8    
#define N 5
 
//В квадратной матрице NxN определить, на сколько отличается сумма элементов,
//расположенных ниже главной диагонали от суммы элементов, расположенных
//выше главной диагонали. Все элементы подматрицы с меньшей суммой увеличить
//на её половину, с большей – уменьшить на такое же значение, а элементы главной
//диагонали расположить в обратном порядке.
 
void print_vector(int v[], int size, string name)
{
    printf("%s:\n",name.c_str());
    for(int i=0;i<size;i++)
        printf("%d  ",v[i]);
    printf("\n");
}
 
int main(int argc, char* argv[])
{
    //-----------------------------------
        int Psc = 0, ID = 0;
        int tag = 42;
        int sc = 0;
    //-----------------------------------
    srand(time(NULL));
 
    MPI_Init(&argc, &argv);                
    MPI_Comm_size(MPI_COMM_WORLD, &Psc);    
    MPI_Comm_rank(MPI_COMM_WORLD, &ID);    
    
    if(Psc < 2 || Psc > PMAX)
    {
        if (ID == 0)
        {
            printf("|-------------------------------------------------------------|\n");
            printf("|Minimums 2 process, maximum %d processes...\n", PMAX);
            printf("|-------------------------------------------------------------|\n");
        }
        MPI_Finalize();
        exit(0);
    }
    
    //-----------------------------------
        int matrix[N][N];
        int offset=0;
    //-----------------------------------
 
    MPI_Datatype Part_ur;
    MPI_Datatype Part_bl;
    MPI_Datatype Diag;
 
    int blocklen1[N], blocklen2[N], blocklen3[N], indexes1[N], indexes2[N], indexes3[N];
 
    for(int i=0;i<N;i++)
    {
        offset = i*N;
        blocklen3[i]=1;
        indexes3[i]=offset+i;
        blocklen1[i]=N-i-1;
        blocklen2[i]=i;
        indexes1[i]=i==N-1?0:offset+i+1;
        indexes2[i]=offset;
        for(int j=0;j<N;j++)
        {
            matrix[i][j] = rand()%20+1;
        }
    }
 
    MPI_Type_indexed(N,blocklen1,indexes1,MPI_INT,&Part_ur);
    MPI_Type_indexed(N,blocklen2,indexes2,MPI_INT,&Part_bl);
    MPI_Type_indexed(N,blocklen3,indexes3,MPI_INT,&Diag);
    int Type_ur = MPI_Type_commit(&Part_ur);
    int Type_bl = MPI_Type_commit(&Part_bl);
    int Type_Diag = MPI_Type_commit(&Diag);
 
    if(ID == 0)
    {    
        if(sc == 0)
        {
            printf("________________________________________________________________________________\n");
            printf("Input:\n");
            printf("Matrix:");
            for(int i=0;i<N;i++)
            {
                printf("\n");
                for(int j=0;j<N;j++)
                {
                    printf("%2d  ",matrix[i][j]);
                }
            }
            printf("\n________________________________________________________________________________\n");
            sc++;
        }
 
        //------>MPI_Scatter(
 
    }
    
    else
    {       
        //тут принять и вывести
    }
    
    MPI_Type_free(&Part_ur);
    MPI_Type_free(&Part_bl);
    MPI_Type_free(&Diag);
    MPI_Finalize();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2013, 16:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос [MPI] Пользовательский тип данных и его передача (C++):

Пользовательский тип данных для C - C++
Помогите пожалуйста создать пользовательский тип данных для языка C, так как мне не хватает обычных....

Шаблон класса. Пользовательский тип данных - C++
Всем привет. Помогите с кодом. Не получается сделать пользовательский тип данных. Создаю объект в главной функции, но выдаёт ошибку если...

ostream_iterator, copy и пользовательский тип данных - C++
Здравствуйте. #include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;string&gt; #include&lt;sstream&gt; #include&lt;set&gt; #include&lt;vector&gt; ...

Наследование - не могу определить пользовательский тип данных - C++
Доброго вечера! Я запутался с наследованием. Определил класс Dlina, состоящий из метров и сантиметров, в котором перегрузил операцию...

STL контейнер stack, содержит пользовательский тип данных - C++
Ошибки при компиляции следующего кода: Файл element.h #ifndef ELEMENT_H #define ELEMENT_H #include &lt;iostream&gt; using namespace...

Разработать класс, обьект которого реализует "пользовательский" тип данных - C++
Помогите сдать экзамен, не было времени подготовится) могу даже оплатить работу если угодно. Задача Разработать класс, обьект...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2013, 16:41
Привет! Вот еще темы с ответами:

Указатель на пользовательский тип - C++
Чёто туплю, почему когда передаёшь переменную (например int) параметром через адрес в функцию (параметр - указатель на этот тип), то в теле...

Найти факториал, используя пользовательский тип - C++
Найти факториал n!=1*2*3...*n решить через классы,

Передача в MPI vector<char*> - C++
Пишу программу на MPI. И возникли сложности. Имеется массив слов и его нужно передать между процессами. Сначала у меня был vector&lt;string&gt;,...

Определить пользовательский тип (структуру), включающий в себя строку, целое число - C++
Продолжение: указатель на байт, указатель на число с плавающей точкой. Определить динамический массив из N полученных структур. Как это...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.