/
MPI_Bin_comparator2.c
132 lines (99 loc) · 3.08 KB
/
MPI_Bin_comparator2.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
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#define MAX_NUM 1000 // запускать на 10 процессах
int *dec_to_bin( int );
int main(int argc, char **argv)
{
int num1, num2, proc_num, proc_rank, comp_result, i;
int buf1[10], buf2[10], buf_result[10];
MPI_Status status;
MPI_Init( &argc, &argv );
MPI_Comm_size( MPI_COMM_WORLD, &proc_num );
MPI_Comm_rank( MPI_COMM_WORLD, &proc_rank );
if( 10 != proc_num ) // проверка на 10 процессов
{
if( 0 == proc_rank ) printf("Wrong number of processes!\n");
MPI_Finalize();
return 0;
}
if( 0 == proc_rank ) // считываем десятичные числа в 0 процессе, они известны только ему
{
scanf("%d%d", &num1, &num2 );
if( num1>1000 ) // ограничения
num1 = MAX_NUM;
if( num2>1000 )
num2 = MAX_NUM;
MPI_Send( &num1, 1, MPI_INT, 1, 0, MPI_COMM_WORLD ); // сделать другой коммуникатор - разослать только им?
MPI_Send( &num2, 1, MPI_INT, 2, 0, MPI_COMM_WORLD ); // посылаем числа процессу 1 и 2
}
if( 1 == proc_rank ) // перевод в бинарный вид в этих процессах
{
MPI_Recv( &num1, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status );
for( i=0;i<10;i++)
buf1[i] = *( dec_to_bin( num1 ) + i );
printf("The first number is: ");
for( i=0;i<10;i++)
printf("%d ", buf1[i]);
printf("\n");
}
if( 2 == proc_rank)
{
MPI_Recv( &num2, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status );
for(i=0;i<10;i++)
buf2[i] = *( dec_to_bin( num2 ) + 1 );
printf("The second number is: ");
for(i=0;i<10;i++)
printf("%d ", buf2[i] );
printf("\n");
}
MPI_Bcast( buf1, 10, MPI_INT, 1, MPI_COMM_WORLD ); // теперь бинарный вид у всех
MPI_Bcast( buf2, 10, MPI_INT, 2, MPI_COMM_WORLD );
comp_result = ( buf1[proc_rank] == buf2[proc_rank] ) ? 0 : 1; // каждый процесс пар-но сравнивает разряд
MPI_Barrier( MPI_COMM_WORLD );
MPI_Gather( &comp_result, 1, MPI_INT, buf_result, 1, MPI_INT, 0, MPI_COMM_WORLD ); // рез-т сравнения на 0 процессе
if ( 0 == proc_rank )
{
for(i=0;i<10;i++)
printf("%d ", buf_result[i] );
i = 0;
int flag = 1;
while( 0 == buf_result[i] ) // По порядку анализируем разряды чисел - равны или не равны
{
i++;
if( 10 == i)
{
printf("Numbers are equal!\n");
flag = 0;
}
}
if(flag)
{
if( buf1[i] > buf2[i] )
printf("\nFirst number is bigger!\n");
else printf("\nSecond number is bigger!\n");
}
}
MPI_Finalize();
return 0;
}
int* dec_to_bin( int num)
{
int i = 0, buf[10];
while( num != 1 )
{
buf[i] = num%2;
num /= 2;
i++;
}
buf[i] = 1;
i++;
while( i <= 9)
{
buf[i] = 0;
i++;
}
for( i=0; i<10; i++ )
buf[i] = buf[9-i];
return buf;
}