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

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

Войти
Регистрация
Восстановить пароль
 
maksimkalon
8 / 7 / 2
Регистрация: 03.03.2013
Сообщений: 71
#1

Создание нового типа MPI - C++

04.05.2014, 14:11. Просмотров 294. Ответов 1
Метки нет (Все метки)

Задача следующая: в каждом процессе дано три числа(одно вещественное, два целых), используя произвольный тип, переслать числа из подчиненных в главный и в главном вывести. Делаю так:
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
    int flag;
    MPI_Initialized(&flag);
    if (flag == 0)
        return;
    int rank, size;
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    
    typedef struct {
        double a;
        int b,c;
    } doubleint2;
    doubleint2 sbuf,rbuf[10];
    MPI_Datatype newtype;
    int blockers[4]={1,1,1,1};
    MPI_Aint displs[4]={offsetof(doubleint2,a),offsetof(doubleint2,b),offsetof(doubleint2,c),sizeof(doubleint2)};
    MPI_Datatype oldtypes[4]={MPI_DOUBLE,MPI_INT,MPI_INT,MPI_UB};
    
    MPI_Type_struct(4,blockers,displs,oldtypes,&newtype);
    MPI_Type_commit(&newtype);
 
    if(rank>0)
    {
        *Ввод sbuf.a, sbuf.b, sbuf.c*
        MPI_Gather(&sbuf,3,newtype,&rbuf,3,newtype,0,MPI_COMM_WORLD);
    }
    else
    {
        MPI_Gather(&sbuf,3,newtype,&rbuf,3,newtype,0,MPI_COMM_WORLD);
        for(int i=0; i<size-1; i++)
        {
            *Вывод rbuf[i].a, rbuf[i].b, rbuf[i].c*
        }
    }
Запускается через раз, выводит неправильно, иногда возникает ошибка(attach1.png)
Миниатюры
Создание нового типа MPI  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2014, 14:11     Создание нового типа MPI
Посмотрите здесь:

C++ Создание нового файла, который дополняет ранее созданный
Создание нового проекта в Visual Studio C++
C++ Создание нового класса
C++ Создание нового класса
Как грамотно нтерпретировать ввод нового имени типа, введённого typedef C++
Создание нового элемента форма Windows forms C++
C++ Создание нового файла
C++ Создание нового проекта
Создание нового проекта C++ C++
C++ Создание нового потока
C++ Перегрузка оператора + и создание нового объекта на этой основе
Создание нового массива из двух предыдущих C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
maksimkalon
8 / 7 / 2
Регистрация: 03.03.2013
Сообщений: 71
10.05.2014, 15:28  [ТС]     Создание нового типа MPI #2
Проблему решил, не нужно было указывать четвертый параметр в объявлении нового типа и через MPI_Gather отправлять/принимать 1 значение нового типа
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
    int flag;
    MPI_Initialized(&flag);
    if (flag == 0)
        return;
    int rank, size;
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    
    typedef struct {
        double a;
        int b,c;
    } doubleint2;
    doubleint2 sbuf,rbuf[10];
    MPI_Datatype newtype;
    int blockers[3]={1,1,1};
    MPI_Aint displs[3]={offsetof(doubleint2,a),offsetof(doubleint2,b),offsetof(doubleint2,c)};
    MPI_Datatype oldtypes[3]={MPI_DOUBLE,MPI_INT,MPI_INT};
    
    MPI_Type_struct(3,blockers,displs,oldtypes,&newtype);
    MPI_Type_commit(&newtype);
 
    if(rank>0)
    {
        *Ввод a,b,c*
    }
    MPI_Gather(&sbuf,1,newtype,&rbuf,1,newtype,0,MPI_COMM_WORLD);
    if(rank == 0)
    {
        for(int i=1; i<size; i++)
        {
            *Вывод a,b,c*
        }
    }
Yandex
Объявления
10.05.2014, 15:28     Создание нового типа MPI
Ответ Создать тему
Опции темы

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