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

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

Восстановить пароль Регистрация
 
Iworb
анимешник++
 Аватар для Iworb
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 411
17.05.2013, 16:41     [MPI] Пользовательский тип данных и его передача #1
Добрый день, форумчане!
Сразу по существу: есть матрица 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2013, 16:41     [MPI] Пользовательский тип данных и его передача
Посмотрите здесь:

C++ Пользовательский тип данных для C
C++ Перечисляемый тип данных.Символьный тип.
C++ ostream_iterator, copy и пользовательский тип данных
MPI. Ошибка в выводимых данных. (Код присутствует) C++
C++ clrscr(); не определен данный тип и const MAX_ELEMENTS = 4; отсутсвует тип int когда я его туда вписываю у меня больше ошибок вылазит
STL контейнер stack, содержит пользовательский тип данных C++
Передача указателя на массив тип complex в функцию C++
Определить пользовательский тип (структуру), включающий в себя строку, целое число C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему

Метки
mpi, mpi_scatter, mpi_type_indexed
Опции темы

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