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

Динамические массивы в MPI - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Параллельное программирование + графика http://www.cyberforum.ru/cpp-beginners/thread1186194.html
Проблема такая: препод сказал написать программу, где будут два квадрата двигаться туда сюда и что бы их прорисовка, движение и т.д. были в одной функции, но выполнялись в разных потоках. пытался...
C++ Класс Rectangle графика Добрый вечер, с графикой в С++ ни разу не работал, поэтому прошу писать как можно понятнее Создал класс Rectangle: #include <iostream> #include <stdlib.h> using namespace std; class Rectangle... http://www.cyberforum.ru/cpp-beginners/thread1186187.html
Запись структуры и чтение из файла в структуру ( как бы лучше ) C++
Подкиньте идею как лучше записать структуру в файл и обратно из файла в структуру У меня есть мысль: даны 4 элемента вводим их в файл (каждый в строку отдельную),а затем считывая построчно...
C++ Программа "Банкомат": выдать произвольную сумму банкнотами разного номинала
Доброго времени суток. Надо сделать методы снятия, пополнения денег с использованием банкнот то бишь в банке есть опред. кол-во банкнот разного номинала(5,10,20,50,100$). При выдаче n-ой суммы денег...
C++ Вставка одного вектора в другой через один без циклов http://www.cyberforum.ru/cpp-beginners/thread1186157.html
Поставили интересную задачу: вставить элементы одного вектора в другой без использования циклов. Рекурсия считается как цикл. Пользоваться можно for_each. Для вставки элементов нужно, как я понял,...
C++ Масштабирование графика функции Здравствуйте. Написал программу, строящую один из трех графиков функции в зависимости от выбора пользователя. Программа работает, графики строятся, но при этом занимают незначительную часть экрана,... подробнее

Показать сообщение отдельно
MatMatRix
1 / 1 / 0
Регистрация: 13.03.2013
Сообщений: 24

Динамические массивы в MPI - C++

23.05.2014, 20:18. Просмотров 678. Ответов 0
Метки (Все метки)

Добрый вечер. Столкнулась с такой странностью, когда делала программу, которая с помощью MPI (а именно через операции коллективного обмена) находит ближайшую точку к каждой из тех, которые надо считать из файла: со статическим массивом она у меня работает, а при работе с динамическим массивом выводит такое сообщение:

"unable to read the cmd header on the pmi context, Error = -1
.
Error posting readv, Удаленный хост принудительно разорвал существующее подключение.(10054)
unable to read the cmd header on the pmi context, Error = -1
.
Error posting readv, Удаленный хост принудительно разорвал существующее подключение.(10054)
unable to read the cmd header on the pmi context, Error = -1
.
Error posting readv, Удаленный хост принудительно разорвал существующее подключение.(10054)

job aborted:
rank: node: exit code[: error message]
0: ADMIN-...: 123
1: ADMIN-...: 3: process 1 exited without calling finalize
2: ADMIN-...: 123
"

Код самой программы:

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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <time.h>
#include <mpi.h>
 
using namespace std;
 
float normal_distance(float x1, float y1, float z1, float x2, float y2, float z2)
{
    return sqrt(pow((x2-x1),2)+pow((y2-y1),2)+pow((z2-z1),2));
}
 
int main(int argc, char **argv)
{
    int N, my_rank, size, k;
    float *xord, *yord, *zord, g;
    double starttime;
    fstream filearray;
 
    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&size);
    MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
 
    if(my_rank == 0)
    {
        starttime = MPI_Wtime();
 
        char p;
 
        N=0;
        filearray.open("C:\\the_text.txt",ios::in);
        if(!filearray.fail())
        {
            while(!filearray.eof())
            {
                filearray.read(&p,1);
                if(p=='\n') N++;
            }
        }
        filearray.close();
        filearray.clear();
 
        N-=1;
 
        xord = new float[N];
        yord = new float[N];
        zord = new float[N];
 
        int t = 0;
        filearray.open("C:\\the_text.txt",ios::in);
        if(!filearray.fail())
        {
            while(!filearray.eof())
            {
                filearray>>xord[t];
                filearray>>yord[t];
                filearray>>zord[t];
                t++;
            }
        }
 
        filearray.close();
    }
    
    MPI_Bcast(&N,1,MPI_INT,0,MPI_COMM_WORLD);
    k=N/size;
    MPI_Bcast(&k,1,MPI_INT,0,MPI_COMM_WORLD);
 
    MPI_Bcast(xord,N,MPI_FLOAT,0,MPI_COMM_WORLD);
    MPI_Bcast(yord,N,MPI_FLOAT,0,MPI_COMM_WORLD);
    MPI_Bcast(zord,N,MPI_FLOAT,0,MPI_COMM_WORLD);
 
    int *num = new int[2*k];
 
    int p=0;
    int m;
    for(int i=my_rank*k;i<(my_rank+1)*k;i++)
        {
            g=200.0;
            m=0;
            for(int j=0;j<N-1;j++)
            {
                if(i!=j)
                {
                    if(g>normal_distance(xord[i],yord[i],zord[i],xord[j],yord[j],zord[j]))
                    {
                        g=normal_distance(xord[i],yord[i],zord[i],xord[j],yord[j],zord[j]);
                        m=j;
                    }
                }
            }
            num[p]=i;
            p++;
            num[p]=m;
            p++;
        }
 
    int *numb = new int[2*k*size];
    MPI_Gather(num,2*k,MPI_INT,numb,2*k,MPI_INT,0,MPI_COMM_WORLD);
 
    if(my_rank == 0)
    {
        int s=0;
        while(s<2*k*size)
        {
            cout<<numb[s]<<" ";
            s++;
            cout<<numb[s]<<endl;
            s++;
        }
        
        if(N%size != 0){
            int m;
            for(int i=0;i<N%size;i++)
            {
                g=200.0;
                m=0;
                for(int j=0;j<N-1;j++)
                {
                    if(i!=j)
                    {
                        if(g>normal_distance(xord[i],yord[i],zord[i],xord[j],yord[j],zord[j]))
                        {
                            g=normal_distance(xord[i],yord[i],zord[i],xord[j],yord[j],zord[j]);
                            m=j;
                        }
                    }
                }
                cout<<i<<" "<<m<<endl;
            }
        }
 
        delete [] xord;
        delete [] yord;
        delete [] zord;
 
        cout<<MPI_Wtime()-starttime<<endl;
    }
 
    delete [] numb;
    delete [] num;
 
    MPI_Finalize();
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru