#include <stdio.h>
#include <mpi.h>
#define SIZE 40
int main(int argc, char** argv)
{
int size, rank;
MPI_Status stat;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
if (size > 5 || size < 2) {
if (rank == 0)
printf("Невозможно выполнить рассчёт с такой конфигурацией.\n");
MPI_Finalize();
return 0;
}
int arr[16][4] = {
{0,0,0,0}, {0,0,0,1}, {0,0,1,0}, {0,0,1,1},
{0,1,0,0}, {0,1,0,1}, {0,1,1,0}, {0,1,1,1},
{1,0,0,0}, {1,0,0,1}, {1,0,1,0}, {1,0,1,1},
{1,1,0,0}, {1,1,0,1}, {1,1,1,0}, {1,1,1,1}
};
int range[size][2];
int wts[] = {29, 10, 20, 15};
int calories[] = {64, 20, 31, 24};
if (rank == 0) {
int n_size = size - 1;
int mod = (SIZE + 1) % n_size;
int step;
if (n_size == 1)
step = SIZE / n_size;
else
step = SIZE / n_size - 1;
range[0][0] = 0;
range[0][1] = 0;
range[1][0] = 0;
if (mod > 0) {
range[1][1] = step + 1;
mod--;
}
else
range[1][1] = step;
for (int i = 1; i < size - 1; i++)
{
range[i + 1][0] = range[i][1] + 1;
if (mod > 0) {
range[i + 1][1] = range[i + 1][0] + step + 1;
mod--;
}
else
range[i + 1][1] = range[i + 1][0] + step;
}
}
MPI_Bcast(&range, size * 2, MPI_INT, 0, MPI_COMM_WORLD);
printf("rank: %d b: %d e: %d\n", rank, range[rank][0], range[rank][1]);
MPI_Barrier(MPI_COMM_WORLD);
int r_size = range[rank][1] - range[rank][0];
unsigned short chosen[r_size];
unsigned int result[r_size];
int max;
if (rank != 0) {
int m = 0;
for (int i = range[rank][0]; i < range[rank][1]; i++) {
int sum = 0;
for (int j = 0; j < 4; j++) {
if (arr[i][j] == 1)
sum += wts[j];
}
if (sum > SIZE || sum == 0)
chosen[m++] = 0;
else
chosen[m++] = 1;
}
int k = 0;
m = 0;
for (int i = range[rank][0]; i < range[rank][1]; i++) {
int sum = 0;
if (chosen[m++] == 1) {
for (int j = 0; j < 4; j++) {
if (arr[i][j] == 1)
sum += calories[j];
}
result[k++] = sum;
}
else {
result[k++] = 0;
}
}
max = result[0];
for (int i = 0; i < r_size; i++) {
if (max < result[i])
max = result[i];
}
printf("Rank: %d size: %d\n", rank, max);
}
if (rank != 0) {
MPI_Send(&max, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
}
else {
int get_result[size - 1];
for (int i = 1; i < size; i++) {
int temp;
MPI_Recv(&temp, 1, MPI_INT, i, MPI_ANY_TAG, MPI_COMM_WORLD, &stat);
get_result[i - 1] = temp;
}
int maximum = get_result[0];
for (int i = 0; i < size - 1; i++) {
if (maximum < get_result[i])
maximum = get_result[i];
}
printf("Result %d\n", maximum);
}
MPI_Finalize();
return 0;
}