Здравствуйте, уважаемые форумчане!
Задание:
При получении стоп-сигнала 0м процессом - останавливать программу.
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
| #include <stdio.h>
#include <mpi.h>
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
srand(4541);
int root = 0;
int ProcNum, ProcRank, RecvRank;
MPI_Status Status;
MPI_Init(&argc, &argv);// MPI_Init — обязательна для вызова, так как выполняет инициализацию библиотеки MPI.
double t1, t2, dt;
MPI_Comm_size(MPI_COMM_WORLD, &ProcNum); // количество процессов в коммуникаторе
MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank); //MPI_Comm_rank — возвращает идентификатор(номер, ранг) процесса в рамках заданного коммуникатора.
int data = NULL;
bool run = true;
while (run) {
for (int i = 1; i < ProcNum; i++) {
t1 = MPI_Wtime();
MPI_Barrier(MPI_COMM_WORLD);
if (ProcRank != 0) {
data = rand() % 500 + (-250);
cout << endl << "Process " << ProcRank << " Generated: " << data << endl;
if (data == -1) {
cout << "Generated stop signal_______________________________________: " << data << endl;
}
}
MPI_Bcast(&data, 1, MPI_INT, ProcRank, MPI_COMM_WORLD);
cout << "Proc: " << ProcRank << " Recieved data: " << data << endl;
t2 = MPI_Wtime();
cout << "Process 0 is running";
if (data == -1) {
run = false;
break;
}
}
}
cout << "Time for one iteration b_cast in " << ProcRank << " process: " << t2 - t1;
MPI_Barrier(MPI_COMM_WORLD);
MPI_Finalize();
return 0;
} |
|
Вопрос:
Почему нулевой процесс ничег оне получает?
Как я понял, он не получает -1, из-за этого программа не завершается корректно.
Но если отправитель сигнала - 0й процесс, то всё идёт отлично и без флажков:
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
| #include <stdio.h>
#include <mpi.h>
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
srand(4541);
int root = 0;
int ProcNum, ProcRank, RecvRank;
MPI_Status Status;
MPI_Init(&argc, &argv);// MPI_Init — обязательна для вызова, так как выполняет инициализацию библиотеки MPI.
double t1, t2, dt;
MPI_Comm_size(MPI_COMM_WORLD, &ProcNum); // количество процессов в коммуникаторе
MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank); //MPI_Comm_rank — возвращает идентификатор(номер, ранг) процесса в рамках заданного коммуникатора.
int data = NULL;
while (true) {
t1 = MPI_Wtime();
if (ProcRank == 0) {
data = rand() % 500 + (-250);
if (data == -1) {
cout << "Generated stop signal_______________________________________: " << data << endl;
}
}
MPI_Bcast(&data, 1, MPI_INT, root, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
t2 = MPI_Wtime();
cout << "Proc: " << ProcRank << " Recieved data: " << data << endl;
if (data == -1)
break;
}
cout << "Time for one iteration b_cast in "<<ProcRank<<" process: " << t2 - t1;
MPI_Barrier(MPI_COMM_WORLD);
MPI_Finalize();
return 0;
} |
|
Как принимать управляющие сигналы от побочных процессов и завершить все при получении сигнала -1 нулевым процессом?