У меня есть программа, которая должна выполнить следующее: прочитать размер массива, прочитать каждый элемент массива, а затем число, которое я хочу найти в этом массиве.Программа должна разделить поиск для каждого процесса.У меня проблема в том, что я не знаю, как заставить все подчиненные процессы ждать, пока мастер завершит процесс чтения.Вот что у меня так далеко:
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <cstdlib>
#include "mpi.h"
using namespace std;
void searchForElementInArray(int left, int right, int myArray[], int number);
void readArrayAndNumber(int myArray[], int &arraySize, int &number);
int main(int argc, char *argv[])
{
int LIMIT = 100;
int numberOfProcesses;
int processRank;
int error;
int length;
int myArray[1010];
int arraySize;
int number;
error = MPI_Init(&argc, &argv);
if (error != MPI_SUCCESS) {
cout << "Error starting MPI program. Terminating.\n";
MPI_Abort(MPI_COMM_WORLD, error);
}
// get the number of processes
MPI_Comm_size(MPI_COMM_WORLD, &numberOfProcesses);
MPI_Bcast(&arraySize, 1, MPI_INT, 0, MPI_COMM_WORLD);
// Length of each interval
length = arraySize / numberOfProcesses;
//get the process rank
MPI_Comm_rank(MPI_COMM_WORLD, &processRank);
if (!processRank) { // Master
readArrayAndNumber(myArray, arraySize, number);
MPI_Send(&myArray, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
MPI_Send(&arraySize, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
MPI_Send(&number, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
}
else { // Slave
if (processRank != numberOfProcesses - 1) {
MPI_Recv(&myArray, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Recv(&arraySize, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Recv(&number, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
searchForElementInArray(length * processRank, length * processRank + length, myArray, 66);
MPI_Barrier(MPI_COMM_WORLD);
}
else {
MPI_Recv(&myArray, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Recv(&arraySize, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Recv(&number, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
searchForElementInArray(length * processRank, arraySize, myArray, 66);
MPI_Barrier(MPI_COMM_WORLD);
}
}
MPI_Finalize();
_getch();
return 0;
}
void searchForElementInArray(int left, int right, int myArray[], int number) {
int flag = 0;
cout << "Searched positions: ";
for (int i = left; i < right; i++) {
cout << i << " ";
if (myArray[i] == number) {
cout << endl << "Found on position " << i;
flag = 1;
break;
}
}
if (flag == 0) {
cout << endl << "Not found";
}
int processRank;
MPI_Comm_rank(MPI_COMM_WORLD, &processRank);
cout << " by Process: " << processRank << endl << endl;
}
void readArrayAndNumber(int myArray[], int &arraySize, int &number) {
cin >> arraySize;
for (int i = 0; i < arraySize; i++) {
cin >> myArray[i];
}
cin >> number;
}