Я пытаюсь распараллелить с MPI «проблему поиска», когда вы перебираете несколько элементов и проверяете, проверяют ли они определенное свойство, если оно выполняется (несколько из них могут проверить свойство, но вам нужен только один)Вы возвращаете это и все готово.Параллелизируя код, я разделяю элементы между процессами, но, когда один находит элемент, я хочу, чтобы другие процессы прекратили поиск, поэтому время не теряется.
Я пытался использовать MPI_ISend иMPI_IRecv, поэтому каждый процесс периодически проверяет при поиске элементов, отправил ли другой процесс сообщение о том, что он его нашел, и, если он получил сообщение, выходит из цикла.
int search(...) {
int meh,out = 0;
MPI_Request req;
MPI_Irecv(&meh, 1, MPI_INT, MPI_ANY_SOURCE,0, MPI_COMM_WORLD, &req);
for(int i = 0 ; i < max_tries && out == 0; i++){
test element
if (found) return found;
MPI_Test(&req,&fuera,MPI_IGNORE_STATUS);
}
return -1;
}
int main() {
MPI_Init(NULL, NULL);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
int result = search(...)
if(result != -1) {
for (int i = 0; i < world_size; i++) {
MPI_Request req;
int ok = 51914
if (i != world_rank) {
MPI_Isend(&ok,1,MPI_INT,i,0,MPI_COMM_WORLD,&req);
MPI_Request_free(req);
}
}
cout << result << endl;
}
MPI_Finalize();
return 0;
}
Кажется, что работает нормально,но в (редком, но возможном) случае, когда два процесса находят элемент «одновременно», оба они попадают в часть отправки сообщения, отправьте «Кто-то нашел это!»дважды, напечатайте их найденные элементы и после всего этого, не раньше, программа вылетает с ошибкой MPI, сообщающей, что произошла ошибка сегментации.Это работает, и я получаю результат, но это некрасиво, и, чтобы написать некрасивый код только для себя и не показывать его, я бы просто использовал MPI_Abort.
Спасибо за вашу помощь.