#include #include #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; }