Форум программистов, компьютерный форум, киберфорум
MPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 28.11.2015
Сообщений: 79
1

MPI-декартова топология

24.11.2016, 00:08. Показов 1943. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте,не могу понять как сделать.
Мое задание: Число процессов K является четным: K=2*n, n>1; в каждом процессе дано вещественное число А. Определить для всех процессов декартову топологию в виде матрицы размером 2хn (порядок нумерации процессов оставить прежним) и для каждой строки матрицы осуществить циклический сдвиг исходных данных с шагом 1(число A из каждого процесса,кроме последнего в строке, пересылается в следующий процесс этой же строки, а из последнего процесса - в главный процесс этой строки). Для определения рангов посылающих и принимающих процессов использовать функцию MPI_Cart_shift, пересылку выполнять с помощью функции MPI_Sendrecv. Во всех процессах вывести полученные данные.

Я реализовал программу,но у меня она заточена под матрицу nx2,а мне нужно,чтобы было 2хn.
По этому у меня и не правильно выдает результат. Не могу понять как мне переделать по нужную мне матрицу...

A-отправить вещественное число.
B-принять число.
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
#define _CRT_SECURE_NO_WARNINGS
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
 
 
int main(int argc, char** argv)
{
    int  rank, size, n, m, ndims = 2, dim_size[2], periods[2], new_rank, coord2D[2], source, dest1, i, j;
    double A, B;
    MPI_Comm old_comm = MPI_COMM_WORLD, new_comm, comm_coll;
MPI_Status status;
    MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    n = size / 2;
    A = rand() % 500+rank;
    //B = rand() % 500;
    dim_size[0] = 2;
    dim_size[1] = n;
    periods[0] = 1;
    periods[1] = 0;
    MPI_Cart_create(old_comm, ndims, dim_size, periods, 0, &new_comm);
    MPI_Comm_rank(new_comm, &rank);
    MPI_Cart_coords(new_comm, rank, ndims, coord2D);
    printf("Rank %i coordinates are %i %i \n", rank, coord2D[0], coord2D[1]);
    fflush(stdout);
    int index = 0; //сдвиг вдоль 1 - го индекса (-   номер измерения, вдоль которого выполняется сдвиг;)
    int displ = 1; //сдвиг на 1 (величина сдвига (может быть как положительной, так и отрицательной).
                   //source -   номер процесса, от которого должны быть получены данные;
                   //dest - номер процесса, которому должны быть посланы данные.
    MPI_Cart_shift(new_comm, index, displ, &source, &dest1);
    MPI_Sendrecv(&A,1, MPI_DOUBLE,dest1,123,&B,1, MPI_DOUBLE,source,123,new_comm,&status);
printf("rank = %i,  A=%f,B=%f  \n", rank,A,B);
    MPI_Finalize();
    return 0;
}
Скрин как сейчас работает программа,где n у меня считает как столбци...
Миниатюры
MPI-декартова топология  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.11.2016, 00:08
Ответы с готовыми решениями:

Декартова система координат
Координаты точки целые числа X и Y, причем X&gt; 0 и Y&gt; 0. Вывести в первой строке координаты точки...

Оператор декартова произведения
Определить операторы «ravno» и «&gt;&lt;» и реализовать отношение: L ravno X&gt;&lt;Y ( ), где X,Y –...

Декартова система координат
Определить,попадает ли точка с координатами (х,у) в заштрихованную область.

декартова система координат
В декартовой системе координат задан отрезок и набор точек. Найдите расстояния от точек до отрезка...

1
1241 / 960 / 379
Регистрация: 02.09.2012
Сообщений: 2,936
24.11.2016, 15:41 2
У вас
1. перепутан период ("закольцовано" должно быть измерение 1, а не 0)
2. неправильно определили сдвиг, опять же надо по измерению 1
3. много лишних переменных, которые не по делу.
причесал, пользуйтесь!
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
#define _CRT_SECURE_NO_WARNINGS
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
 
int main(int argc, char** argv) {
    MPI_Init(&argc, &argv);
 
    int rank, size;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
 
    int n  = size / 2;
    double A = rand() % 500 + (double)rank;
    double B;
 
    const int ndims = 2;
    int dim_size[ndims], periods[ndims];
    dim_size[0] = 2; dim_size[1] = n;
    periods[0] = 0; periods[1] = 1; 
    
    MPI_Comm COMM_CART;
    MPI_Cart_create(MPI_COMM_WORLD, ndims, dim_size, periods, 0, &COMM_CART);
 
    int rank_from, rank_to;
    MPI_Cart_shift(COMM_CART, 1, 1, &rank_from, &rank_to);
 
    int coord2D[ndims];
    MPI_Cart_coords(COMM_CART, rank, ndims, coord2D);
    printf("Rank %i with coordinates (%i, %i) having A = %f receives from Rank %i, and sends to Rank %i\n", rank, coord2D[0], coord2D[1], A, rank_from, rank_to);
    fflush(stdout);
 
    MPI_Status status;
    MPI_Sendrecv(&A, 1, MPI_DOUBLE, rank_to, 123,
                 &B, 1, MPI_DOUBLE, rank_from, 123, COMM_CART, &status);
                 
    printf("Rank = %i,  A=%f, B=%f  \n", rank, A, B);
    fflush(stdout);
 
    MPI_Comm_free(&COMM_CART);
    MPI_Finalize();
    return 0;
}
0
24.11.2016, 15:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2016, 15:41
Помогаю со студенческими работами здесь

Декартова система координат на Delphi
C помощью Image и RadioGroup сделать вывод , в зависимости от выбранного в списке RadioGroup ,...

Полярная и декартова система координат
Прошу помочь с заданием ниже. Вообще не представляю – что тут нужно делать и тем более как. ...

Способы задания декартова произведения
Доброго времени суток. Мне необходимо представить декартово произведение двух множеств А={4,7}...

Задание на применение декартова произведения
Имеются три таблицы в базе данных(в спойлере диаграмма)....


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

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