Как заставить один процесс прекратить другие? - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь распараллелить с 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.

Спасибо за вашу помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...